Day 1: hello-world-solana [x]
Day 2: rust-arithmetic-operators [x]
Day 3: anchor-idl [x]
Day 4: solana-require-macro [x]
Day 5: solana-anchor-deploy [x]
Day 6: rust-basic-syntax [x]
Day 7: the-unusual-syntax-of-rust [x]
Day 8: rust-function-like-macro [x]
Day 9: rust-attribute-derive-macro [x]
Day 10: rust-function-visibility [x]
Day 11: solana-clock [ ]
Day 12: solana-sysvar [ ]
Day 13: Solana logs, events, and transaction history [ ]
Day 14: tx.origin, msg.sender, and onlyOwner in Solana [ ]
Day 15: Transaction fees and compute units [ ]
Day 16: Accounts in Solana [ ]
Day 17: Writing to storage [ ]
Day 18: Reading Accounts from Typescript — an alternative to public variables and view functions [ ]
Day 19: Creating mappings and nested mappings in Solana [ ]
Day 20: Cost of storage, maximum storage size, and account resizing [ ]
Day 21: Reading an account balance in Rust: address(account).balance in Solana [x]
Day 22: More differences: modifiers, view pure, payable, and fallback in Solana [x]
Day 23: Building a payment splitter: “payable” and “msg.value” in Solana [x]
Day 24: Authorizing various wallets to write to an account: “Pranking tx.origin” [x]
Day 25: PDA vs Keypair Accounts [x]
Day 26: Understanding Account Ownership in Solana: Transferring SOL out of a PDA [x]
Day 27: init_if_needed and the Reinitialization Attack [x]
Day 28: Multicall in Solana: Batching Transactions [x]
Day 29: Owner vs Authority [x]
Day 30: Deleting Accounts and Closing Programs [x]
Day 31: Account types in #[derive(Accounts)] [ ]
Day 32: Reading Another Anchor Program’s Account Data On Chain [ ]
Day 33: Cross Program Invocation [ ]