Commit 1ba870f
fix(shared,client,agent): harden vault crowdfunding flow (#543)
* Lock public endowment recovery to vault/endow scope
* docs(agent): lock NYC vault demo phases
* style(client,agent): format push-blocking files
* docs(agent): rename NYC vault plan hub
* docs(agent): correct vault crowdfunding route scope
* docs(agent): lock vault pilot fixture scope
* docs(agent): promote vault skill lane
* feat(shared,client): add vault campaign route foundation
* feat(shared): add Card Endow proof contracts
* feat(shared,client): add Octant wallet endow flow
* fix(shared,client,agent): harden vault card endow readiness
* docs: refresh vault crowdfunding Linear proof
* fix(client,shared): harden vault Card Endow QA
* fix(agent): harden preview CORS and Fly runtime image
* fix(agent): pin Fly Bun image version
* fix(agent): avoid Fly production lock drift
* fix(agent): include workspace manifests in Fly image
* fix(agent): use production deps in Fly image
* fix(agent): restore Fly build type graph
* fix(agent): include shared runtime exports in Fly image
* fix(agent): copy package node modules in Fly image
* fix(agent): run Fly import check from package cwd
* fix(agent): restore Fly workspace image layout
* fix(agent): slim Fly runtime image
* fix(shared,client,agent): ship vault card endow proof
* fix(agent): allow Green Goods Vercel previews
* fix(agent): reduce Fly build graph
* fix(client,shared): harden vault checkout flow state
* fix(client): stabilize vault checkout flow
* fix(client,shared): stabilize vault checkout layout
* fix(client): keep vaults on editorial shell
* test(client): cover vaults public shell routes
* fix(client,shared): harden vault checkout QA
* fix(shared,client): harden vault checkout presentation
* fix(shared,client): align vault WETH checkout UX
* fix(client,shared): redesign vault endow checkout UX
* fix(shared,client): enable card endow for both vaults
Treat Greenpill NYC and EVMavericks as card-ready from their supplied Octant vault tuples and keep live value movement proof-gated.
* fix(client,shared): repair vault checkout regressions
Repairs regressions in the /vaults Octant endow checkout plus the aligned
UX fixes confirmed with the user.
- Stable surface: one fixed height across every step (desktop dialog,
moderate mobile sheet) so the checkout no longer resizes between steps.
- Freeze the settlement amount at "Continue" so a live ETH/USD price tick
can no longer reset progress or strand an in-flight transaction (the root
cause of the wallet "Submitting…" hang and the card re-submit churn).
- Wallet success: real success screen with explorer link, Fund link and a
Done button that closes the sheet; lifecycle toast re-enabled. The Confirm
button is replaced on success, so a completed endowment cannot be
double-submitted.
- Card path: combine approve + deposit into one "Complete endowment" action
(staged Approving…/Depositing…, retry resumes at deposit), drop the
redundant confirm checkbox; all safety gates preserved.
- Recovery affordance: after ~30s a stuck transaction shows "taking longer"
and unlocks close (no retry) so funds-in-flight are never a dead end.
- Restore the green campaign Endow CTA.
- Campaign cards show an on-chain vault total via a new read-only
useOctantVaultStats hook (no wallet runtime; donor counts are a follow-up).
- New/updated strings in en/es/pt; obsolete card-stage keys removed.
- Tests cover amount-freeze, wallet success/no-double-submit, the combined
card flow, the dropped checkbox, and the stats strip.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(client,shared): declutter vault campaign card
Drop the repetitive "Guardrail" detail row (identical boilerplate across
campaigns) and remove the redundant EditorialDivider between the on-chain
"In vault" stat and the campaign story — the stats band already carries its
own border, so the divider plus the surrounding gap stacked ~49px of dead
whitespace. Story → 24px gap. Removes the now-orphaned card.guardrail i18n
key from en/es/pt (parity preserved); riskNote campaign data is retained in
the model, just no longer surfaced on the card.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(client,shared): refine vaults hero/section copy, drop Vaults from nav
- Hero subtitle: replace the "Wallet Endow and Card Endow open…" mechanics
with purpose-led copy ("Fund public-goods work that keeps giving — your
contribution settles into a dedicated Octant vault, and the position stays
yours.").
- Section subtitle: replace the web3-centric "No wallet connection needed to
browse." with supporter-facing impact copy.
- Remove the Vaults entry from the public SiteHeader nav (the /vaults route
stays reachable directly); drop the now-orphaned public.nav.vaults i18n key.
- Update SiteHeader + display-mode nav tests to the four-item nav, and the
PublicVaults assertion to the new section copy. es/pt translations updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(shared,client): block wallet endow before approving when WETH is short
The Octant vaults pull WETH via transferFrom on deposit. Wallet Endow approved
then deposited WETH with no balance check, so a wallet holding ETH (not WETH)
would approve successfully and then fail the deposit with an opaque simulation
revert. Add a pre-flight WETH balanceOf check in useOctantVaultWalletEndow
before the approval: if the connected wallet holds less than the endow amount,
throw a clear error (reason "insufficientBalance") so no approval transaction
ever fires. The balance read fails open so a flaky RPC can't block a valid
deposit.
Surface a specific "wrap ETH to WETH first" message inline in the checkout
sheet (en/es/pt) instead of the generic wallet error, and suppress the
competing error toast for this reason. Export VaultDepositStageError + reason
type from the barrel; add ERC20_BALANCE_ABI.
Tests: hook test (insufficient WETH -> throws before any sendContractCall),
dialog test (clear message surfaces), and fix the existing two-step deposit
test's read sequence for the new balanceOf call.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(shared,client): route-local vault position management on /vaults
Add /vaults?manage=positions route-local management of Octant V2 Ethereum
WETH vault positions, for both connected-wallet and card/recovered
email-wallet owners. Endow now hands off to in-route position management
instead of /fund.
shared:
- useOctantVaultPositions: owner-agnostic chain-aware reads (balanceOf ->
convertToAssets + maxWithdraw at DEFAULT_WITHDRAW_MAX_LOSS_BPS); active
positions only.
- useOctantVaultWithdraw: connected-wallet write via transaction sender
with chainId threaded; mirrors useOctantVaultWalletEndow.
- octant-vault-card-wallet-cache: localStorage of safe fields only
(recovered wallet, campaign slug, vault address, chainId, timestamp) -
no email/provider/receipt/PII, no URL leakage.
- octantPositions query key + barrel exports.
client:
- VaultManagePositionsPanel: desktop side-sheet / mobile bottom-sheet,
Connected/Card wallet tabs, collapsed->expand->max->amount->review->
confirm withdraw row.
- VaultCardWalletManage (lazy): thirdweb autoConnect session rehydration
(no re-verify after a just-completed endow) with restore-email fallback.
- Vaults wiring: ?manage=positions param, visible Manage positions entry,
endow-success 'Manage vault position' handoff.
- Remove /fund CTAs/copy from vault checkout success and slow states.
i18n: en/es/pt for manage panel + revised checkout copy.
Max button uses locale-independent formatUnits (round-trips through
parseUnits); the old display formatter filled 15 WETH for 1.5 in
comma-decimal locales. Discriminating regression test added (red-green
proven).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(client,shared): replace vault card widget with bridge panel
* fix(shared): raise storybook build heap
* fix(shared,client): implement Octant vault QA fixes
* ci: pin bun version in workflows
* fix(shared,client,agent): harden vault card QA fixes
* fix(shared): harden vault wrap and localize copy
* test(admin): cover viem address mock
* fix(shared,client): finish Octant vault QA
Implement shares-first Octant redeem handling for vault positions, including maxRedeem-based limits, redeem argument construction, WETH proceeds previews, and visible unavailable states. Add the conservative aggregate project-supporting value metric with unavailable/zero/positive coverage.
Refs PRD-441
Refs PRD-587
Refs PRD-589
* feat(client): streamline card endow batch settlement
* fix(shared,client): use Octant redeem signature
* fix(shared,client): enforce card minimum and streamline card endow flow
Card endow QA fixes from manual testing:
- Enforce the $2 Stripe/Coinbase onramp buyer minimum at the amount step
(card method only) with inline error, tile subtitle hint, and a shared
OCTANT_VAULT_CARD_ENDOW_MIN_USD_CENTS constant, instead of failing with
a generic prepare error after checkout opens.
- Remove the redundant "Review card route" step: email verification now
lands directly on the pay screen (2 steps, was 3). Route facts and the
technical WETH details expander move beside the payment CTA. Checkout
locking shifts from screen entry to payment-session-active, so Back
stays available until "Open secure card checkout" is clicked and
returns after a FAILED reset.
- Fix the stranded about:blank checkout tab: noopener/noreferrer in the
window.open features string made the handle null in real browsers, so
the pre-opened tab could never be redirected (test mocks hid this).
Sever opener manually and redirect via location.replace.
- Make the 5s payment-status poll visually silent: background checks no
longer clear statusOutcome/busy upfront, so the pending notice stops
blinking and shifting content every poll cycle. Poll scheduling moves
to the shared useTimeout hook with an explicit re-arm tick, and
provider prepare/status failures are logged instead of swallowed.
- Translate the es/pt fallback-stage eyebrow that locale coverage
flagged as an English-identical value.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(design): regenerate client PWA token audit after card endow refactor
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(shared,client,agent): harden card endow proof gates and recovery
/vaults Card Endow production hardening:
- Three visible donor stages: verify email wallet (1/3), secure card
payment (2/3), vault deposit and proof (3/3); the OTP field renders
only after a code is sent.
- Settlement proof gates before any approve/deposit: the prepared
onramp quote must match the exact chain/WETH/receiver/amount route,
Onramp.status must be COMPLETED with a non-contradicting purchase
tuple, and WETH balanceOf(receiver) must cover the expected amount.
Failures stay route-local and recoverable; approve then deposit
ordering and the inline Step 3 fallback are preserved.
- Pending-funded recovery: once a payment is provably COMPLETED the
safe public tuple (wallet, campaign, vault, chain, token, amount,
status) is cached so /vaults?manage=positions can finish the deposit
later; confirmed shares upgrade the entry. No emails, OTPs, provider
or receipt identifiers are ever cached or placed in URLs.
- Agent proof route now fails closed without server-side verifiers and
reads vault.balanceOf(receiver) on-chain instead of trusting the
client-supplied shareBalance; production wires chain-aware tuple and
share verification through per-chain RPC resolution.
- EVMavericks gains its live /vaults provider-proof entry so the client
Card Endow allowlist and the agent registry stay in lockstep.
- Spanish /vaults strings normalized for missing diacritics; vacuous
txHash null comparison removed (CodeQL).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(design): regenerate client PWA token audit after develop merge
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(plans): record card endow production hardening evidence
Plan-hub follow-up for the /vaults Card Endow hardening shipped in
ca05de9..bfb28a6 on PR 543:
- status.json: productionHardening evidence block (donor flow stages,
settlement proof gates, pending-funded recovery, server-side agent
share proof, provider-proof registry sync, validation runs), two
history entries, and linear.productionHardeningComments mapping the
posted Linear comment IDs (PRD-441/442/443/444).
- plan.todo.md: decision log rows 22-23 and hardening validation items.
- eval.md: AC-8/AC-9/AC-11/AC-11a evidence updated with the 2026-06-12
hardening proof.
Linear updates were comments only; no state changes. plan-hub
linear-sync returns zero warnings.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(agent): add schema-backed Octant vault skill
* chore(agent): remove extracted Octant skill from PR
* refactor(agent): switch public signup to Resend provider
* fix(client): prefetch vault card onramp and buy ETH not USDC
Two QA fixes for the /vaults Octant card endow checkout, both in the
headless Bridge.Onramp panel:
- Prefetch the onramp session when the pay step opens so the secure
checkout link is ready instantly. Removes the about:blank placeholder
tab and the prepare() wait; opening is now a synchronous window.open
from the click gesture. Locking is gated on opening (not on a session
existing), so a prefetched session no longer locks Back prematurely.
- Route the onramp to ETH (Coinbase first, onrampTokenAddress=ETH) so the
donor buys ETH, which Bridge wraps into the vault's WETH, instead of a
USDC intermediate. Destination tuple stays WETH; proof gates intact.
Verified the receiver always settles in WETH via a live prepare() quote
on both providers. 586/586 client tests pass; tsc + oxlint clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(client): drop onramp ETH intermediate that 400s on client Bridge
The prior commit passed onrampTokenAddress=ETH to Bridge.Onramp.prepare to
avoid the USDC step. That param is accepted on the server/secret-key path
but rejected with 400 INVALID_INPUT by the client-scoped (browser client
ID) onramp, so card checkout could not open at all. Remove it and rely on
each provider's native default — Coinbase (primary) onramps to ETH, Stripe
(fallback) to USDC. Restores the pre-regression call shape; the prefetch
and Coinbase-first order are kept.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(client): wrap native ETH to WETH in card endow settlement
Close the gap where card endow stalled at funds_pending if the onramp left
native ETH (not WETH) in the recovered wallet. The pay panel now gates on
combined WETH + native-ETH coverage and reports the ETH shortfall; settlement
prepends a WETH deposit(){value} wrap before approve+deposit inside the
sponsored EIP-7702 batch (one gasless op), with the same wrap in the
sequential fallback guarded against double-wrap on retry. Correct whether
Bridge delivers WETH, native ETH, or a mix; the onramp call and
proof/validators are unchanged.
Tests: 3 new PublicVaults cases (3-tx wrap batch, partial-WETH shortfall,
sequential wrap idempotency); 589/589 client tests pass, tsc + oxlint clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs(plans): park card endow flow, ship wallet-only
2026-06-22 decision after human QA: the card-funded Card Endow flow is built
and saved on this branch but PARKED, not shipping. Ethereum-mainnet card
settlement (~5 min for onramp funds to land) plus onramp KYC and ETH->WETH
wrapping is unviable for the non-crypto-savvy target donors. First /vaults
release ships Wallet Endow only; a viable card flow would target a fast chain
(Arbitrum) but is not committed (reopens 'Arbitrum is context, not target').
Records the decision in plan.todo.md (Decision 24 + 'Card Flow — Parked'
section) and status.json (workflow.cardEndowDisposition + dated notes). No
card code changed; the built flow stays saved on feature/nyc-vault-crowdfunding.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(shared,client): live strategy APY + real pilot copy on /vaults
- Add useOctantVaultStrategyApy + a yearn-v3 yield-source adapter: reads the pilots' inner Yearn V3 vault APR from yDaemon as the strategy's gross/donation-funding rate, degrading to an honest 'unavailable' state (never invents a number). Source recorded in the manifest since the YDS strategy exposes no on-chain getter.
- Render the live source rate and clarify the aggregate project-support metric; add the withdraw-in-full ownership narrative.
- Reserve gas headroom before offering an in-checkout ETH->WETH wrap so a near-empty-ETH wallet can't strand the follow-on approve/deposit.
- Rework campaign cards: funding purpose is the description, 'Where your support goes' replaces recipient-logic mechanics, Manage positions is a text button. Real pilot copy (Greenpill NYC / Decentral Park; EVMavericks fantasy league 12.5% -> Protocol Guild, 87.5% league winnings) across en/es/pt.
- Trim verbose non-rendered manifest metadata.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore(client): regenerate PWA token audit (DesignMD)
Refreshes the generated DesignMD token-usage audit so check:design-generated passes — the committed artifact had drifted from current source line numbers, failing the Design Guardrails gate on PR #543.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(shared,client): remove stale recovery copy
* Tighten vault card layout and copy
* fix(client): adjust vault card story layout
* Remove vault checkout payment-method picker
* fix(shared,client): tighten recovery flow validation
* fix(shared,client): harden vault endow checkout
Keep wallet endow checkout one-step, preserve clean vault routing, and keep in-flight transactions close-locked through slow recovery messaging.
* fix(client): block vault endow in local fork mode
Disable Ethereum Octant Wallet Endow before submit when the local Arbitrum fork runtime is active, so QA sees a clear blocked state instead of a toast-time mutation failure.
* fix(shared,client): scope editorial toast styling
* fix(client): stabilize vault checkout validation layout
* chore: update repo context and cleanup
* Refine vault checkout layout and test expectations
* Clarify vault checkout step labels and recovery copy
* refactor(shared,client): simplify recovery flow
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent f7f221f commit 1ba870f
214 files changed
Lines changed: 24009 additions & 2602 deletions
File tree
- .github/workflows
- .plans
- active
- css-maintainability-polish
- artifacts
- handoffs
- reports
- nyc-vault-crowdfunding
- handoffs
- public-endowment-withdrawal-recovery
- resend-email-signup-migration
- handoffs
- archive/css-maintainability-polish/handoffs
- backlog/design-system-alignment-review
- docs
- docs/builders
- deployments
- packages
- specs
- static/img
- packages
- admin
- public
- src
- __tests__
- components
- routing
- views
- components
- Garden
- Layout
- views
- Actions
- Community
- Garden
- components
- Hub
- agent
- src
- __tests__
- api
- services
- client
- src
- __tests__
- components
- manifest
- routes
- views
- components/Public
- content
- modules/webmcp
- routes
- styles
- views/Public
- vite
- contracts/src/interfaces
- scripts
- tests/specs
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
303 | 303 | | |
304 | 304 | | |
305 | 305 | | |
306 | | - | |
| 306 | + | |
307 | 307 | | |
308 | 308 | | |
309 | 309 | | |
| |||
326 | 326 | | |
327 | 327 | | |
328 | 328 | | |
329 | | - | |
330 | | - | |
331 | | - | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
332 | 334 | | |
333 | 335 | | |
334 | 336 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| |||
312 | 312 | | |
313 | 313 | | |
314 | 314 | | |
315 | | - | |
316 | | - | |
317 | | - | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
318 | 320 | | |
319 | 321 | | |
320 | 322 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | | - | |
| 72 | + | |
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| |||
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
99 | | - | |
| 99 | + | |
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
| |||
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
139 | | - | |
| 139 | + | |
140 | 140 | | |
141 | 141 | | |
142 | 142 | | |
| |||
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
174 | | - | |
| 174 | + | |
175 | 175 | | |
176 | 176 | | |
177 | 177 | | |
| |||
236 | 236 | | |
237 | 237 | | |
238 | 238 | | |
239 | | - | |
| 239 | + | |
240 | 240 | | |
241 | 241 | | |
242 | 242 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
| 48 | + | |
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
| |||
74 | 74 | | |
75 | 75 | | |
76 | 76 | | |
77 | | - | |
| 77 | + | |
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | | - | |
| 72 | + | |
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| |||
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
99 | | - | |
| 99 | + | |
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
| |||
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
140 | | - | |
| 140 | + | |
141 | 141 | | |
142 | 142 | | |
143 | 143 | | |
| |||
173 | 173 | | |
174 | 174 | | |
175 | 175 | | |
176 | | - | |
| 176 | + | |
177 | 177 | | |
178 | 178 | | |
179 | 179 | | |
| |||
238 | 238 | | |
239 | 239 | | |
240 | 240 | | |
241 | | - | |
| 241 | + | |
242 | 242 | | |
243 | 243 | | |
244 | 244 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
65 | | - | |
| 65 | + | |
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| |||
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
99 | | - | |
| 99 | + | |
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
| |||
134 | 134 | | |
135 | 135 | | |
136 | 136 | | |
137 | | - | |
| 137 | + | |
138 | 138 | | |
139 | 139 | | |
140 | 140 | | |
| |||
230 | 230 | | |
231 | 231 | | |
232 | 232 | | |
233 | | - | |
| 233 | + | |
234 | 234 | | |
235 | 235 | | |
236 | 236 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
97 | | - | |
| 97 | + | |
98 | 98 | | |
99 | 99 | | |
100 | 100 | | |
| |||
130 | 130 | | |
131 | 131 | | |
132 | 132 | | |
133 | | - | |
| 133 | + | |
134 | 134 | | |
135 | 135 | | |
136 | 136 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
| 48 | + | |
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
50 | | - | |
| 50 | + | |
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | | - | |
| 100 | + | |
101 | 101 | | |
102 | 102 | | |
103 | 103 | | |
| |||
0 commit comments