-
Notifications
You must be signed in to change notification settings - Fork 0
/
erc721.go
405 lines (404 loc) · 20.9 KB
/
erc721.go
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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
package meta
const (
DefaultERC721ABI = `[
{
"inputs": [
{
"internalType": "string",
"name": "_name",
"type": "string"
},
{
"internalType": "string",
"name": "_symbol",
"type": "string"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "approved",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "ApprovalForAll",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "approve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"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": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "isApprovedForAll",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ownerOf",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "_data",
"type": "bytes"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "setApprovalForAll",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]`
DefaultERC721Bytecode = "0x60806040523480156200001157600080fd5b50604051620019983803806200199883398101604081905262000034916200022f565b8151829082906200004d906000906020850190620000de565b50805162000063906001906020840190620000de565b505050620000806200007a6200008860201b60201c565b6200008c565b5050620002e9565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000ec9062000296565b90600052602060002090601f0160209004810192826200011057600085556200015b565b82601f106200012b57805160ff19168380011785556200015b565b828001600101855582156200015b579182015b828111156200015b5782518255916020019190600101906200013e565b50620001699291506200016d565b5090565b5b808211156200016957600081556001016200016e565b600082601f83011262000195578081fd5b81516001600160401b0380821115620001b257620001b2620002d3565b6040516020601f8401601f1916820181018381118382101715620001da57620001da620002d3565b6040528382528584018101871015620001f1578485fd5b8492505b83831015620002145785830181015182840182015291820191620001f5565b838311156200022557848185840101525b5095945050505050565b6000806040838503121562000242578182fd5b82516001600160401b038082111562000259578384fd5b620002678683870162000184565b935060208501519150808211156200027d578283fd5b506200028c8582860162000184565b9150509250929050565b600281046001821680620002ab57607f821691505b60208210811415620002cd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61169f80620002f96000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063715018a611610097578063b88d4fde11610066578063b88d4fde146101fc578063c87b56dd1461020f578063e985e9c514610222578063f2fde38b1461023557610100565b8063715018a6146101d15780638da5cb5b146101d957806395d89b41146101e1578063a22cb465146101e957610100565b806323b872dd116100d357806323b872dd1461017857806342842e0e1461018b5780636352211e1461019e57806370a08231146101b157610100565b806301ffc9a71461010557806306fdde031461012e578063081812fc14610143578063095ea7b314610163575b600080fd5b610118610113366004610f78565b610248565b6040516101259190611074565b60405180910390f35b610136610290565b604051610125919061107f565b610156610151366004610fb0565b610322565b6040516101259190611023565b610176610171366004610f4f565b61036e565b005b610176610186366004610e0e565b610406565b610176610199366004610e0e565b610488565b6101566101ac366004610fb0565b6104a3565b6101c46101bf366004610dc2565b6104d8565b604051610125919061152f565b61017661051c565b610156610567565b610136610576565b6101766101f7366004610f15565b610585565b61017661020a366004610e49565b61059b565b61013661021d366004610fb0565b6105da565b610118610230366004610ddc565b61065d565b610176610243366004610dc2565b61068b565b60006001600160e01b031982166380ac58cd60e01b148061027957506001600160e01b03198216635b5e139f60e01b145b806102885750610288826106fc565b90505b919050565b60606000805461029f906115a7565b80601f01602080910402602001604051908101604052809291908181526020018280546102cb906115a7565b80156103185780601f106102ed57610100808354040283529160200191610318565b820191906000526020600020905b8154815290600101906020018083116102fb57829003601f168201915b5050505050905090565b600061032d82610715565b6103525760405162461bcd60e51b81526004016103499061134d565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610379826104a3565b9050806001600160a01b0316836001600160a01b031614156103ad5760405162461bcd60e51b815260040161034990611466565b806001600160a01b03166103bf610732565b6001600160a01b031614806103db57506103db81610230610732565b6103f75760405162461bcd60e51b815260040161034990611228565b6104018383610736565b505050565b61040f81610715565b15801561043b575061041f610732565b6001600160a01b0316610430610567565b6001600160a01b0316145b1561044f5761044a82826107a4565b610401565b61046061045a610732565b82610883565b156104705761044a838383610908565b60405162461bcd60e51b8152600401610349906114f8565b6104018383836040518060200160405280600081525061059b565b6000818152600260205260408120546001600160a01b0316806102885760405162461bcd60e51b8152600401610349906112cf565b60006001600160a01b0382166105005760405162461bcd60e51b815260040161034990611285565b506001600160a01b031660009081526003602052604090205490565b610524610732565b6001600160a01b0316610535610567565b6001600160a01b03161461055b5760405162461bcd60e51b815260040161034990611399565b6105656000610a35565b565b6006546001600160a01b031690565b60606001805461029f906115a7565b610597610590610732565b8383610a87565b5050565b6105ac6105a6610732565b83610883565b6105c85760405162461bcd60e51b8152600401610349906114a7565b6105d484848484610b2a565b50505050565b60606105e582610715565b6106015760405162461bcd60e51b815260040161034990611417565b600061060b610b5d565b9050600081511161062b5760405180602001604052806000815250610656565b8061063584610b6f565b604051602001610646929190610ff4565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610693610732565b6001600160a01b03166106a4610567565b6001600160a01b0316146106ca5760405162461bcd60e51b815260040161034990611399565b6001600160a01b0381166106f05760405162461bcd60e51b8152600401610349906110e4565b6106f981610a35565b50565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061076b826104a3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b0382166107ca5760405162461bcd60e51b815260040161034990611318565b6107d381610715565b156107f05760405162461bcd60e51b81526004016103499061112a565b6107fc60008383610401565b6001600160a01b0382166000908152600360205260408120805460019290610825908490611538565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600061088e82610715565b6108aa5760405162461bcd60e51b8152600401610349906111dc565b60006108b5836104a3565b9050806001600160a01b0316846001600160a01b031614806108f05750836001600160a01b03166108e584610322565b6001600160a01b0316145b806109005750610900818561065d565b949350505050565b826001600160a01b031661091b826104a3565b6001600160a01b0316146109415760405162461bcd60e51b8152600401610349906113ce565b6001600160a01b0382166109675760405162461bcd60e51b815260040161034990611161565b610972838383610401565b61097d600082610736565b6001600160a01b03831660009081526003602052604081208054600192906109a6908490611564565b90915550506001600160a01b03821660009081526003602052604081208054600192906109d4908490611538565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415610ab95760405162461bcd60e51b8152600401610349906111a5565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610b1d908590611074565b60405180910390a3505050565b610b35848484610908565b610b4184848484610c8a565b6105d45760405162461bcd60e51b815260040161034990611092565b60408051602081019091526000815290565b606081610b9457506040805180820190915260018152600360fc1b602082015261028b565b8160005b8115610bbe5780610ba8816115e2565b9150610bb79050600a83611550565b9150610b98565b60008167ffffffffffffffff811115610be757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610c11576020820181803683370190505b5090505b841561090057610c26600183611564565b9150610c33600a866115fd565b610c3e906030611538565b60f81b818381518110610c6157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350610c83600a86611550565b9450610c15565b6000610c9e846001600160a01b0316610da5565b15610d9a57836001600160a01b031663150b7a02610cba610732565b8786866040518563ffffffff1660e01b8152600401610cdc9493929190611037565b602060405180830381600087803b158015610cf657600080fd5b505af1925050508015610d26575060408051601f3d908101601f19168201909252610d2391810190610f94565b60015b610d80573d808015610d54576040519150601f19603f3d011682016040523d82523d6000602084013e610d59565b606091505b508051610d785760405162461bcd60e51b815260040161034990611092565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610900565b506001949350505050565b3b151590565b80356001600160a01b038116811461028b57600080fd5b600060208284031215610dd3578081fd5b61065682610dab565b60008060408385031215610dee578081fd5b610df783610dab565b9150610e0560208401610dab565b90509250929050565b600080600060608486031215610e22578081fd5b610e2b84610dab565b9250610e3960208501610dab565b9150604084013590509250925092565b60008060008060808587031215610e5e578081fd5b610e6785610dab565b93506020610e76818701610dab565b935060408601359250606086013567ffffffffffffffff80821115610e99578384fd5b818801915088601f830112610eac578384fd5b813581811115610ebe57610ebe61163d565b604051601f8201601f1916810185018381118282101715610ee157610ee161163d565b60405281815283820185018b1015610ef7578586fd5b81858501868301379081019093019390935250939692955090935050565b60008060408385031215610f27578182fd5b610f3083610dab565b915060208301358015158114610f44578182fd5b809150509250929050565b60008060408385031215610f61578182fd5b610f6a83610dab565b946020939093013593505050565b600060208284031215610f89578081fd5b813561065681611653565b600060208284031215610fa5578081fd5b815161065681611653565b600060208284031215610fc1578081fd5b5035919050565b60008151808452610fe081602086016020860161157b565b601f01601f19169290920160200192915050565b6000835161100681846020880161157b565b83519083019061101a81836020880161157b565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061106a90830184610fc8565b9695505050505050565b901515815260200190565b6000602082526106566020830184610fc8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601a908201527f4e6f74206f776e657220616e64206e6f7420617070726f766564000000000000604082015260600190565b90815260200190565b6000821982111561154b5761154b611611565b500190565b60008261155f5761155f611627565b500490565b60008282101561157657611576611611565b500390565b60005b8381101561159657818101518382015260200161157e565b838111156105d45750506000910152565b6002810460018216806115bb57607f821691505b602082108114156115dc57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156115f6576115f6611611565b5060010190565b60008261160c5761160c611627565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146106f957600080fdfea26469706673582212201c870867531b9ed6dd6d1f48aa1ba37f0a79bf10e91f72c0b30b13fa0c83a52164736f6c63430008000033"
)