Nov 12, 9-10 AM (53)
Nov 12, 10-11 AM (32)
Nov 12, 11-12 PM (46)
Nov 12, 12-1 PM (56)
Nov 12, 1-2 PM (48)
Nov 12, 2-3 PM (21)
Nov 12, 3-4 PM (29)
Nov 12, 4-5 PM (59)
Nov 12, 5-6 PM (15)
Nov 12, 6-7 PM (15)
Nov 12, 7-8 PM (16)
Nov 12, 8-9 PM (10)
Nov 12, 9-10 PM (15)
Nov 12, 10-11 PM (33)
Nov 12, 11-12 AM (14)
Nov 13, 12-1 AM (12)
Nov 13, 1-2 AM (8)
Nov 13, 2-3 AM (6)
Nov 13, 3-4 AM (8)
Nov 13, 4-5 AM (2)
Nov 13, 5-6 AM (3)
Nov 13, 6-7 AM (27)
Nov 13, 7-8 AM (28)
Nov 13, 8-9 AM (55)
Nov 13, 9-10 AM (72)
Nov 13, 10-11 AM (54)
Nov 13, 11-12 PM (42)
Nov 13, 12-1 PM (40)
Nov 13, 1-2 PM (109)
Nov 13, 2-3 PM (36)
Nov 13, 3-4 PM (43)
Nov 13, 4-5 PM (27)
Nov 13, 5-6 PM (58)
Nov 13, 6-7 PM (14)
Nov 13, 7-8 PM (14)
Nov 13, 8-9 PM (32)
Nov 13, 9-10 PM (13)
Nov 13, 10-11 PM (23)
Nov 13, 11-12 AM (19)
Nov 14, 12-1 AM (3)
Nov 14, 1-2 AM (3)
Nov 14, 2-3 AM (2)
Nov 14, 3-4 AM (3)
Nov 14, 4-5 AM (26)
Nov 14, 5-6 AM (2)
Nov 14, 6-7 AM (10)
Nov 14, 7-8 AM (11)
Nov 14, 8-9 AM (30)
Nov 14, 9-10 AM (38)
Nov 14, 10-11 AM (49)
Nov 14, 11-12 PM (39)
Nov 14, 12-1 PM (42)
Nov 14, 1-2 PM (31)
Nov 14, 2-3 PM (36)
Nov 14, 3-4 PM (21)
Nov 14, 4-5 PM (18)
Nov 14, 5-6 PM (29)
Nov 14, 6-7 PM (22)
Nov 14, 7-8 PM (14)
Nov 14, 8-9 PM (8)
Nov 14, 9-10 PM (5)
Nov 14, 10-11 PM (31)
Nov 14, 11-12 AM (25)
Nov 15, 12-1 AM (30)
Nov 15, 1-2 AM (7)
Nov 15, 2-3 AM (1)
Nov 15, 3-4 AM (2)
Nov 15, 4-5 AM (0)
Nov 15, 5-6 AM (0)
Nov 15, 6-7 AM (3)
Nov 15, 7-8 AM (2)
Nov 15, 8-9 AM (2)
Nov 15, 9-10 AM (3)
Nov 15, 10-11 AM (3)
Nov 15, 11-12 PM (11)
Nov 15, 12-1 PM (4)
Nov 15, 1-2 PM (0)
Nov 15, 2-3 PM (9)
Nov 15, 3-4 PM (6)
Nov 15, 4-5 PM (1)
Nov 15, 5-6 PM (1)
Nov 15, 6-7 PM (13)
Nov 15, 7-8 PM (11)
Nov 15, 8-9 PM (22)
Nov 15, 9-10 PM (4)
Nov 15, 10-11 PM (19)
Nov 15, 11-12 AM (26)
Nov 16, 12-1 AM (1)
Nov 16, 1-2 AM (2)
Nov 16, 2-3 AM (4)
Nov 16, 3-4 AM (3)
Nov 16, 4-5 AM (1)
Nov 16, 5-6 AM (0)
Nov 16, 6-7 AM (0)
Nov 16, 7-8 AM (0)
Nov 16, 8-9 AM (6)
Nov 16, 9-10 AM (6)
Nov 16, 10-11 AM (1)
Nov 16, 11-12 PM (3)
Nov 16, 12-1 PM (3)
Nov 16, 1-2 PM (6)
Nov 16, 2-3 PM (5)
Nov 16, 3-4 PM (10)
Nov 16, 4-5 PM (4)
Nov 16, 5-6 PM (8)
Nov 16, 6-7 PM (11)
Nov 16, 7-8 PM (14)
Nov 16, 8-9 PM (4)
Nov 16, 9-10 PM (9)
Nov 16, 10-11 PM (38)
Nov 16, 11-12 AM (24)
Nov 17, 12-1 AM (0)
Nov 17, 1-2 AM (7)
Nov 17, 2-3 AM (4)
Nov 17, 3-4 AM (4)
Nov 17, 4-5 AM (3)
Nov 17, 5-6 AM (8)
Nov 17, 6-7 AM (7)
Nov 17, 7-8 AM (36)
Nov 17, 8-9 AM (40)
Nov 17, 9-10 AM (29)
Nov 17, 10-11 AM (83)
Nov 17, 11-12 PM (32)
Nov 17, 12-1 PM (49)
Nov 17, 1-2 PM (47)
Nov 17, 2-3 PM (51)
Nov 17, 3-4 PM (41)
Nov 17, 4-5 PM (29)
Nov 17, 5-6 PM (23)
Nov 17, 6-7 PM (27)
Nov 17, 7-8 PM (26)
Nov 17, 8-9 PM (18)
Nov 17, 9-10 PM (25)
Nov 17, 10-11 PM (27)
Nov 17, 11-12 AM (29)
Nov 18, 12-1 AM (7)
Nov 18, 1-2 AM (6)
Nov 18, 2-3 AM (8)
Nov 18, 3-4 AM (7)
Nov 18, 4-5 AM (3)
Nov 18, 5-6 AM (5)
Nov 18, 6-7 AM (1)
Nov 18, 7-8 AM (15)
Nov 18, 8-9 AM (35)
Nov 18, 9-10 AM (40)
Nov 18, 10-11 AM (66)
Nov 18, 11-12 PM (63)
Nov 18, 12-1 PM (31)
Nov 18, 1-2 PM (43)
Nov 18, 2-3 PM (43)
Nov 18, 3-4 PM (41)
Nov 18, 4-5 PM (38)
Nov 18, 5-6 PM (18)
Nov 18, 6-7 PM (37)
Nov 18, 7-8 PM (11)
Nov 18, 8-9 PM (6)
Nov 18, 9-10 PM (14)
Nov 18, 10-11 PM (34)
Nov 18, 11-12 AM (25)
Nov 19, 12-1 AM (5)
Nov 19, 1-2 AM (3)
Nov 19, 2-3 AM (13)
Nov 19, 3-4 AM (7)
Nov 19, 4-5 AM (6)
Nov 19, 5-6 AM (12)
Nov 19, 6-7 AM (13)
Nov 19, 7-8 AM (18)
Nov 19, 8-9 AM (33)
Nov 19, 9-10 AM (0)
3,395 commits this week Nov 12, 2025 - Nov 19, 2025
feat: implement Midnight Glacier Drop airdrop redemption feature
- Add Airdrop menu item and screen for NIGHT token redemption
- Implement redemption API integration with thaw schedule checking
- Add eligibility check and banner notification in transaction history
- Support gradual token unlocking (thawing) with four 25% installments
- Add address allocation display with thaw schedule and redemption status
- Implement transaction building and signing for token redemption
- Add proper error handling for readonly wallets and uninitialized wallets
- Use existing usePromptRootKey hook for secure password entry
- Format addresses using ellipsizeMode middle with highlighted suffix
- Use intl.formatDate for consistent date formatting
- Apply theme atoms and spacing for dark mode compatibility
- Only show airdrop feature on mainnet wallets
fix(cardano): add rate limiting to prevent resource exhaustion during indexing
Implement interval-based rate limiting (~100 blocks/sec) in the subscription
loop to prevent memory exhaustion and OOM kills during blockchain indexing.

Problem:
Network produces blocks at high throughput (100s/sec) while WASM processes
significantly slower. Resources are created in DashMap BEFORE bounded event
queue send() can apply backpressure. Even with a 10K bounded channel, resources
accumulate in memory while waiting for queue space, leading to unbounded growth
and OOM kills (exit code 137) within minutes.

Solution:
Rate limit block processing using tokio::time::interval at the TOP of the
subscription loop, before pulling blocks from the network. This matches resource
creation rate to WASM consumption rate (~100 blocks/sec), preventing accumulation.

Changes:
- Add BLOCK_RATE_LIMIT_MS constant (10ms interval)
- Replace tokio::select! on follower.next() with interval-based tick
- Set MissedTickBehavior::Skip to prevent tick accumulation
- Add detailed comments explaining resource lifecycle and ordering problem
- Add TODO for future lazy resource creation approach

Works in conjunction with bounded event queue (10K capacity) - both mechanisms
are required because resources exist before backpressure can apply.

Note: Rate limiting is a pragmatic fix for the current event-driven architecture.
Long-term solution should use lazy resource creation (send Arc<BlockData> in
events, create resources on-demand when WASM accesses them) to eliminate the
ordering problem entirely