-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy patherc721.sol
More file actions
117 lines (94 loc) · 3.5 KB
/
erc721.sol
File metadata and controls
117 lines (94 loc) · 3.5 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract HaikuNFT is ERC721 {
// Custom errors
error HaikuNotUnique();
error NotYourHaiku(uint256 haikuId);
error NoHaikusShared();
// Struct untuk menyimpan data haiku
struct Haiku {
address author;
string line1;
string line2;
string line3;
}
// Array public untuk menyimpan semua haiku
Haiku[] public haikus;
// Mapping untuk menyimpan haiku yang dibagikan dari address ke haiku ID
mapping(address => uint256[]) public sharedHaikus;
// Counter untuk tracking total haiku dan sebagai ID berikutnya
uint256 public counter = 1;
// Mapping untuk tracking line yang sudah digunakan
mapping(string => bool) private usedLines;
constructor() ERC721("HaikuNFT", "HAIKU") {
// Constructor kosong, ERC721 sudah menginisialisasi nama dan symbol
}
// Function untuk mint haiku baru
function mintHaiku(
string memory _line1,
string memory _line2,
string memory _line3
) external {
// Cek apakah salah satu line sudah pernah digunakan
if (
usedLines[_line1] ||
usedLines[_line2] ||
usedLines[_line3]
) {
revert HaikuNotUnique();
}
// Tandai lines sebagai sudah digunakan
usedLines[_line1] = true;
usedLines[_line2] = true;
usedLines[_line3] = true;
// Buat haiku baru
Haiku memory newHaiku = Haiku({
author: msg.sender,
line1: _line1,
line2: _line2,
line3: _line3
});
// Tambahkan ke array haikus
haikus.push(newHaiku);
// Mint NFT dengan counter sebagai tokenId
_mint(msg.sender, counter);
// Increment counter untuk ID berikutnya
counter++;
}
// Function untuk share haiku ke address lain
function shareHaiku(address _to, uint256 _haikuId) public {
// Cek apakah sender adalah owner dari haiku NFT
if (ownerOf(_haikuId) != msg.sender) {
revert NotYourHaiku(_haikuId);
}
// Tambahkan haiku ID ke shared haikus dari address tujuan
sharedHaikus[_to].push(_haikuId);
}
// Function untuk mendapatkan semua haiku yang dibagikan ke caller
function getMySharedHaikus() public view returns (Haiku[] memory) {
uint256[] memory mySharedIds = sharedHaikus[msg.sender];
// Cek apakah ada haiku yang dibagikan
if (mySharedIds.length == 0) {
revert NoHaikusShared();
}
// Buat array hasil dengan ukuran sesuai jumlah shared haikus
Haiku[] memory result = new Haiku[](mySharedIds.length);
// Loop dan ambil data haiku berdasarkan ID
for (uint256 i = 0; i < mySharedIds.length; i++) {
// Karena tokenId dimulai dari 1, tapi array index dari 0
result[i] = haikus[mySharedIds[i] - 1];
}
return result;
}
// Helper function untuk mendapatkan total haiku yang sudah di-mint
function getTotalHaikus() public view returns (uint256) {
return haikus.length;
}
// Helper function untuk mendapatkan haiku berdasarkan ID
function getHaiku(uint256 _haikuId) public view returns (Haiku memory) {
require(_haikuId > 0 && _haikuId < counter, "Invalid haiku ID");
return haikus[_haikuId - 1];
}
}