Repository navigation
v3.3.0-rc4
Note: This version has not been audited.
Main theme: no functional change to the token. This release documents the breaking changes and the upgrade path from v3.2.0, reworks the RuleEngine integration documentation, adds tests that pin the RuleEngine dispatch and the v3.2.0 → v3.3.0 upgrade, and upgrades OpenZeppelin to v5.7.0.
Smart contract
Changed
HolderListModuleusesEnumerableSet.posinstead ofEnumerableSet.at, deprecated in OpenZeppelin 5.7.0 because its name clashes with a future Solidity keyword.atonly forwards topos: no behaviour change.IRuleEngine.transferredNatSpec (comments only): documents which overload the token calls for each operation since v3.3.0 (the 3-argument one is inherited fromIERC3643IComplianceContract), and that mint, burn and the minter transfer used the 3-argument overload up to v3.2.0.- Deployed bytecode size of every deployment variant is unchanged.
Added (test mocks only)
contracts/mocks/upgrade/: examplename/symbolmigration for proxies upgraded from v3.2.0 (CMTATV33TokenAttributeMigration,CMTATStandardUpgradeableV33MigrationMock,CMTATUpgradeableSnapshotV33MigrationMock). Not audited and not part of the release;migrateFromV32()has no access control and must be called in the upgrade transaction.SnapshotEngineRecorderMock: countsoperateOnTransfercallbacks.
Testing
Added
- Upgrade test from a real v3.2.0 proxy (
test/proxy/general/UpgradeFromV320.test.js, 8 tests). The v3.2.0CMTATUpgradeableandDocumentEngineMockbytecode, compiled from the tag with its own locked dependencies, is stored intest/proxy/general/fixtures/v3.2.0. It checks that a plain upgrade emptiesname/symbol, that the example migration restores them and clears the legacy slots, that the rest of the state is preserved, that documents of the old DocumentEngine are no longer returned, and that the Standard variant stops calling the SnapshotEngine while the Snapshot variant keeps it. New example mocks (not audited):CMTATV33TokenAttributeMigration,CMTATStandardUpgradeableV33MigrationMock,CMTATUpgradeableSnapshotV33MigrationMock(contracts/mocks/upgrade/) andSnapshotEngineRecorderMock. - RuleEngine dispatch tests (
RuleEngineSpenderDispatchCommon.js, standard and proxy) now pin the 4-argumenttransferredrouting, with the operator asspender, formint,batchMint,burn,batchBurn,burnFrom, selfburn(uint256),crosschainMint,crosschainBurnand the minterbatchTransfer(9 new tests per suite). The suite header comment andRuleEngineSpenderRecorderMockNatSpec, which still described mint / burn on the 3-argument overload, were corrected.
Changed
- The full suite runs 6,134 tests (87 pending), all passing; test counts updated in
README.md,doc/README.md,CLAUDE.mdandAGENTS.md.
Documentation
Added
- [doc/technical/breaking-changes.md](./doc/technical/breaking-changes.md): breaking changes (ERC-7201 storage and external engines) from v3.2.0 and from the audited v3.0.0 to v3.3.0, with migration steps and checklists. It includes two items not listed before: SnapshotEngine removed from the Standard, UUPS, ERC-1363, ERC-7551 and Allowlist variants, and mint / burn reaching the RuleEngine on the 4-argument
transferred. - CHANGELOG: new
breaking changecategory, the3.3.0summary entry, and Breaking change sections for v3.3.0, v3.2.0, v3.1.0 and v3.0.0. doc/technical/ruleengine-integration.md: RuleEngine breaking changes per release (v2.3.0, v3.0.0 – v3.3.0).doc/technical/upgradeable.md: warning that upgrading a deployed token is risky and not recommended unless necessary, and an "Upgrading an existing proxy to v3.3.0" section.doc/technical/terms.md: analysis of why the Light variant has noterms(missing since v3.0.0) and plan to add a coreTermsModulein v3.4.0.- Security: [Olympix BugPoCer](./doc/security/tools/BugPoCer) scan report and maintainer feedback (scan of v3.2.0, triaged on v3.3.0-rc2 / rc3, fix commit per finding), added to [AUDIT.md](./doc/security/AUDIT.md) and to the security-tools table of
doc/README.md.
Changed
- RuleEngine overload routing documented where engine authors look first:
IRuleEngine.transferredNatSpec (which overload is called for each operation), theIRuleEnginesection ofdoc/README.mdandruleengine-integration.md(both overloads are mandatory; route them to one internal function). - RuleEngine chapter of
doc/README.mdreworked: per-entrypointtransferreddispatch table,forcedTransferbypass,msg.senderrequirement for the token check, trust and reentrancy invariant for the unguarded variants,IRuleEngineinterface-id convention, restriction-code reservation, caveats for rules set directly on the token, updated RuleEngine / Rules version table (RuleEngine v3.0.0-rc6, Rules v0.6.0, audit planned) and corrected Rules table. Absolute local links removed fromerc-3643-implementation.md; RuleEngine flow schema regenerated; test count updated to 6,134. doc/technical/ruleengine-integration.mdanddoc/modules/controllers/validationRuleEngine.md: trust model for the variants without reentrancy guard (the RuleEngine, its rules and every contract they call are trusted; stateful rules may write their own storage but must not make state-changing external calls outside the trusted set; a revertingviewcall still blocks transfers), and the token check in the engine must usemsg.sender.- Light variant: every page describing it now states that it has no
terms, a mandatory CMTAT framework functionality (planned for v3.4.0).tokenIdis documented as not mandatory in the CMTAT framework (doc/technical/cmtat-specification-analyse.md,doc/README.md). - Absolute local links replaced by repository-relative links in
doc/technical/ruleengine-integration.mdanddoc/technical/erc-3643-implementation.md; RuleEngine flow schema (engine-ruleengine-base) regenerated with the 3-argument / 4-argument dispatch. 3.3.0 - rc0andrc2entries: added pointers to the breaking changes (RuleEngine operator propagation,name/symbolmigration).
Dependencies
- OpenZeppelin contracts and contracts-upgradeable
[v5.7.0](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.7.0)(npm packages and thelib/openzeppelin-contracts-upgradeablesubmodule, previouslyv5.6.1). Every OpenZeppelin file CMTAT imports was compared with 5.6.1. The only API change used by CMTAT is the deprecation ofEnumerableSet.at(its name clashes with a future Solidity keyword):HolderListModulenow calls the equivalentpos. The 5.7.0EIP712change (no storage fallback forname/versionlonger than 31 bytes) does not apply: CMTAT usesEIP712Upgradeable(throughERC20PermitUpgradeable), which keeps them in storage and only changed in comments. No change to the OpenZeppelin ERC-7201 storage used by CMTAT, and no change in deployed bytecode size. The remaining compiler warnings"at" will be promoted to keywordcome from OpenZeppelin's ownEnumerableSet.sol. lib/openzeppelin-contracts-upgradeablesubmodule moved tov5.7.0, with its nestedlib/openzeppelin-contractsaligned to the pinned commit.- Lockfile refresh for Dependabot #400 – #404:
axios1.20.0,ip-address10.7.3,js-yaml4.3.2 / 3.15.2,brace-expansion1.1.21. ThenpmdevDependency moves to 12.2.0 (bundledtar7.5.22); #392 – #394 were already covered by thenpm12 bump of rc3.