0%

简单的NFT铸造智能合约

代码

以下将展示一个简单的 NFT 铸造智能合约 (忽略交易相关的函数)

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

// ERC 165 标准接口
interface IERC165 {}

// ERC 721 标准接口
interface IERC721 is IERC165 {
function balanceOf(address owner) external view returns (uint balance);

function ownerOfTokenId(uint tokenId) external view returns (address owner);
}

contract ERC721 is IERC721 {

using Address for address;

// Mapping from token ID to owner address
mapping(uint => address) private _owners;

// Mapping owner address to token count
mapping(address => uint) private _balances;

// Mapping from tokenId to picture URL
mapping(uint256 => string) private _tokenURLs;

// Mapping from URL to token ID
mapping(string => uint256) private _urlToTokenId;

// Mapping from address to array of owned token IDs
mapping(address => uint256[]) private _ownedTokens;

// Mapping from address to array of owned URLs
mapping(address => string[]) private _ownedURLs;

// Mapping from URL to transaction hash
mapping(string => bytes32) public tokenHashes;

// Array to store all token IDs
uint256[] private _allTokenIds;

// Mapping from token Id to index in _allTokenIds array
mapping(uint256 => uint256) private _allTokenIdsIndex;

// Event triggered when setting token URL
event TokenURLSet(uint256 indexed tokenId, string url);

// Private function _mint to mint NFTs by address and tokenId
function _mint(address to, uint tokenId) private {
require(to != address(0), "mint to zero address");
require(_owners[tokenId] == address(0), "token already minted");

_balances[to] += 1;
_owners[tokenId] = to;

// Add tokenId to _allTokenIds array
_allTokenIds.push(tokenId);
_allTokenIdsIndex[tokenId] = _allTokenIds.length - 1;
}

// Internal function to set token URL
function _setTokenURL(uint256 tokenId, string memory tokenURI) internal {
require(_exists(tokenId), "URL set of nonexistent token");
_tokenURLs[tokenId] = tokenURI;
emit TokenURLSet(tokenId, tokenURI);
}

// Function to mint NFTs by address and picture URL
function mint(address to, string memory tokenURI) public {
bytes32 hash = keccak256(abi.encodePacked(tokenURI));
uint256 newTokenId = uint256(hash);

_mint(to, newTokenId);

_setTokenURL(newTokenId, tokenURI);
_urlToTokenId[tokenURI] = newTokenId;
_ownedTokens[to].push(newTokenId);
_ownedURLs[to].push(tokenURI);
}

// Function to get token URL by tokenId
function getURLbyTokenId(uint256 tokenId) public view returns (string memory) {
require(_exists(tokenId), "URL query for nonexistent token");
return _tokenURLs[tokenId];
}

// Function to get tokenId by URL
function getTokenIdbyURL(string memory tokenURI) public view returns (uint256) {
uint256 tokenId = _urlToTokenId[tokenURI];
require(_exists(tokenId), "Token with this URL does not exist");

return tokenId;
}

// Function to burn NFTs
function burn(uint256 tokenId) external {
address owner = ownerOfTokenId(tokenId);
require(msg.sender == owner, "not owner of token");

_balances[owner] -= 1;
delete _owners[tokenId];

string memory tokenURL = _tokenURLs[tokenId];
delete _tokenURLs[tokenId];
delete _urlToTokenId[tokenURL];

uint256[] storage ownedTokens = _ownedTokens[owner];
for (uint256 i = 0; i < ownedTokens.length; i++) {
if (ownedTokens[i] == tokenId) {
ownedTokens[i] = ownedTokens[ownedTokens.length - 1];
ownedTokens.pop();
break;
}
}

string[] storage ownedURLs = _ownedURLs[owner];
for (uint256 i = 0; i < ownedURLs.length; i++) {
if (keccak256(abi.encodePacked(ownedURLs[i])) == keccak256(abi.encodePacked(tokenURL))) {
ownedURLs[i] = ownedURLs[ownedURLs.length - 1];
ownedURLs.pop();
break;
}
}

// Remove tokenId from _allTokenIds array
uint256 indexToRemove = _allTokenIdsIndex[tokenId];
uint256 lastIndex = _allTokenIds.length - 1;
uint256 lastTokenId = _allTokenIds[lastIndex];
_allTokenIds[indexToRemove] = lastTokenId;
_allTokenIdsIndex[lastTokenId] = indexToRemove;
_allTokenIds.pop();
delete _allTokenIdsIndex[tokenId];
}

// Private function to check if token exists
function _exists(uint256 tokenId) private view returns (bool) {
return _owners[tokenId] != address(0);
}

// Function to get the total count of tokens owned by owner
function balanceOf(address owner) external view override returns (uint) {
require(owner != address(0), "owner = zero address");
return _balances[owner];
}

// Function to determine owner by tokenId
function ownerOfTokenId(uint tokenId) public view override returns (address owner) {
owner = _owners[tokenId];
require(owner != address(0), "token doesn't exist");
}

// Function to determine owner by URL
function ownerOfURL(string memory tokenURI) public view returns (address) {
uint256 token_Id = _urlToTokenId[tokenURI];
require(_exists(token_Id), "Token with this URL does not exist");

return _owners[token_Id];
}

// Function to get all token IDs owned by specified owner
function getOwnedTokenIds(address owner) public view returns (uint256[] memory) {
require(owner != address(0), "owner = zero address");
return _ownedTokens[owner];
}

// Function to get all URLs owned by specified owner
function getOwnedURLs(address owner) public view returns (string[] memory) {
require(owner != address(0), "owner = zero address");
return _ownedURLs[owner];
}

// Function to get all token IDs owned by current owner
function getMyTokenIds() public view returns (uint256[] memory) {
return _ownedTokens[msg.sender];
}

// Function to get all URLs owned by current owner
function getMyURLs() public view returns (string[] memory) {
return _ownedURLs[msg.sender];
}

// Function to get all token IDs
function getAllTokenIds() public view returns (uint256[] memory) {
return _allTokenIds;
}

// Function to get all URLs
function getAllURLs() public view returns (string[] memory) {
string[] memory urls = new string[](_allTokenIds.length);
for (uint256 i = 0; i < _allTokenIds.length; i++) {
uint256 tokenId = _allTokenIds[i];
urls[i] = _tokenURLs[tokenId];
}
return urls;
}

// Function to set transaction hash
// use when the front end receive the event that the nft is minted
function setTransactionHash(string memory tokenURI, bytes32 txhash) public {
tokenHashes[tokenURI] = txhash;
}

// Function to get transaction hash
function getTransactionHash(string memory tokenURI) public view returns (bytes32) {
return tokenHashes[tokenURI];
}
}

