Essential Smart Contract Addresses for Token Owners and Agents
Deploying an ERC3643 Token involves the deployment of multiple smart contracts.
Configuring the compliance modules requires linking the token to these contracts.
The goal of this guide is to help you identify and locate all the relevant smart contract and module addresses associated with your token.
Main ERC3643 Contracts
An ERC3643 token consists of the following core contracts:
- Token smart contract
- Compliance contract
- Compliance modules (array)
- Identity Registry
- Identity Registry Storage
- Trusted Issuer Registry
- Claim Topics Registry
1. Getting the Token Smart Contract Address
In the Servicing section of the Dashboard, you can find your Token Smart Contract Address.
Refer to the screenshot below for guidance.
Note: In this example, the token is deployed on Base Sepolia.
2. Using a Blockchain Explorer
For this example, we’ll use BaseScan (a Base blockchain explorer).
- Open your token contract on BaseScan.
- Access the Contract tab.
- Perform a Proxy contract verification (if not done already)
- In the contract tab, select the Is this a Proxy? option
- Once there click on Verify
- And Save the changes
- In the contract tab, select the Is this a Proxy? option
- Click “Read as Proxy”.
3. Getting the Compliance Contract Address
- Under “Read as Proxy”, call the compliance method.
- This will return the Compliance Contract Address.
Next:
- Open the Compliance contract.
- Go to the Contract tab.
- Click “Read as Proxy”.
- Call the getModules method — this returns an array of compliance modules linked to your token.
4. Compliance Modules
Compliance modules are smart contracts deployed on the blockchain.
They can be added or linked to your Compliance contract to extend functionality.
Below is the list of available modules and their addresses:
Module | Proxy Name | Version | Proxy Address | Implementation Address |
MaxBalanceModule.sol | Max_Balance_Module_Proxy | v4.1.3 | 0x888490c9f4a5c1990f4cf9d0d6bf50fcaf69ed1c | 0x2FE09BFF27B033d61aae6B8d1f57df78b34BdEc4 |
SupplyLimitModule.sol | Supply_Limit_Module_Proxy | v4.1.3 | 0x1f2c9bf5c7ca4b2b5f84fc2da8bffe8f7bb8c699 | 0x0d40363a2e81d8156b2a79a4a18e279bFf6F511C |
TimeTransfersLimitsModule.sol | Time_Transfers_Limits_Module_Proxy | v4.1.3 | 0xBCcf25d1165ea10E1337336945536a4626Be1572 | 0xE655EC664B310aEb02AE7b9e1120489Bf1a90408 |
CountryRestrictModule.sol | Country_Restrict_Module_Proxy | v4.1.3 | 0xa566f27044FdB88b3375318bBF317B60c81fF6c0 | 0xfDAD1f1A7a64Af2db51F55BDbD5888E382d9Ca9F |
CountryAllowModule.sol | Country_Allow_Module_Proxy | v4.1.3 | 0x4188569d68314670274c8Bc2cC25d93f2C1aAFDf | 0x00808f5FD4488E5A345a6F44E7db63F089f52b0C |
TransferFeesModule.sol | Transfer_Fees_Module_Proxy | v4.1.3 | 0x31C723370a134712D71190AEa9Ca7e953f19c0a9 | 0x5a7c6a02612ab27e0943746d35103212ac5c6fae |
TransferRestrictModule.sol | Transfer_Restrict_Module_Proxy | v4.1.3 | 0x632E28d0ae959A3dF5782a865c3912dc0b795a33 | 0x520D655cc8375E530A37Eaae5727999DCb38b005 |
InvestorCountryCapModule.sol | Investor_Country_Cap_Proxy | v4.1.6 | 0x53BD3A4fD4dC4Ff66abA2412EA21A05b6a2F46B9 | 0x44f365c09b9747C80C0c3d8D47cB6D9018127480 |
MinTransferByCountryModule.sol | Min_Transfer_By_Country_Proxy | v4.1.6 | 0x89DB8Dc4f4D7CBAcf27156F54f7A14175B7637B7 | 0xcD0ddcA7bF9fc0E32eED1795E381E74e76FC9F0D |
InitialLockupPeriodModule.sol | Initial_Lockup_Period_Module_Proxy | v4.1.6 | 0x6c6e69a102cfA8EDBbEf0008c50A3a77BBf972D0 | 0x49E68dA0707F549FF087f11FC22584C1308dcBB0 |
These addresses are available across our supported Production and Testing networks.
5. Example: Checking Linked Modules
By calling getModules on your Compliance contract and comparing with the list above, you can identify which modules are active.
In our example, the token has the MaxBalanceModule and CountryRestrictModule linked.
6. Retrieving Registry Contract Addresses
Go back to your Token contract, read it as a proxy, and call the following methods to retrieve the related contract addresses:
From the Token contract, call identityRegistry() to obtain the Identity Registry contract address.
Open the Identity Registry contract (on the explorer) and use Read as Proxy (verify proxy if needed). From the Identity Registry contract call:
- identityStorage() → Identity Registry Storage contract address
- issuerRegistry() → Trusted Issuer Registry contract address
- topicsRegistry() → Claim Topics Registry contract address