From a38407344ddcabf40442127d94a8a9abd9d27779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 6 Oct 2026 10:23:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(=E9=92=B1=E5=8C=85store):=20?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E4=BD=99=E9=A2=9D=E5=BF=AB=E7=85=A7=E6=97=B6?= =?UTF-8?q?=E7=A9=BA=E5=80=BC=E5=AE=89=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - captureWalletBalanceSnapshot 在 owner 不匹配时返回 null,applyWalletBalanceSnapshot 之前会直接解引用 - applyWalletBalanceSnapshot 入参放宽为 ProfileWalletBalanceSnapshot | null,null 直接返回 false - 单测去掉非空断言,锁住「他人 owner 的快照捕获为 null 且必须被拒绝」 --- .../shared/src/stores/createProfileWalletStore.test.ts | 2 +- packages/shared/src/stores/createProfileWalletStore.ts | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/shared/src/stores/createProfileWalletStore.test.ts b/packages/shared/src/stores/createProfileWalletStore.test.ts index 88c5da148..daba9d20f 100644 --- a/packages/shared/src/stores/createProfileWalletStore.test.ts +++ b/packages/shared/src/stores/createProfileWalletStore.test.ts @@ -296,7 +296,7 @@ describe('createProfileWalletStore', () => { const snapshot = store.getState().captureWalletBalanceSnapshot('user-b'); expect( - store.getState().applyWalletBalanceSnapshot(snapshot!, balance(37)), + store.getState().applyWalletBalanceSnapshot(snapshot, balance(37)), ).toBe(false); expect(store.getState().mudPointBalance).toBeNull(); }); diff --git a/packages/shared/src/stores/createProfileWalletStore.ts b/packages/shared/src/stores/createProfileWalletStore.ts index 211ba8800..c63c032c6 100644 --- a/packages/shared/src/stores/createProfileWalletStore.ts +++ b/packages/shared/src/stores/createProfileWalletStore.ts @@ -35,7 +35,7 @@ export type ProfileWalletStore = { ownerUserId: string, ) => ProfileWalletBalanceSnapshot | null; applyWalletBalanceSnapshot: ( - snapshot: ProfileWalletBalanceSnapshot, + snapshot: ProfileWalletBalanceSnapshot | null, balance: ProfileMudPointBalance, ) => boolean; onWalletBalanceMayHaveChanged: () => Promise; @@ -117,6 +117,11 @@ export function createProfileWalletStore( }; }, applyWalletBalanceSnapshot: (snapshot, balance) => { + // captureWalletBalanceSnapshot 在 owner 不匹配时返回 null;null 本身即「快照已失效」, + // 直接拒绝,避免把 capture 的可空返回喂回 apply 时解引用崩溃。 + if (!snapshot) { + return false; + } if ( get().ownerUserId !== snapshot.ownerUserId || ownerVersion !== snapshot.ownerVersion ||