// Library to check if address is a contract address
library Address {
function isContract(address account) internal view returns (bool) {
uint size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
}

以下是对一些接口的解释

  1. mint
  • 所需参数: 拥有者地址to,数据URL
  • 实现功能: 铸造一个新的代币,将新代币分配给地址 to,并使用 tokenURI 作为代币的元数据
  1. burn
  • 所需参数: 代币tokenId
  • 实现功能: 允许代币的拥有者销毁一个代币。销毁后,代币将从拥有者的余额中移除。
  1. balanceOf
  • 所需参数: 地址address owner
  • 实现功能: 返回指定地址 owner 拥有的代币数量。
  1. getOwnedTokenIds
  • 所需参数: 地址address owner
  • 实现功能: 返回一个数组,包含指定地址 owner 拥有的所有代币的 tokenId
  1. getOwnedURLs
  • 所需参数: 地址address owner
  • 实现功能: 返回一个数组,包含与指定地址 owner 拥有的代币相关联的所有 tokenURL
  1. getTokenIdByUrl
  • 所需参数: 图片的 tokenURI
  • 实现功能: 根据提供的 tokenURI 返回对应的 tokenId。如果不存在具有该 tokenURI 的代币,则抛出错误。
  1. getURLbyTokenId
  • 所需参数: 代币的tokenIduint256 tokenId
  • 实现功能: 根据提供的 tokenId 返回对应的 tokenURI。如果不存在具有该 tokenId 的代币,则抛出错误。
  1. OwnerOfTokenId
  • 所需参数: 代币的tokenIduint tokenId
  • 实现功能: 返回拥有指定 tokenId 的代币的地址。如果代币不存在,则抛出错误。
  1. OwnerOfURL
  • 所需参数: 图片的 tokenURI
  • 实现功能: 根据提供的 tokenURI 返回拥有该 tokenURI 的代币的地址。如果代币不存在,则抛出错误。

abi 和 bytecode

1
2
3
var abi = JSON.parse('[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"TokenURLSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllTokenIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllURLs\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMyTokenIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMyURLs\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"getOwnedTokenIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"getOwnedURLs\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"getTokenIdbyURL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"getTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getURLbyTokenId\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOfTokenId\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"ownerOfURL\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"txhash\",\"type\":\"bytes32\"}],\"name\":\"setTransactionHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"tokenHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]')

var code = "0x" + "608060405234801561001057600080fd5b506127c1806100206000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80636dffece4116100975780637ba0ca0d116100665780637ba0ca0d1461030d578063bdbed7221461032b578063d0def52114610349578063ffd448571461036557610100565b80636dffece41461025f5780636f8867041461028f57806370a08231146102ad578063785fc822146102dd57610100565b806342966c68116100d357806342966c68146101b35780634fac7e41146101cf5780635d46fa18146101ff57806368564b121461022f57610100565b8063105e18a81461010557806312e8ac061461013557806327030bec146101655780633fc3097414610183575b600080fd5b61011f600480360381019061011a91906117b0565b610381565b60405161012c919061192f565b60405180910390f35b61014f600480360381019061014a9190611987565b610508565b60405161015c91906119c3565b60405180910390f35b61016d6105b3565b60405161017a919061192f565b60405180910390f35b61019d60048036038101906101989190611987565b6106c9565b6040516101aa9190611a28565b60405180910390f35b6101cd60048036038101906101c89190611987565b6107b6565b005b6101e960048036038101906101e491906117b0565b610cd7565b6040516101f69190611b08565b60405180910390f35b61021960048036038101906102149190611c5f565b610ddd565b6040516102269190611cc1565b60405180910390f35b61024960048036038101906102449190611c5f565b610e05565b6040516102569190611ceb565b60405180910390f35b61027960048036038101906102749190611c5f565b610e7a565b60405161028691906119c3565b60405180910390f35b610297610f21565b6040516102a4919061192f565b60405180910390f35b6102c760048036038101906102c291906117b0565b611083565b6040516102d49190611ceb565b60405180910390f35b6102f760048036038101906102f29190611c5f565b61113a565b6040516103049190611cc1565b60405180910390f35b610315611168565b6040516103229190611b08565b60405180910390f35b6103336111fd565b6040516103409190611b08565b60405180910390f35b610363600480360381019061035e9190611d06565b611255565b005b61037f600480360381019061037a9190611d8e565b61139d565b005b6060600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e990611e36565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156104fd57838290600052602060002001805461047090611e85565b80601f016020809104026020016040519081016040528092919081815260200182805461049c90611e85565b80156104e95780601f106104be576101008083540402835291602001916104e9565b820191906000526020600020905b8154815290600101906020018083116104cc57829003601f168201915b505050505081526020019060010190610451565b505050509050919050565b600080600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a590611f02565b60405180910390fd5b919050565b6060600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106c057838290600052602060002001805461063390611e85565b80601f016020809104026020016040519081016040528092919081815260200182805461065f90611e85565b80156106ac5780601f10610681576101008083540402835291602001916106ac565b820191906000526020600020905b81548152906001019060200180831161068f57829003601f168201915b505050505081526020019060010190610614565b50505050905090565b60606106d4826113c4565b610713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070a90611f6e565b60405180910390fd5b60026000838152602001908152602001600020805461073190611e85565b80601f016020809104026020016040519081016040528092919081815260200182805461075d90611e85565b80156107aa5780601f1061077f576101008083540402835291602001916107aa565b820191906000526020600020905b81548152906001019060200180831161078d57829003601f168201915b50505050509050919050565b60006107c182610508565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890611fda565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108809190612029565b9250508190555060008083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560006002600084815260200190815260200160002080546108dc90611e85565b80601f016020809104026020016040519081016040528092919081815260200182805461090890611e85565b80156109555780601f1061092a57610100808354040283529160200191610955565b820191906000526020600020905b81548152906001019060200180831161093857829003601f168201915b5050505050905060026000848152602001908152602001600020600061097b91906116e1565b60038160405161098b9190612099565b9081526020016040518091039020600090556000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b8180549050811015610aa15784828281548110610a0357610a026120b0565b5b906000526020600020015403610a8e578160018380549050610a259190612029565b81548110610a3657610a356120b0565b5b9060005260206000200154828281548110610a5457610a536120b0565b5b906000526020600020018190555081805480610a7357610a726120df565b5b60019003818190600052602060002001600090559055610aa1565b8080610a999061210e565b9150506109e3565b506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b8180549050811015610c015783604051602001610b059190612099565b60405160208183030381529060405280519060200120828281548110610b2e57610b2d6120b0565b5b90600052602060002001604051602001610b4891906121ee565b6040516020818303038152906040528051906020012003610bee578160018380549050610b759190612029565b81548110610b8657610b856120b0565b5b90600052602060002001828281548110610ba357610ba26120b0565b5b906000526020600020019081610bb991906123c7565b5081805480610bcb57610bca6120df565b5b600190038181906000526020600020016000610be791906116e1565b9055610c01565b8080610bf99061210e565b915050610ae8565b5060006008600087815260200190815260200160002054905060006001600780549050610c2e9190612029565b9050600060078281548110610c4657610c456120b0565b5b906000526020600020015490508060078481548110610c6857610c676120b0565b5b90600052602060002001819055508260086000838152602001908152602001600020819055506007805480610ca057610c9f6120df565b5b6001900381819060005260206000200160009055905560086000898152602001908152602001600020600090555050505050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3f90611e36565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610dd157602002820191906000526020600020905b815481526020019060010190808311610dbd575b50505050509050919050565b6000600682604051610def9190612099565b9081526020016040518091039020549050919050565b600080600383604051610e189190612099565b9081526020016040518091039020549050610e32816113c4565b610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890612521565b60405180910390fd5b80915050919050565b600080600383604051610e8d9190612099565b9081526020016040518091039020549050610ea7816113c4565b610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90612521565b60405180910390fd5b60008082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6060600060078054905067ffffffffffffffff811115610f4457610f43611b34565b5b604051908082528060200260200182016040528015610f7757816020015b6060815260200190600190039081610f625790505b50905060005b60078054905081101561107b57600060078281548110610fa057610f9f6120b0565b5b90600052602060002001549050600260008281526020019081526020016000208054610fcb90611e85565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff790611e85565b80156110445780601f1061101957610100808354040283529160200191611044565b820191906000526020600020905b81548152906001019060200180831161102757829003601f168201915b505050505083838151811061105c5761105b6120b0565b5b60200260200101819052505080806110739061210e565b915050610f7d565b508091505090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90611e36565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6006818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6060600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156111f357602002820191906000526020600020905b8154815260200190600101908083116111df575b5050505050905090565b6060600780548060200260200160405190810160405280929190818152602001828054801561124b57602002820191906000526020600020905b815481526020019060010190808311611237575b5050505050905090565b6000816040516020016112689190612099565b60405160208183030381529060405280519060200120905060008160001c9050611292848261142f565b61129c818461163c565b806003846040516112ad9190612099565b908152602001604051809103902081905550600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915090816113969190612541565b5050505050565b806006836040516113ae9190612099565b9081526020016040518091039020819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361149e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114959061265f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906126cb565b60405180910390fd5b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461158e91906126eb565b925050819055508160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600781908060018154018082558091505060019003906000526020600020016000909190919091505560016007805490506116219190612029565b60086000838152602001908152602001600020819055505050565b611645826113c4565b611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167b9061276b565b60405180910390fd5b806002600084815260200190815260200160002090816116a49190612541565b50817f9f29759901a481b6bf52ac6c03ccf75f53edec21c990efc5d3828daf7f93f13b826040516116d59190611a28565b60405180910390a25050565b5080546116ed90611e85565b6000825580601f106116ff575061171e565b601f01602090049060005260206000209081019061171d9190611721565b5b50565b5b8082111561173a576000816000905550600101611722565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061177d82611752565b9050919050565b61178d81611772565b811461179857600080fd5b50565b6000813590506117aa81611784565b92915050565b6000602082840312156117c6576117c5611748565b5b60006117d48482850161179b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611843578082015181840152602081019050611828565b60008484015250505050565b6000601f19601f8301169050919050565b600061186b82611809565b6118758185611814565b9350611885818560208601611825565b61188e8161184f565b840191505092915050565b60006118a58383611860565b905092915050565b6000602082019050919050565b60006118c5826117dd565b6118cf81856117e8565b9350836020820285016118e1856117f9565b8060005b8581101561191d57848403895281516118fe8582611899565b9450611909836118ad565b925060208a019950506001810190506118e5565b50829750879550505050505092915050565b6000602082019050818103600083015261194981846118ba565b905092915050565b6000819050919050565b61196481611951565b811461196f57600080fd5b50565b6000813590506119818161195b565b92915050565b60006020828403121561199d5761199c611748565b5b60006119ab84828501611972565b91505092915050565b6119bd81611772565b82525050565b60006020820190506119d860008301846119b4565b92915050565b600082825260208201905092915050565b60006119fa82611809565b611a0481856119de565b9350611a14818560208601611825565b611a1d8161184f565b840191505092915050565b60006020820190508181036000830152611a4281846119ef565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a7f81611951565b82525050565b6000611a918383611a76565b60208301905092915050565b6000602082019050919050565b6000611ab582611a4a565b611abf8185611a55565b9350611aca83611a66565b8060005b83811015611afb578151611ae28882611a85565b9750611aed83611a9d565b925050600181019050611ace565b5085935050505092915050565b60006020820190508181036000830152611b228184611aaa565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6c8261184f565b810181811067ffffffffffffffff82111715611b8b57611b8a611b34565b5b80604052505050565b6000611b9e61173e565b9050611baa8282611b63565b919050565b600067ffffffffffffffff821115611bca57611bc9611b34565b5b611bd38261184f565b9050602081019050919050565b82818337600083830152505050565b6000611c02611bfd84611baf565b611b94565b905082815260208101848484011115611c1e57611c1d611b2f565b5b611c29848285611be0565b509392505050565b600082601f830112611c4657611c45611b2a565b5b8135611c56848260208601611bef565b91505092915050565b600060208284031215611c7557611c74611748565b5b600082013567ffffffffffffffff811115611c9357611c9261174d565b5b611c9f84828501611c31565b91505092915050565b6000819050919050565b611cbb81611ca8565b82525050565b6000602082019050611cd66000830184611cb2565b92915050565b611ce581611951565b82525050565b6000602082019050611d006000830184611cdc565b92915050565b60008060408385031215611d1d57611d1c611748565b5b6000611d2b8582860161179b565b925050602083013567ffffffffffffffff811115611d4c57611d4b61174d565b5b611d5885828601611c31565b9150509250929050565b611d6b81611ca8565b8114611d7657600080fd5b50565b600081359050611d8881611d62565b92915050565b60008060408385031215611da557611da4611748565b5b600083013567ffffffffffffffff811115611dc357611dc261174d565b5b611dcf85828601611c31565b9250506020611de085828601611d79565b9150509250929050565b7f6f776e6572203d207a65726f2061646472657373000000000000000000000000600082015250565b6000611e206014836119de565b9150611e2b82611dea565b602082019050919050565b60006020820190508181036000830152611e4f81611e13565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e9d57607f821691505b602082108103611eb057611eaf611e56565b5b50919050565b7f746f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b6000611eec6013836119de565b9150611ef782611eb6565b602082019050919050565b60006020820190508181036000830152611f1b81611edf565b9050919050565b7f55524c20717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000611f58601f836119de565b9150611f6382611f22565b602082019050919050565b60006020820190508181036000830152611f8781611f4b565b9050919050565b7f6e6f74206f776e6572206f6620746f6b656e0000000000000000000000000000600082015250565b6000611fc46012836119de565b9150611fcf82611f8e565b602082019050919050565b60006020820190508181036000830152611ff381611fb7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061203482611951565b915061203f83611951565b925082820390508181111561205757612056611ffa565b5b92915050565b600081905092915050565b600061207382611809565b61207d818561205d565b935061208d818560208601611825565b80840191505092915050565b60006120a58284612068565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600061211982611951565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361214b5761214a611ffa565b5b600182019050919050565b60008190508160005260206000209050919050565b6000815461217881611e85565b612182818661205d565b9450600182166000811461219d57600181146121b2576121e5565b60ff19831686528115158202860193506121e5565b6121bb85612156565b60005b838110156121dd578154818901526001820191506020810190506121be565b838801955050505b50505092915050565b60006121fa828461216b565b915081905092915050565b60008154905061221481611e85565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261227d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612240565b6122878683612240565b95508019841693508086168417925050509392505050565b6000819050919050565b60006122c46122bf6122ba84611951565b61229f565b611951565b9050919050565b6000819050919050565b6122de836122a9565b6122f26122ea826122cb565b84845461224d565b825550505050565b600090565b6123076122fa565b6123128184846122d5565b505050565b5b818110156123365761232b6000826122ff565b600181019050612318565b5050565b601f82111561237b5761234c81612156565b61235584612230565b81016020851015612364578190505b61237861237085612230565b830182612317565b50505b505050565b600082821c905092915050565b600061239e60001984600802612380565b1980831691505092915050565b60006123b7838361238d565b9150826002028217905092915050565b8181036123d55750506124ad565b6123de82612205565b67ffffffffffffffff8111156123f7576123f6611b34565b5b6124018254611e85565b61240c82828561233a565b6000601f83116001811461243b5760008415612429578287015490505b61243385826123ab565b8655506124a6565b601f1984166124498761221b565b965061245486612156565b60005b8281101561247c57848901548255600182019150600185019450602081019050612457565b868310156124995784890154612495601f89168261238d565b8355505b6001600288020188555050505b5050505050505b565b7f546f6b656e207769746820746869732055524c20646f6573206e6f742065786960008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b600061250b6022836119de565b9150612516826124af565b604082019050919050565b6000602082019050818103600083015261253a816124fe565b9050919050565b61254a82611809565b67ffffffffffffffff81111561256357612562611b34565b5b61256d8254611e85565b61257882828561233a565b600060209050601f8311600181146125ab5760008415612599578287015190505b6125a385826123ab565b86555061260b565b601f1984166125b986612156565b60005b828110156125e1578489015182556001820191506020850194506020810190506125bc565b868310156125fe57848901516125fa601f89168261238d565b8355505b6001600288020188555050505b505050505050565b7f6d696e7420746f207a65726f2061646472657373000000000000000000000000600082015250565b60006126496014836119de565b915061265482612613565b602082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b7f746f6b656e20616c7265616479206d696e746564000000000000000000000000600082015250565b60006126b56014836119de565b91506126c08261267f565b602082019050919050565b600060208201905081810360008301526126e4816126a8565b9050919050565b60006126f682611951565b915061270183611951565b925082820190508082111561271957612718611ffa565b5b92915050565b7f55524c20736574206f66206e6f6e6578697374656e7420746f6b656e00000000600082015250565b6000612755601c836119de565b91506127608261271f565b602082019050919050565b6000602082019050818103600083015261278481612748565b905091905056fea2646970667358221220fd0c05e9309ea22159cad7faa8357fabed9c609909ccc80bd530d94ef65ccb3d64736f6c63430008130033"
赏个鸡腿🍗