/
ERC721_Metadata_base.cairo
98 lines (79 loc) · 2.98 KB
/
ERC721_Metadata_base.cairo
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
%lang starknet
from starkware.cairo.common.alloc import alloc
from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin
from starkware.cairo.common.uint256 import Uint256
from openzeppelin.token.erc721.library import ERC721
from openzeppelin.introspection.erc165.library import ERC165
from contracts.utils.ShortString import uint256_to_ss
from contracts.utils.Array import concat_arr
//
// Storage
//
@storage_var
func ERC721_base_token_uri(index: felt) -> (res: felt) {
}
@storage_var
func ERC721_base_token_uri_len() -> (res: felt) {
}
@storage_var
func ERC721_base_token_uri_suffix() -> (res: felt) {
}
//
// Constructor
//
func ERC721_Metadata_initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(
) {
// register IERC721_Metadata
ERC165.register_interface(0x5b5e139f);
return ();
}
func ERC721_Metadata_tokenURI{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(
token_id: Uint256
) -> (token_uri_len: felt, token_uri: felt*) {
alloc_locals;
let exists = ERC721._exists(token_id);
assert exists = 1;
let (local base_token_uri) = alloc();
let (local base_token_uri_len) = ERC721_base_token_uri_len.read();
_ERC721_Metadata_baseTokenURI(base_token_uri_len, base_token_uri);
let (token_id_ss_len, token_id_ss) = uint256_to_ss(token_id);
let (token_uri_temp, token_uri_len_temp) = concat_arr(
base_token_uri_len, base_token_uri, token_id_ss_len, token_id_ss
);
let (ERC721_base_token_uri_suffix_local) = ERC721_base_token_uri_suffix.read();
let (local suffix) = alloc();
[suffix] = ERC721_base_token_uri_suffix_local;
let (token_uri, token_uri_len) = concat_arr(token_uri_len_temp, token_uri_temp, 1, suffix);
return (token_uri_len=token_uri_len, token_uri=token_uri);
}
func _ERC721_Metadata_baseTokenURI{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(
base_token_uri_len: felt, base_token_uri: felt*
) {
if (base_token_uri_len == 0) {
return ();
}
let (base) = ERC721_base_token_uri.read(base_token_uri_len);
assert [base_token_uri] = base;
_ERC721_Metadata_baseTokenURI(
base_token_uri_len=base_token_uri_len - 1, base_token_uri=base_token_uri + 1
);
return ();
}
func ERC721_Metadata_setBaseTokenURI{
syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr
}(token_uri_len: felt, token_uri: felt*, token_uri_suffix: felt) {
_ERC721_Metadata_setBaseTokenURI(token_uri_len, token_uri);
ERC721_base_token_uri_len.write(token_uri_len);
ERC721_base_token_uri_suffix.write(token_uri_suffix);
return ();
}
func _ERC721_Metadata_setBaseTokenURI{
syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr
}(token_uri_len: felt, token_uri: felt*) {
if (token_uri_len == 0) {
return ();
}
ERC721_base_token_uri.write(index=token_uri_len, value=[token_uri]);
_ERC721_Metadata_setBaseTokenURI(token_uri_len=token_uri_len - 1, token_uri=token_uri + 1);
return ();
}