Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
f42ed1e
feat(rules): add RuleChainlinkPoR gating mints on a Chainlink Proof o…
rya-sge Aug 10, 2026
c3579a7
fix(chainlink-por): read feed decimals live instead of caching to pre…
rya-sge Aug 10, 2026
067eba3
fix(chainlink-por): validate tokenContract at config and degrade to…
rya-sge Aug 10, 2026
9ec0f38
docs(chainlink-por): document the one-instance-per-token requirement …
rya-sge Aug 10, 2026
c8c3480
fix(max-total-supply): validate tokenContract at config and degrade t…
rya-sge Aug 10, 2026
6dc3a0a
refactor(rules): drop unreachable read-path code-length guards, docu…
rya-sge Aug 10, 2026
74eb751
Update gitignore
rya-sge Aug 10, 2026
5ae7dd6
Update specification + technical
rya-sge Aug 10, 2026
0f1d6c9
feat(registry): add IdentityRegistryWhitelist, a whitelist-backed ER…
rya-sge Aug 10, 2026
17e0695
refactor(registry): drop identity state from IdentityRegistryWhiteli…
rya-sge Aug 10, 2026
ccb5017
refactor(registry): back IdentityRegistryWhitelist with RuleAddressSe…
rya-sge Aug 10, 2026
79dd13a
refactor(registry): drop keyHasPurpose and its reverse index, restori…
rya-sge Aug 10, 2026
e76b70e
docs(registry): scope the missing-country limitation to custom compli…
rya-sge Aug 11, 2026
f97926c
test(erc3643): add real-Token integration via a dedicated 0.8.30 prof…
rya-sge Aug 11, 2026
ae64ce5
Update version t0 v0.5.0 + update remapping
rya-sge Aug 11, 2026
3b23be0
feat(rules): add RuleReceiverWhitelist reproducing ERC-3643 receiver…
rya-sge Aug 11, 2026
ed01d4f
Update gitignore
rya-sge Aug 11, 2026
f531660
Add doc for RuleReceiverWhitelist
rya-sge Aug 11, 2026
533cbee
style: order functions per Solidity style guide and add NatSpec acro…
rya-sge Aug 11, 2026
cb8f0de
Update surya report
rya-sge Aug 11, 2026
d9aeee9
fix(rules): move address-list roles to RuleAddressSetRolesStorage so …
rya-sge Aug 11, 2026
0e5f1fb
feat(registry): implement IERC3643Version on IdentityRegistryWhitelis…
rya-sge Aug 11, 2026
0f33ed3
fix(docs): correct RuleSanctionsList naming across doc/tests and repl…
rya-sge Aug 11, 2026
230714b
fix(scripts): use an explicit relative path in the surya scripts and …
rya-sge Aug 11, 2026
a79edf1
Remove OpenZeppelin v4
rya-sge Aug 11, 2026
a401773
Add aderyn report + feat(chainlink-por): split feed-failure code 77 …
rya-sge Aug 12, 2026
5ed2727
docs: state that RuleChainlinkPoR is ERC-20 only and fix the README …
rya-sge Aug 12, 2026
ece992f
perf(whitelist-wrapper): replace the per-child result rescan with an …
rya-sge Aug 12, 2026
bf5bd76
perf(conditional-transfer): keep the new approval count in a local in…
rya-sge Aug 12, 2026
8051d6c
perf(sanctions): cache the oracle address in a local instead of re-re…
rya-sge Aug 12, 2026
8d60b59
refactor: mark every internal function virtual, per the project conve…
rya-sge Aug 12, 2026
5ebbe43
refactor: make both canTransfer overloads virtual on the core rule b…
rya-sge Aug 12, 2026
fad06a7
refactor: mark every public mutating function virtual and extend the …
rya-sge Aug 12, 2026
b10021e
fix(sanctions): never screen the zero-address mint/burn sentinel agai…
rya-sge Aug 12, 2026
c6ae672
perf(identity-registry): cache the registry address in a local instea…
rya-sge Aug 12, 2026
d354ae1
feat(events): announce every configuration value assigned at deployme…
rya-sge Aug 12, 2026
f50ac1c
fix(ci): scope the ONCHAINID remapping to the erc3643 profile so hard…
rya-sge Aug 12, 2026
63a9548
fix(sanctions): always delegate transferFrom to the direct restrictio…
rya-sge Aug 12, 2026
8900a81
docs: correct the batch-operation convention — address(0) reverts on …
rya-sge Aug 12, 2026
44c6681
refactor(identity-registry): drop the unreachable to != address(0) t…
rya-sge Aug 12, 2026
aa7a3a6
docs(mint-allowance): document that the hardcoded allowed view propag…
rya-sge Aug 12, 2026
bd3b6a7
refactor(address-set): extract the batch add/remove loops into Addres…
rya-sge Aug 12, 2026
e4dd438
refactor(supply): share the revert-free totalSupply read via a statel…
rya-sge Aug 12, 2026
e76a59b
refactor(whitelist-wrapper): make isVerified delegate to _isListedInA…
rya-sge Aug 12, 2026
b32c74d
refactor(whitelist): move the checkSpender setter machinery into Rul…
rya-sge Aug 12, 2026
55131de
perf(address-set): use EnumerableSet's add/remove result instead of …
rya-sge Aug 12, 2026
636ecf6
chore: drop an empty section banner and make version() pure, tighteni…
rya-sge Aug 12, 2026
9c68056
docs(conditional-transfer): document the approval-key preimage and c…
rya-sge Aug 12, 2026
681b183
docs: publish the code-quality review as doc/security/audits/tools/v0…
rya-sge Aug 12, 2026
89f0120
Update changelog
rya-sge Aug 12, 2026
998ead3
test(identity): cover the CMTAT → RuleEngine → RuleIdentityRegistry →…
rya-sge Aug 12, 2026
17d6eb8
feat(events): report added/removed and skipped counts on batch list …
rya-sge Aug 12, 2026
e795daf
test(identity): cover RuleIdentityRegistry against the reference ERC-…
rya-sge Aug 12, 2026
d0a31b6
feat(script): add a three-rule CMTAT deployment (blacklist, sanction…
rya-sge Aug 12, 2026
6b6b196
Run forge fmt
rya-sge Aug 12, 2026
fd66eec
update surya doc
rya-sge Aug 12, 2026
228156f
Improve doc
rya-sge Aug 12, 2026
026f1fa
fix(script): pass deployer explicitly so all four scripts run under f…
rya-sge Aug 12, 2026
52bd71b
Improve doc + script workflow
rya-sge Aug 12, 2026
e0b2623
docs(audit): move the deployment-script review to doc/security/audi…
rya-sge Aug 12, 2026
47a215b
docs(script): add doc/technical/DEPLOYMENT_SCRIPTS.md covering the fo…
rya-sge Aug 12, 2026
89e5918
Update doc
rya-sge Aug 12, 2026
34cdb0b
docs: replace the README ASCII architecture block with a PlantUML top…
rya-sge Aug 12, 2026
84a3082
docs: document the ERC-3643 integration surface (compliance slot, i…
rya-sge Aug 12, 2026
f50f235
docs: tighten three positioning phrases in the root README
rya-sge Aug 12, 2026
08341cc
docs(audit): re-run Slither and Aderyn for v0.5.0, correcting the unu…
rya-sge Aug 13, 2026
a40dd49
Update changelog for v0.5.0
rya-sge Aug 13, 2026
c5cb8ff
docs(audit): record the C-4 commit and narrow its test-cleanup claim…
rya-sge Aug 13, 2026
3cda1c8
test(whitelist): make the RemoveAddress emit a real assertion and dr…
rya-sge Aug 13, 2026
ee3259d
test(ownable2step): cover the conditional-transfer binding and appr…
rya-sge Aug 13, 2026
27a048a
docs: correct the identity-verification diagram and prose — the rul…
rya-sge Aug 13, 2026
664f3f2
docs: replace the doc/README drawio schemas with PlantUML diagrams an…
rya-sge Aug 13, 2026
22a24c6
docs: apply the token-decides-the-route framing for identity verifica…
rya-sge Aug 13, 2026
d3e18cd
chore(deps): bump CMTAT to v3.3.0-rc3 and document the new zero-value…
rya-sge Aug 13, 2026
487392b
chore: update the Solidity toolchain to 0.8.36 for Foundry and Hardha…
rya-sge Aug 13, 2026
ba2c73b
chore(deps): bump RuleEngine to v3.0.0-rc5 and OpenZeppelin to v5.7.0…
rya-sge Aug 13, 2026
80c896f
refactor(chainlink-por): extract feed management into ChainlinkPoRFee…
rya-sge Aug 13, 2026
11c1257
feat(max-balance): add RuleMaxBalance capping per-address holdings wi…
rya-sge Aug 13, 2026
d4f70f0
test(max-balance): close the remaining coverage gaps and add the cod…
rya-sge Aug 13, 2026
55d86d0
style: order the max-balance internals per the style guide and replac…
rya-sge Aug 13, 2026
cbe9ba5
docs: split doc/technical into contracts/ and guides/, rewriting all …
rya-sge Aug 13, 2026
3186480
docs: remove technical-doc references from contract comments and mak…
rya-sge Aug 13, 2026
1e662d7
docs(changelog): bring the v0.5.0 entry up to date — four new contrac…
rya-sge Aug 13, 2026
c6e8ba1
docs(surya): regenerate the schema for the 7 new contracts and add t…
rya-sge Aug 13, 2026
0ea924c
docs(audit): re-run Slither and Aderyn for v0.5.0 at solc 0.8.36, tri…
rya-sge Aug 13, 2026
08d94b9
docs: record the zero-value decision for v0.5.0 and correct its scop…
rya-sge Aug 13, 2026
d311a03
Update package
rya-sge Aug 13, 2026
45829d2
efactor(caps): extract TotalSupplyCapManager and BalanceCapManager, i…
rya-sge Aug 14, 2026
84d0716
docs(surya): regenerate the schema for the TotalSupplyCapManager and …
rya-sge Aug 14, 2026
6643d4b
docs(audit): re-run Slither and Aderyn after the cap-manager split, …
rya-sge Aug 14, 2026
868ec93
docs: shorten the BalanceCapManager header and add a NatSpec length …
rya-sge Aug 14, 2026
97fcc92
style: bring every NatSpec block under the 20-line ceiling, cutting …
rya-sge Aug 14, 2026
918da5f
style: bring every NatSpec block under the 20-line ceiling and repair…
rya-sge Aug 14, 2026
6a21ca7
docs: record the NatSpec ceiling pass in the v0.5.0 changelog and cor…
rya-sge Aug 14, 2026
e016487
Update chagnelog
rya-sge Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
27 changes: 27 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,33 @@ jobs:
forge test -vvv
id: test

# The vendored ERC-3643 `Token.sol` pins `pragma solidity 0.8.30` exactly, so it cannot share
# a compilation unit with our 0.8.36. `test/ERC3643Real/**` is in the default profile's `skip`
# list and is built by `[profile.erc3643]` instead, which means the step above does NOT run it.
# Both commands are required — see the Toolchain section of AGENTS.md / CLAUDE.md.
- name: Run Forge tests (ERC-3643 profile)
env:
FOUNDRY_PROFILE: erc3643
run: |
forge test -vvv
id: test-erc3643

# `forge build` compiles the deployment scripts but never executes them, and the unit tests
# call deploy() directly rather than run(), so neither exercises the broadcast context. That
# gap let three scripts revert on every real deployment while CI stayed green
# (CLAUDE_ANALYSIS_SCRIPT.md S-1/S-2). A test cannot cover this: Foundry refuses to combine a prank
# with a broadcast, so `forge script` itself is the only faithful harness. No key or RPC is
# needed -- without --broadcast this is a local simulation.
- name: Run deployment scripts (dry run)
run: |
for s in script/*.s.sol; do
name=$(basename "$s" .s.sol)
echo "::group::$name"
forge script "$s:$name"
echo "::endgroup::"
done
id: scripts

- name: Setup NodeJS 20.5.0
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.4.0
with:
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,9 @@ FEEDBACK.md
*.dtmp



# LibreOffice lock files
.~lock.*#

# Artifacts from the erc3643 Foundry profile
out-erc3643/
9 changes: 9 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,12 @@
[submodule "lib/openzeppelin-contracts-upgradeable"]
path = lib/openzeppelin-contracts-upgradeable
url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
[submodule "lib/ERC-3643"]
path = lib/ERC-3643
url = https://github.com/ERC-3643/ERC-3643/
[submodule "lib/chainlink-doc"]
path = lib/chainlink-doc
url = https://github.com/smartcontractkit/documentation.git
[submodule "lib/chainlink-ace"]
path = lib/chainlink-ace
url = https://github.com/smartcontractkit/chainlink-ace.git
87 changes: 67 additions & 20 deletions AGENTS.md

Large diffs are not rendered by default.

275 changes: 267 additions & 8 deletions CHANGELOG.md

Large diffs are not rendered by default.

87 changes: 67 additions & 20 deletions CLAUDE.md

Large diffs are not rendered by default.

1,775 changes: 138 additions & 1,637 deletions README.md

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions doc/FOUNDRY.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ Here are the settings for [Hardhat](https://hardhat.org) and [Foundry](https://g

- `hardhat.config.js`

- Solidity [v0.8.34](https://docs.soliditylang.org/en/v0.8.34/)
- Solidity [v0.8.36](https://docs.soliditylang.org/en/v0.8.36/)
- EVM version: Prague (Pectra upgrade)
- Optimizer: true, 200 runs

- `foundry.toml`

- Solidity [v0.8.34](https://docs.soliditylang.org/en/v0.8.34/)
- Solidity [v0.8.36](https://docs.soliditylang.org/en/v0.8.36/)
- EVM version: Prague (Pectra upgrade)
- Optimizer: true, 200 runs

Expand All @@ -24,13 +24,13 @@ Here are the settings for [Hardhat](https://hardhat.org) and [Foundry](https://g

- Forge std [v1.12.0](https://github.com/foundry-rs/forge-std/releases/tag/v1.12.0)

- OpenZeppelin Contracts (submodule) [v5.6.1](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.6.1)
- OpenZeppelin Contracts (submodule) [v5.7.0](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.7.0)

- OpenZeppelin Contracts Upgradeable (submodule) [v5.6.1](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/releases/tag/v5.6.1)
- OpenZeppelin Contracts Upgradeable (submodule) [v5.7.0](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/releases/tag/v5.7.0)

- CMTAT [v3.3.0-rc1](https://github.com/CMTA/CMTAT/releases/tag/v3.3.0-rc1)
- CMTAT [v3.3.0-rc3](https://github.com/CMTA/CMTAT/releases/tag/v3.3.0-rc3)

- RuleEngine [v3.0.0-rc4](https://github.com/CMTA/RuleEngine/releases/tag/v3.0.0-rc4)
- RuleEngine [v3.0.0-rc5](https://github.com/CMTA/RuleEngine/releases/tag/v3.0.0-rc5)

## Toolchain installation

Expand Down
2,070 changes: 2,070 additions & 0 deletions doc/README.md

Large diffs are not rendered by default.

Loading
Loading