Skip to content

Bump SDK pin to 3.4.11; refresh vendored daml-props DAR - #4

Closed
goozang-records wants to merge 1 commit into
OpenZeppelin:mainfrom
goozang-records:bump-sdk-3.4.11
Closed

Bump SDK pin to 3.4.11; refresh vendored daml-props DAR#4
goozang-records wants to merge 1 commit into
OpenZeppelin:mainfrom
goozang-records:bump-sdk-3.4.11

Conversation

@goozang-records

Copy link
Copy Markdown
Contributor

Summary

  • simple-token/daml.yaml and simple-token-test/daml.yaml bumped to sdk-version: 3.4.11.
  • Forward-looking docs updated to match: README.md (Prerequisites), docs/SCOPE.md (Mission), docs/PLAN.md (current state + version-pinning section).
  • dars/daml-props-0.1.0.dar rebuilt from daml-props at SDK 3.4.11.

Historical records intentionally left at 3.4.10

  • docs/AUDIT.md — audit results from the prior audit pass.
  • docs/PLAN.md "Step 1 ✅ COMPLETE" — records the original creation at 3.4.10.

Coordinating PR

The rebuilt dars/daml-props-0.1.0.dar is from OpenZeppelin/daml-props#1. Merge this after that PR lands, or accept the DAR as-built for now.

Verification

Built and tested locally on 2026-05-18 with OpenJDK 21.0.11 / DPM SDK 3.4.11:

  • simple-token dpm build — clean
  • simple-token-test dpm test — 42/42 ok, 0 failures

Test plan

  • CI build passes for both packages on 3.4.11
  • CI test suite passes (42/42)
  • Vendored DAR consumed by simple-token-test matches what gets rebuilt from daml-props at HEAD

🤖 Generated with Claude Code

simple-token and simple-token-test daml.yaml manifests move from 3.4.10 to
3.4.11. Forward-looking docs (README.md, docs/SCOPE.md, docs/PLAN.md current
state and version-pinning section) updated to match.
dars/daml-props-0.1.0.dar is rebuilt from daml-props at SDK 3.4.11.

Historical records left at 3.4.10:
- docs/AUDIT.md (audit results from the prior audit pass)
- docs/PLAN.md "Step 1 ✅ COMPLETE" line (records the original creation)

Verified 2026-05-18 on OpenJDK 21.0.11 / DPM SDK 3.4.11:
- simple-token dpm build clean
- simple-token-test dpm test 42/42 ok, 0 failures

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented May 18, 2026

Copy link
Copy Markdown

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@goozang-records

Copy link
Copy Markdown
Contributor Author

I confirm that I have read and hereby agree to the OpenZeppelin Contributor License Agreement

@goozang-records

Copy link
Copy Markdown
Contributor Author

recheck

goozang-records added a commit to goozang-records/canton-token-template that referenced this pull request Jun 7, 2026
…elin#4)

Hardening from the high-effort code review of the AL-10 account-freeze.

#1 Mint-into-frozen via the cold path: Rules_Mint checked freeze at propose
time, but the holding was created later in MintProposal_Accept with no
re-check, so a recipient frozen in the propose→accept window still received
fresh supply. Acceptance now goes THROUGH the factory — new
`Rules_AcceptMintProposal` (recipient-controlled) re-checks `frozenAccounts`
at holding-creation and consumes the proposal. The bare `MintProposal_Accept`
choice is removed (a proposal-side choice cannot read the live factory state
without a Supply→Rules import cycle).

#3 V2 guards checked only the owner principal: `accountPrincipal` resolves to
`account.owner`, so freezing a provider-managed account's acting PROVIDER did
not block flows it authorized. V2 chokepoints (transfer/allocation/settlement)
now check `accountParties` (owner AND provider) — freezing either blocks. This
also factors the per-account party extraction through one helper.

#2 V2 freeze path was untested (all freeze tests drove the V1 interface).
Added: test_freezeBlocksV2BasicTransfer, test_freezeProviderBlocksProviderManaged-
Transfer (freezes the provider, proves #3), test_mintProposalAcceptBlockedWhen-
RecipientFrozen (proves #1). Suite 155 -> 158.

OpenZeppelin#4 "Cannot send nor receive" was overstated: freeze is origination control
(like pause, INV-33) — inbound flows committed before the freeze still
complete; clawing those back is AL-11, not freeze. Reconciled INV-40 (AUDIT),
the assertAccountsNotFrozen / eAccountFrozen comments, ADMIN-LAYER-PLAN §11.3,
and AL-9 §3.

daml-lint unchanged (7 pre-existing unbounded-fields, no new findings). PLAN.md
roadmap row left unstaged (still contended with the parallel AL-8 doc edit).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
goozang-records added a commit to goozang-records/canton-token-template that referenced this pull request Jun 7, 2026
Code-review follow-ups on the AL-11 seizure (none required design input; the
three that do are documented as open design calls).

#1 Separation of duties: two-person control only checked `approver /= proposer`,
not that the BENEFICIARY differs from the officers — an approver could approve a
seizure into their own account. Added `newOwner /= proposer` at propose and
`newOwner /= approver && /= proposer` at approve (`eSeizureBeneficiaryIsOfficer`).

OpenZeppelin#4 Dead code / phantom doc: `Admin_ProposeSeizure`'s comment promised an
approval-time tamper check via `eSeizureHoldingMismatch` that never existed and
never ran, and `seizedOwner` was written-never-read. Reworded the comment (cid
immutability already forces a re-propose on a stale target) and relabelled
`seizedOwner` as audit-only.

#8 Dedup: `TransferPreapproval_ReceiveSeized` was byte-for-byte `MintInto`. Factor
a shared `createViaPreapproval` body; the two remain distinct CHOICES (for the
reconciler's mint-vs-reallocation distinction) but share one implementation.

#2/#3 Docs: documented that `ReceiveSeized` is a root-callable create whose
supply-neutrality is a caller property (the off-ledger D2 reconciler must net the
seizure pair and must not treat a standalone ReceiveSeized as value-neutral), in
ADMIN-LAYER-PLAN §11.4.

#7/#10 Tests: added test_seizeBeneficiaryCannotBeOfficer, ...ForeignHoldingRejected
(cross-registry), ...ForeignPreapprovalRejected (the preapproval.admin guard half),
...ScopedLegalAdmin (instrument-scoped cap, both directions); strengthened the
stale-target test to assert no recovery holding was created. Suite 166 -> 170.

OpenZeppelin#5/OpenZeppelin#6/#9 design calls recorded as TT-Q-011a/b/c (PLAN §17.7): locked-fund seizure,
structural-vs-convention two-person control, court-order onboarding — with
recommendations, for your decision (not blockers).

daml-lint baseline-clean; 170/170 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 20, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants