Skip to content

docs(b20): align Tokenize Assets and Stablecoin guides with base-std guides - #1999

Open
soheimam wants to merge 8 commits into
masterfrom
feat/b20-guides
Open

soheimam wants to merge 8 commits into
masterfrom
feat/b20-guides

Conversation

@soheimam

Copy link
Copy Markdown
Contributor

What changed? Why?

Aligns the Build on Base B20 guides (Tokenize Assets, Issue Stablecoins) with the guides in base/base-std/docs/guides. Principle: Build on Base keeps its page shape (intro, Vibenet demo, verified TS/Solidity/CLI code group, See Also); base-std supplies the content (Before You Start, steps, verify signal, check-order error tables). Language follows the Legal B20 guidance doc: asset-agnostic framing, stock token as one worked example, no "security"/"equity" phrasing, multiplier framing retained.

Pages

  • Recover Funds: rewritten around seizeWithMemo (the base-std path) instead of deprecated burnBlocked + mint. totalSupply unchanged, Seized event, memo for case reference.
  • Cancel Blocked Units → Seize and Cancel Units: seize to treasury, then burnWithMemo. Redirect added.
  • Announce a Distribution → Announce a Corporate Action: asset-agnostic intro, base-std four scenarios (additional issuance, multiplier update, treasury burn, notice). Dividend remains the worked example. Redirect added.
  • Apply a Multiplier: title kept per Legal; adds Before You Start, the one-pending-update lifecycle, effectiveAt() > block.timestamp rule, pause guidance as a note.
  • New: Restrict Who Can Initiate Transfers (TRANSFER_EXECUTOR_POLICY), transfer agent as one example. No demo flow exists for it.
  • Block an Account: new section on attaching the blocklist to SEIZE_EXEMPT_POLICY so a hold is also recoverable.
  • Cobalt warning on both seize pages (live on Vibenet, mainnet after the hard fork).

Correctness

  • SEIZE_HOLDER_POLICYSEIZE_EXEMPT_POLICY (post-Cobalt name) in concepts/policies.mdx, reference/constants.mdx, reference/errors.mdx, with the correct hash. Note: the upstream base-std seize guide still uses the old name.

Demos (only the two flows whose pages changed)

  • Vibenet engine v4: seize helper, SEIZE_* scopes, SEIZE_ROLE, AccountNotSeizable/InvalidReceiver/InvalidSender decoding.
  • Asset cancel flow: Fund → Block → Seize → Cancel. Stablecoin recover flow: Setup → Seize → Reissue. Live and offline mock paths both updated. All other flows untouched.

Samples and tooling

  • New verified fixtures stock-seize-*, stock-executor-*; stablecoin-recover-* rewritten. stock-cancel-* removed.
  • base-std pin moved from be6d045 to 1505323 in verify-doc-samples.sh and page notes (the old pin does not contain seizeWithMemo; the previously vendored lib did not compile the existing multiplier sample either).
  • Nav, redirects, base-std sync route-table.json (renamed pages plus a rule for restricting-transfer-initiators.md) and its test updated.

Notes to reviewers

  • Legal: titles and prose were checked against the B20 language guidance. "Schedule a Stock Split" was deliberately not adopted as a title; the multiplier framing stays. "Corporate action" is used only with asset-agnostic context and multiple examples, per that guidance.
  • The Asset "cancel" and Stablecoin "recover" demo flows should be clicked through on the preview; they compile and the engine unit test passes, but I could not exercise the live path headlessly. A live Vibenet B20 token was confirmed to answer SEIZE_ROLE() and SEIZE_EXEMPT_POLICY().
  • SEIZE_ROLE is now granted at demo token creation for all flows (one extra role grant); happy to narrow it to the two seize flows if preferred.
  • Live-evidence hashes in verification-manifest.json still reference the earlier Base Sepolia runs; regenerating needs a funded key.
  • One pre-existing failure in base-std-routing.test.mjs (errors.mdevents.mdx expectation) exists on master and is unrelated.

How has it been tested?

  • node scripts/verify-doc-samples.js: 73 samples in sync.
  • npx tsc --noEmit (typescript samples) and forge build (solidity samples, base-std@1505323): clean.
  • node scripts/test-vibenet-engine.mjs: pass.
  • npm test: 85 pass, 0 fail.
  • JSX snippets compiled with esbuild; every internal link and nav entry in the changed sections resolves to a file.

Screenshots

Pending: preview build of the changed pages.

Generated with Toshi

…guides

- Rewrite Recover Funds around seizeWithMemo; replace Cancel Blocked Units
  with Seize and Cancel Units (seize to treasury, then burnWithMemo)
- Rename Announce a Distribution to Announce a Corporate Action and adopt
  the base-std four-scenario structure (issuance, multiplier, burn, notice)
- Restructure Apply a Multiplier with Before You Start, schedule lifecycle,
  and integrator rules from base-std; keep multiplier framing per Legal
- Add Restrict Who Can Initiate Transfers (TRANSFER_EXECUTOR_POLICY)
- Block an Account: attach the blocklist to SEIZE_EXEMPT_POLICY
- Fix stale SEIZE_HOLDER_POLICY references (renamed SEIZE_EXEMPT_POLICY)
- Vibenet engine v4: seize helper, SEIZE scopes/role, new error names;
  Asset cancel and Stablecoin recover demo flows now use seize
- Verified samples: new seize/executor fixtures, base-std pin -> 1505323
- Redirects, nav, base-std sync route table and tests updated
@mintlify

mintlify Bot commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
base 🟢 Ready View Preview Sep 23, 2026, 4:50 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

@cb-heimdall

Copy link
Copy Markdown
Collaborator

🟡 Heimdall Review Status

Requirement Status More Info
Reviews 🟡 0/1
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 1
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 1
1
1 if commit is unverified 0
Sum 1

- Apply a Multiplier: instant override emits UIMultiplierUpdated with
  block.timestamp; list multiplier() and scaledBalanceOf() aliases
- Announce a Corporate Action: scope intro to B20 Asset; note burnBlocked
  is deprecated for treasury burns
- Seize and Cancel Units / Recover Funds: add InvalidSender, PolicyNotFound,
  Unauthorized errors; note seize is unaffected by other pauses; document
  seizing a balance held at the token's own address

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
soheimam and others added 3 commits September 23, 2026 16:35
… Change to Holders

Keep the live URL so no redirect is needed, and use an asset-neutral title
that covers all four announce scenarios (issuance, multiplier update,
treasury burn, notice). Refresh agents.md and llms.txt.

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Toshi <toshi-noreply@coinbase.com>

# Conflicts:
#	docs/llms-full.txt
#	docs/llms.txt

This branch was successfully deployed

1 active deployment
staging - docs 28a8f72e Deployed Sep 23, 2026 by mintlify[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants