Skip to content

Commit 801c58e

Browse files
ghozzzaclaude
andcommitted
add week 1 study materials and update Counter contract
- Add Week1_1 contract with basic number operations (set, get, increment, decrement) - Add Week1_1 test suite - Update Counter contract with additional Solidity data type examples (mappings, arrays, structs, enums, modifiers) - Add remappings and notes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e620912 commit 801c58e

File tree

10 files changed

+366
-1
lines changed

10 files changed

+366
-1
lines changed

foundry.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
src = "src"
33
out = "out"
44
libs = ["lib"]
5+
remappings = []
56

67
# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options

remappings.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
@src/=src/
2+
forge-std/=lib/forge-std/src/

src/Counter.sol

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,38 @@
22
pragma solidity ^0.8.13;
33

44
contract Counter {
5-
uint256 public number;
5+
uint256 public number; // n >= 0 // size => 256, 128, 64, 32, 16, 8
6+
7+
int256 public number2; // n >= -2^256 and n <= 2^256 - 1
8+
9+
mapping(address => uint256) public numbers;
10+
11+
uint256[] public numbersArray;
12+
13+
address public owner;
14+
15+
bytes32 public name; // bytes => 32 bytes
16+
17+
struct Person {
18+
string name;
19+
uint256 age;
20+
bool isStudent;
21+
}
22+
23+
Person public person;
24+
25+
enum Status {
26+
Pending,
27+
Completed,
28+
Failed
29+
}
30+
31+
Status public status;
32+
33+
modifier onlyOwner() {
34+
_onlyOwner();
35+
_;
36+
}
637

738
function setNumber(uint256 newNumber) public {
839
number = newNumber;
@@ -11,4 +42,12 @@ contract Counter {
1142
function increment() public {
1243
number++;
1344
}
45+
46+
function _onlyOwner() internal view {
47+
require(msg.sender == owner, "You are not the owner");
48+
}
1449
}
50+
51+
// (uint256, string, uitn256, address) = bytes32;
52+
53+
// maksimal memori around 24 KB

src/week1/NOTES.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
** datatypes **
2+
1. uint256
3+
2. int256
4+
3. bool
5+
4. string
6+
5. address
7+
6. bytes
8+
7. enum
9+
8. struct
10+
9. mapping
11+
10. array
12+
13+
** function types **
14+
1. public (+ returns) - public bisa dieksekusi all users ✍️
15+
2. external (+ returns) - bisa dieksukusi, tapi gabisa inherit *CMIIW ✍️
16+
3. internal (+ returns) - hanya bisa dieksekusi oleh contractnya sendiri ✍️
17+
4. private (+ returns) - hanya bisa dieksekusi oleh contractnya sendiri, tapi gabisa inherit *CMIIW ✍️
18+
5. read function (view returns) ** 🤓
19+
20+
** events **
21+
-> data yang didapat dari blockchain, bersifat historikal, untuk diolah di offchain. hanya ditulis di ✍️ functions
22+
23+
** TOOLS **
24+
https://calldata.swiss-knife.xyz/
25+
26+
** RESOURCES **
27+
- yanzero bootcamp
28+
- hackquest
29+
- cryptozombie
30+
- cyfrin
31+
- udemy (paid)
32+
- pelita bangsa

src/week1/Week1_1.sol

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.30;
3+
4+
contract Week1_1 {
5+
event SetNumber(address executor, uint256 newNumber);
6+
event Increment(uint256 newNumber);
7+
event Decrement(uint256 newNumber);
8+
9+
uint256 public number;
10+
11+
function setNumber(uint256 newNumber) public {
12+
number = newNumber;
13+
emit SetNumber(msg.sender, newNumber);
14+
}
15+
16+
function increment() public {
17+
number++;
18+
emit Increment(number);
19+
}
20+
21+
function decrement() external {
22+
number--;
23+
emit Decrement(number);
24+
}
25+
26+
function getNumber() public view returns (uint256) {
27+
return number;
28+
}
29+
}

src/week1/Week1_2.sol

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.30;
3+
4+
contract Week1_2 {
5+
event SetBytesByString(string _encode);
6+
event SetBytesByBytes(bytes _encode);
7+
8+
error NotOwner();
9+
error ContractIsPaused();
10+
11+
bytes public encode;
12+
13+
address public owner;
14+
15+
enum IsPaused {
16+
Paused,
17+
Unpaused
18+
}
19+
20+
IsPaused public isPaused;
21+
22+
modifier whenPaused() {
23+
_whenPaused();
24+
_;
25+
}
26+
27+
modifier onlyOwner() {
28+
_onlyOwner();
29+
_;
30+
}
31+
32+
constructor() {
33+
owner = msg.sender;
34+
}
35+
36+
function setBytesByString(string calldata _encode) public whenPaused {
37+
encode = abi.encode(_encode);
38+
emit SetBytesByString(_encode);
39+
}
40+
41+
function setBytesByBytes(bytes calldata _encode) public whenPaused {
42+
encode = _encode;
43+
emit SetBytesByBytes(_encode);
44+
}
45+
46+
function decodeBytesToString() public view whenPaused returns (string memory) {
47+
return abi.decode(encode, (string));
48+
}
49+
50+
function pause() public onlyOwner {
51+
isPaused = IsPaused.Paused;
52+
}
53+
54+
function unpause() public onlyOwner {
55+
isPaused = IsPaused.Unpaused;
56+
}
57+
58+
function _whenPaused() internal view {
59+
if (isPaused == IsPaused.Paused) revert ContractIsPaused();
60+
}
61+
62+
function _onlyOwner() internal view {
63+
if (msg.sender != owner) revert NotOwner();
64+
}
65+
}

src/week1/Week1_3.sol

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.30;
3+
4+
contract Week1_3 {
5+
error UserExist();
6+
7+
struct User {
8+
uint256 id;
9+
string name;
10+
bool isStudent;
11+
}
12+
13+
User[] public users;
14+
15+
mapping(address => User) public user;
16+
// address => uint256
17+
18+
modifier userExist() {
19+
_userExist();
20+
_;
21+
}
22+
23+
function addUser(string calldata name, bool isStudent) public userExist {
24+
// array
25+
users.push(User({id: users.length + 1, name: name, isStudent: isStudent}));
26+
27+
// mapping
28+
user[msg.sender] = User({id: users.length, name: name, isStudent: isStudent});
29+
}
30+
31+
function editUser(string calldata name, bool isStudent) public {
32+
user[msg.sender] = User({id: user[msg.sender].id, name: name, isStudent: isStudent});
33+
}
34+
35+
function _userExist() internal view {
36+
if (user[msg.sender].id != 0) revert UserExist();
37+
}
38+
39+
function getLengthUsers() public view returns (uint256) {
40+
return users.length;
41+
}
42+
}

test/week1/Week.1.2.t.sol

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.30;
3+
4+
import {Test} from "forge-std/Test.sol";
5+
import {Week1_2} from "@src/week1/Week1_2.sol";
6+
7+
// RUN
8+
// forge test
9+
// forge test --match-contract Week1_2Test
10+
// forge test --match-contract Week1_2Test --match-test testSetBytesByString
11+
12+
contract Week1_2Test is Test {
13+
Week1_2 public week12;
14+
15+
address public owner = makeAddr("owner");
16+
address public alice = makeAddr("alice");
17+
18+
function setUp() public {
19+
vm.startPrank(owner);
20+
week12 = new Week1_2();
21+
vm.stopPrank();
22+
}
23+
24+
// RUN
25+
// forge test --match-contract Week1_2Test --match-test testSetBytesByString -vvv
26+
function testSetBytesByString() public {
27+
week12.setBytesByString("Hello");
28+
assertEq(week12.encode(), abi.encode("Hello"));
29+
}
30+
31+
// RUN
32+
// forge test --match-contract Week1_2Test --match-test testSetBytesByBytes -vvv
33+
function testSetBytesByBytes() public {
34+
bytes memory encode = abi.encode("Hello");
35+
week12.setBytesByBytes(encode);
36+
assertEq(week12.decodeBytesToString(), "Hello");
37+
}
38+
39+
// RUN
40+
// forge test --match-contract Week1_2Test --match-test testDecodeBytesToString -vvv
41+
function testDecodeBytesToString() public view {
42+
assertEq(week12.decodeBytesToString(), "Hello");
43+
}
44+
45+
// RUN
46+
// forge test --match-contract Week1_2Test --match-test testPause -vvv
47+
function testPause() public {
48+
vm.startPrank(owner);
49+
week12.pause();
50+
vm.stopPrank();
51+
}
52+
53+
// RUN
54+
// forge test --match-contract Week1_2Test --match-test testSetBytesByStringWhenPaused -vvv
55+
function testSetBytesByStringWhenPaused() public {
56+
vm.startPrank(owner);
57+
week12.pause();
58+
vm.stopPrank();
59+
60+
vm.startPrank(owner);
61+
week12.setBytesByString("Hello");
62+
vm.stopPrank();
63+
}
64+
}

test/week1/Week.1.3.t.sol

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.30;
3+
4+
import {Test, console} from "forge-std/Test.sol";
5+
import {Week1_3} from "@src/week1/Week1_3.sol";
6+
7+
// RUN
8+
// forge test
9+
// forge test --match-contract Week1_3Test
10+
// forge test --match-contract Week1_3Test --match-test testAddUser
11+
contract Week1_3Test is Test {
12+
Week1_3 public week13;
13+
14+
address public owner = makeAddr("owner");
15+
address public alice = makeAddr("alice");
16+
17+
function setUp() public {
18+
vm.startPrank(owner);
19+
week13 = new Week1_3();
20+
vm.stopPrank();
21+
}
22+
23+
// RUN
24+
// forge test --match-contract Week1_3Test --match-test testAddUser -vvv
25+
function testAddUser() public {
26+
vm.startPrank(owner);
27+
week13.addUser("Alice", true);
28+
vm.stopPrank();
29+
}
30+
31+
// RUN
32+
// forge test --match-contract Week1_3Test --match-test testEditUser -vvv
33+
function testEditUser() public {
34+
vm.startPrank(owner);
35+
week13.addUser("owner", true);
36+
week13.editUser("owner", false);
37+
vm.stopPrank();
38+
39+
vm.startPrank(alice);
40+
week13.addUser("Alice", true);
41+
vm.stopPrank();
42+
43+
console.log(week13.getLengthUsers());
44+
}
45+
}

test/week1/Week.1.t.sol

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.30;
3+
4+
import {Test} from "forge-std/Test.sol";
5+
import {Week1_1} from "@src/week1/Week1_1.sol";
6+
7+
// RUN
8+
// forge test
9+
// forge test --match-contract Week1_1Test
10+
// forge test --match-contract Week1_1Test --match-test testSetNumber
11+
12+
contract Week1_1Test is Test {
13+
Week1_1 public week11;
14+
15+
function setUp() public {
16+
week11 = new Week1_1();
17+
}
18+
19+
// RUN
20+
// forge test --match-contract Week1_1Test --match-test testSetNumber -vvv
21+
function testSetNumber() public {
22+
week11.setNumber(1);
23+
assertEq(week11.number(), 1);
24+
}
25+
26+
// RUN
27+
// forge test --match-contract Week1_1Test --match-test testIncrement -vvv
28+
function testIncrement() public {
29+
week11.increment();
30+
assertEq(week11.number(), 1);
31+
}
32+
33+
// RUN
34+
// forge test --match-contract Week1_1Test --match-test testDecrement -vvv
35+
function testDecrement() public {
36+
testIncrement();
37+
week11.decrement();
38+
assertEq(week11.number(), 0);
39+
}
40+
41+
// RUN
42+
// forge test --match-contract Week1_1Test --match-test testGetNumber -vvv
43+
function testGetNumber() public view {
44+
assertEq(week11.getNumber(), 0);
45+
}
46+
}

0 commit comments

Comments
 (0)