|
1 | 1 | module SimpleNFT::nft { |
2 | | - /// Minimal NFT without strings/vectors/signers |
3 | | - struct NFT has store { |
4 | | - id: u64, |
5 | | - owner: address, |
| 2 | + /// Простейшая демо-модель без ресурсов внутри полей: |
| 3 | + /// вместо хранения NFT как ресурса, храним его данные в примитивах. |
| 4 | + struct Registry has store { |
| 5 | + next_id: u64, |
| 6 | + has0: bool, |
| 7 | + id0: u64, |
| 8 | + name0: vector<u8>, |
| 9 | + owner0: address, |
6 | 10 | } |
7 | 11 |
|
8 | | - /// Mint an NFT to owner with id |
9 | | - public fun mint(id: u64, owner: address): NFT { |
10 | | - NFT { id, owner } |
| 12 | + public fun new_registry(): Registry { |
| 13 | + Registry { |
| 14 | + next_id: 0, |
| 15 | + has0: false, |
| 16 | + id0: 0, |
| 17 | + name0: b"", |
| 18 | + owner0: @0x0 |
| 19 | + } |
11 | 20 | } |
12 | 21 |
|
13 | | - /// Transfer ownership |
14 | | - public fun transfer(n: &mut NFT, to: address) { |
15 | | - n.owner = to; |
| 22 | + public fun mint(r: &mut Registry, to: address, name: vector<u8>) { |
| 23 | + // Разрешаем ровно один минт (#0) для демо |
| 24 | + assert!(!r.has0, 1); |
| 25 | + let id = r.next_id; |
| 26 | + r.next_id = id + 1; |
| 27 | + |
| 28 | + // Заполняем поля примитивами — никаких ресурсов = нет проблем с drop |
| 29 | + r.id0 = id; |
| 30 | + r.name0 = name; |
| 31 | + r.owner0 = to; |
| 32 | + r.has0 = true; |
| 33 | + } |
| 34 | + |
| 35 | + public fun transfer(r: &mut Registry, id: u64, to: address) { |
| 36 | + assert!(r.has0, 2); |
| 37 | + assert!(r.id0 == id, 3); |
| 38 | + r.owner0 = to; |
| 39 | + } |
| 40 | + |
| 41 | + public fun get_owner(r: &Registry, id: u64): address { |
| 42 | + assert!(r.has0, 4); |
| 43 | + assert!(r.id0 == id, 5); |
| 44 | + r.owner0 |
| 45 | + } |
| 46 | + |
| 47 | + // «Поглощаем» реестр, чтобы не было implicit drop предупреждений |
| 48 | + fun destroy_registry(r: Registry) { |
| 49 | + let Registry { |
| 50 | + next_id: _, |
| 51 | + has0: _, |
| 52 | + id0: _, |
| 53 | + name0: _, |
| 54 | + owner0: _ |
| 55 | + } = r; |
16 | 56 | } |
17 | 57 |
|
18 | | - /// Read owner |
19 | | - public fun owner_of(n: &NFT): address { |
20 | | - n.owner |
| 58 | + /// DEMO: создаём реестр, минтим NFT #0 → переводим → проверяем владельца |
| 59 | + public entry fun entry_demo(_s: &signer) { |
| 60 | + let r = new_registry(); |
| 61 | + mint(&mut r, @0x1, b"Demo NFT"); |
| 62 | + transfer(&mut r, 0, @0x2); |
| 63 | + let owner = get_owner(&r, 0); |
| 64 | + assert!(owner == @0x2, 0); |
| 65 | + destroy_registry(r); |
21 | 66 | } |
22 | 67 | } |
0 commit comments