@bannynet/core-v6 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +53 -0
  2. package/SKILLS.md +94 -0
  3. package/deployments/banny-core-v5/arbitrum/Banny721TokenUriResolver.json +1809 -0
  4. package/deployments/banny-core-v5/arbitrum_sepolia/Banny721TokenUriResolver.json +1795 -0
  5. package/deployments/banny-core-v5/base/Banny721TokenUriResolver.json +1810 -0
  6. package/deployments/banny-core-v5/base_sepolia/Banny721TokenUriResolver.json +1796 -0
  7. package/deployments/banny-core-v5/ethereum/Banny721TokenUriResolver.json +1795 -0
  8. package/deployments/banny-core-v5/optimism/Banny721TokenUriResolver.json +1810 -0
  9. package/deployments/banny-core-v5/optimism_sepolia/Banny721TokenUriResolver.json +1796 -0
  10. package/deployments/banny-core-v5/sepolia/Banny721TokenUriResolver.json +1795 -0
  11. package/foundry.toml +22 -0
  12. package/package.json +53 -0
  13. package/remappings.txt +1 -0
  14. package/script/1.Fix.s.sol +290 -0
  15. package/script/Add.Denver.s.sol +75 -0
  16. package/script/AirdropOutfits.s.sol +2302 -0
  17. package/script/Deploy.s.sol +440 -0
  18. package/script/Drop1.s.sol +979 -0
  19. package/script/MigrationContractArbitrum.sol +494 -0
  20. package/script/MigrationContractArbitrum1.sol +170 -0
  21. package/script/MigrationContractArbitrum2.sol +204 -0
  22. package/script/MigrationContractArbitrum3.sol +174 -0
  23. package/script/MigrationContractArbitrum4.sol +478 -0
  24. package/script/MigrationContractBase1.sol +444 -0
  25. package/script/MigrationContractBase2.sol +175 -0
  26. package/script/MigrationContractBase3.sol +309 -0
  27. package/script/MigrationContractBase4.sol +350 -0
  28. package/script/MigrationContractBase5.sol +259 -0
  29. package/script/MigrationContractEthereum1.sol +468 -0
  30. package/script/MigrationContractEthereum2.sol +306 -0
  31. package/script/MigrationContractEthereum3.sol +349 -0
  32. package/script/MigrationContractEthereum4.sol +352 -0
  33. package/script/MigrationContractEthereum5.sol +354 -0
  34. package/script/MigrationContractEthereum6.sol +270 -0
  35. package/script/MigrationContractEthereum7.sol +439 -0
  36. package/script/MigrationContractEthereum8.sol +385 -0
  37. package/script/MigrationContractOptimism.sol +196 -0
  38. package/script/helpers/BannyverseDeploymentLib.sol +73 -0
  39. package/script/helpers/MigrationHelper.sol +155 -0
  40. package/script/outfit_drop/generate-migration.js +3441 -0
  41. package/script/outfit_drop/raw.json +43276 -0
  42. package/slither-ci.config.json +10 -0
  43. package/sphinx.lock +521 -0
  44. package/src/Banny721TokenUriResolver.sol +1288 -0
  45. package/src/interfaces/IBanny721TokenUriResolver.sol +137 -0
  46. package/test/Banny721TokenUriResolver.t.sol +669 -0
  47. package/test/BannyAttacks.t.sol +322 -0
  48. package/test/DecorateFlow.t.sol +1056 -0
@@ -0,0 +1,478 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
5
+ import {JB721TiersHook} from "@bananapus/721-hook-v5/src/JB721TiersHook.sol";
6
+ import {Banny721TokenUriResolver} from "../src/Banny721TokenUriResolver.sol";
7
+ import {MigrationHelper} from "./helpers/MigrationHelper.sol";
8
+
9
+ /// @notice Migration contract for Arbitrum to handle standalone outfits and backgrounds
10
+ /// that are not worn/used by any banny. These assets are minted to this contract
11
+ /// and then transferred directly to their owners.
12
+ contract MigrationContractArbitrum4 {
13
+ address[] private transferOwners;
14
+
15
+ constructor(address[] memory _transferOwners) {
16
+ transferOwners = _transferOwners;
17
+ }
18
+
19
+ function executeMigration(
20
+ address hookAddress,
21
+ address resolverAddress,
22
+ address v4HookAddress,
23
+ address v4ResolverAddress,
24
+ address fallbackV4ResolverAddress
25
+ )
26
+ external
27
+ {
28
+ // Validate addresses
29
+ require(hookAddress != address(0), "Hook address not set");
30
+ require(resolverAddress != address(0), "Resolver address not set");
31
+ require(v4HookAddress != address(0), "V4 Hook address not set");
32
+ require(v4ResolverAddress != address(0), "V4 Resolver address not set");
33
+ require(fallbackV4ResolverAddress != address(0), "V4 fallback resolver address not set");
34
+
35
+ JB721TiersHook hook = JB721TiersHook(hookAddress);
36
+ IERC721 v4Hook = IERC721(v4HookAddress);
37
+
38
+ // Arbitrum migration - Standalone outfits and backgrounds (176 items)
39
+ // These are assets that are NOT being worn/used by any banny
40
+
41
+ // Assets are already minted to this contract by the deployer
42
+ // V5 token IDs are calculated based on mint order (continuing from previous chunks)
43
+ // V4 token IDs are the original token IDs from V4
44
+
45
+ // Generate token IDs - store both V5 minted token IDs and original V4 token IDs
46
+ uint256[] memory v5TokenIds = new uint256[](transferOwners.length);
47
+ uint256[] memory v4TokenIds = new uint256[](transferOwners.length);
48
+ v5TokenIds[0] = 5_000_000_003; // Minted V5 Token ID
49
+ v4TokenIds[0] = 5_000_000_003; // Original V4 Token ID
50
+ v5TokenIds[1] = 19_000_000_003; // Minted V5 Token ID
51
+ v4TokenIds[1] = 19_000_000_002; // Original V4 Token ID
52
+ v5TokenIds[2] = 19_000_000_004; // Minted V5 Token ID
53
+ v4TokenIds[2] = 19_000_000_004; // Original V4 Token ID
54
+ v5TokenIds[3] = 31_000_000_002; // Minted V5 Token ID
55
+ v4TokenIds[3] = 31_000_000_002; // Original V4 Token ID
56
+ v5TokenIds[4] = 32_000_000_001; // Minted V5 Token ID
57
+ v4TokenIds[4] = 32_000_000_001; // Original V4 Token ID
58
+ v5TokenIds[5] = 39_000_000_001; // Minted V5 Token ID
59
+ v4TokenIds[5] = 39_000_000_001; // Original V4 Token ID
60
+ v5TokenIds[6] = 47_000_000_002; // Minted V5 Token ID
61
+ v4TokenIds[6] = 47_000_000_002; // Original V4 Token ID
62
+ v5TokenIds[7] = 47_000_000_003; // Minted V5 Token ID
63
+ v4TokenIds[7] = 47_000_000_003; // Original V4 Token ID
64
+ v5TokenIds[8] = 47_000_000_004; // Minted V5 Token ID
65
+ v4TokenIds[8] = 47_000_000_004; // Original V4 Token ID
66
+ v5TokenIds[9] = 47_000_000_005; // Minted V5 Token ID
67
+ v4TokenIds[9] = 47_000_000_005; // Original V4 Token ID
68
+ v5TokenIds[10] = 47_000_000_006; // Minted V5 Token ID
69
+ v4TokenIds[10] = 47_000_000_006; // Original V4 Token ID
70
+ v5TokenIds[11] = 47_000_000_007; // Minted V5 Token ID
71
+ v4TokenIds[11] = 47_000_000_007; // Original V4 Token ID
72
+ v5TokenIds[12] = 47_000_000_008; // Minted V5 Token ID
73
+ v4TokenIds[12] = 47_000_000_008; // Original V4 Token ID
74
+ v5TokenIds[13] = 47_000_000_009; // Minted V5 Token ID
75
+ v4TokenIds[13] = 47_000_000_009; // Original V4 Token ID
76
+ v5TokenIds[14] = 47_000_000_010; // Minted V5 Token ID
77
+ v4TokenIds[14] = 47_000_000_010; // Original V4 Token ID
78
+ v5TokenIds[15] = 47_000_000_011; // Minted V5 Token ID
79
+ v4TokenIds[15] = 47_000_000_011; // Original V4 Token ID
80
+ v5TokenIds[16] = 47_000_000_012; // Minted V5 Token ID
81
+ v4TokenIds[16] = 47_000_000_012; // Original V4 Token ID
82
+ v5TokenIds[17] = 47_000_000_013; // Minted V5 Token ID
83
+ v4TokenIds[17] = 47_000_000_013; // Original V4 Token ID
84
+ v5TokenIds[18] = 47_000_000_014; // Minted V5 Token ID
85
+ v4TokenIds[18] = 47_000_000_014; // Original V4 Token ID
86
+ v5TokenIds[19] = 47_000_000_015; // Minted V5 Token ID
87
+ v4TokenIds[19] = 47_000_000_015; // Original V4 Token ID
88
+ v5TokenIds[20] = 47_000_000_016; // Minted V5 Token ID
89
+ v4TokenIds[20] = 47_000_000_016; // Original V4 Token ID
90
+ v5TokenIds[21] = 47_000_000_017; // Minted V5 Token ID
91
+ v4TokenIds[21] = 47_000_000_017; // Original V4 Token ID
92
+ v5TokenIds[22] = 47_000_000_018; // Minted V5 Token ID
93
+ v4TokenIds[22] = 47_000_000_018; // Original V4 Token ID
94
+ v5TokenIds[23] = 47_000_000_019; // Minted V5 Token ID
95
+ v4TokenIds[23] = 47_000_000_019; // Original V4 Token ID
96
+ v5TokenIds[24] = 47_000_000_020; // Minted V5 Token ID
97
+ v4TokenIds[24] = 47_000_000_020; // Original V4 Token ID
98
+ v5TokenIds[25] = 47_000_000_021; // Minted V5 Token ID
99
+ v4TokenIds[25] = 47_000_000_021; // Original V4 Token ID
100
+ v5TokenIds[26] = 47_000_000_022; // Minted V5 Token ID
101
+ v4TokenIds[26] = 47_000_000_022; // Original V4 Token ID
102
+ v5TokenIds[27] = 47_000_000_023; // Minted V5 Token ID
103
+ v4TokenIds[27] = 47_000_000_023; // Original V4 Token ID
104
+ v5TokenIds[28] = 47_000_000_024; // Minted V5 Token ID
105
+ v4TokenIds[28] = 47_000_000_024; // Original V4 Token ID
106
+ v5TokenIds[29] = 47_000_000_025; // Minted V5 Token ID
107
+ v4TokenIds[29] = 47_000_000_025; // Original V4 Token ID
108
+ v5TokenIds[30] = 47_000_000_026; // Minted V5 Token ID
109
+ v4TokenIds[30] = 47_000_000_026; // Original V4 Token ID
110
+ v5TokenIds[31] = 47_000_000_027; // Minted V5 Token ID
111
+ v4TokenIds[31] = 47_000_000_027; // Original V4 Token ID
112
+ v5TokenIds[32] = 49_000_000_002; // Minted V5 Token ID
113
+ v4TokenIds[32] = 49_000_000_001; // Original V4 Token ID
114
+ v5TokenIds[33] = 49_000_000_003; // Minted V5 Token ID
115
+ v4TokenIds[33] = 49_000_000_003; // Original V4 Token ID
116
+ v5TokenIds[34] = 49_000_000_004; // Minted V5 Token ID
117
+ v4TokenIds[34] = 49_000_000_004; // Original V4 Token ID
118
+ v5TokenIds[35] = 49_000_000_005; // Minted V5 Token ID
119
+ v4TokenIds[35] = 49_000_000_005; // Original V4 Token ID
120
+ v5TokenIds[36] = 49_000_000_006; // Minted V5 Token ID
121
+ v4TokenIds[36] = 49_000_000_006; // Original V4 Token ID
122
+ v5TokenIds[37] = 49_000_000_007; // Minted V5 Token ID
123
+ v4TokenIds[37] = 49_000_000_007; // Original V4 Token ID
124
+ v5TokenIds[38] = 49_000_000_008; // Minted V5 Token ID
125
+ v4TokenIds[38] = 49_000_000_008; // Original V4 Token ID
126
+ v5TokenIds[39] = 49_000_000_009; // Minted V5 Token ID
127
+ v4TokenIds[39] = 49_000_000_009; // Original V4 Token ID
128
+ v5TokenIds[40] = 49_000_000_010; // Minted V5 Token ID
129
+ v4TokenIds[40] = 49_000_000_010; // Original V4 Token ID
130
+ v5TokenIds[41] = 49_000_000_011; // Minted V5 Token ID
131
+ v4TokenIds[41] = 49_000_000_011; // Original V4 Token ID
132
+ v5TokenIds[42] = 49_000_000_012; // Minted V5 Token ID
133
+ v4TokenIds[42] = 49_000_000_012; // Original V4 Token ID
134
+ v5TokenIds[43] = 49_000_000_013; // Minted V5 Token ID
135
+ v4TokenIds[43] = 49_000_000_013; // Original V4 Token ID
136
+ v5TokenIds[44] = 49_000_000_014; // Minted V5 Token ID
137
+ v4TokenIds[44] = 49_000_000_014; // Original V4 Token ID
138
+ v5TokenIds[45] = 49_000_000_015; // Minted V5 Token ID
139
+ v4TokenIds[45] = 49_000_000_015; // Original V4 Token ID
140
+ v5TokenIds[46] = 49_000_000_016; // Minted V5 Token ID
141
+ v4TokenIds[46] = 49_000_000_016; // Original V4 Token ID
142
+ v5TokenIds[47] = 49_000_000_017; // Minted V5 Token ID
143
+ v4TokenIds[47] = 49_000_000_017; // Original V4 Token ID
144
+ v5TokenIds[48] = 49_000_000_018; // Minted V5 Token ID
145
+ v4TokenIds[48] = 49_000_000_018; // Original V4 Token ID
146
+ v5TokenIds[49] = 49_000_000_019; // Minted V5 Token ID
147
+ v4TokenIds[49] = 49_000_000_019; // Original V4 Token ID
148
+ v5TokenIds[50] = 49_000_000_020; // Minted V5 Token ID
149
+ v4TokenIds[50] = 49_000_000_020; // Original V4 Token ID
150
+ v5TokenIds[51] = 49_000_000_021; // Minted V5 Token ID
151
+ v4TokenIds[51] = 49_000_000_021; // Original V4 Token ID
152
+ v5TokenIds[52] = 49_000_000_022; // Minted V5 Token ID
153
+ v4TokenIds[52] = 49_000_000_022; // Original V4 Token ID
154
+ v5TokenIds[53] = 49_000_000_023; // Minted V5 Token ID
155
+ v4TokenIds[53] = 49_000_000_023; // Original V4 Token ID
156
+ v5TokenIds[54] = 49_000_000_024; // Minted V5 Token ID
157
+ v4TokenIds[54] = 49_000_000_024; // Original V4 Token ID
158
+ v5TokenIds[55] = 49_000_000_025; // Minted V5 Token ID
159
+ v4TokenIds[55] = 49_000_000_025; // Original V4 Token ID
160
+ v5TokenIds[56] = 49_000_000_026; // Minted V5 Token ID
161
+ v4TokenIds[56] = 49_000_000_026; // Original V4 Token ID
162
+ v5TokenIds[57] = 49_000_000_027; // Minted V5 Token ID
163
+ v4TokenIds[57] = 49_000_000_027; // Original V4 Token ID
164
+ v5TokenIds[58] = 49_000_000_028; // Minted V5 Token ID
165
+ v4TokenIds[58] = 49_000_000_028; // Original V4 Token ID
166
+ v5TokenIds[59] = 49_000_000_029; // Minted V5 Token ID
167
+ v4TokenIds[59] = 49_000_000_029; // Original V4 Token ID
168
+ v5TokenIds[60] = 49_000_000_030; // Minted V5 Token ID
169
+ v4TokenIds[60] = 49_000_000_030; // Original V4 Token ID
170
+ v5TokenIds[61] = 49_000_000_031; // Minted V5 Token ID
171
+ v4TokenIds[61] = 49_000_000_031; // Original V4 Token ID
172
+ v5TokenIds[62] = 49_000_000_032; // Minted V5 Token ID
173
+ v4TokenIds[62] = 49_000_000_032; // Original V4 Token ID
174
+ v5TokenIds[63] = 49_000_000_033; // Minted V5 Token ID
175
+ v4TokenIds[63] = 49_000_000_033; // Original V4 Token ID
176
+ v5TokenIds[64] = 49_000_000_034; // Minted V5 Token ID
177
+ v4TokenIds[64] = 49_000_000_034; // Original V4 Token ID
178
+ v5TokenIds[65] = 49_000_000_035; // Minted V5 Token ID
179
+ v4TokenIds[65] = 49_000_000_035; // Original V4 Token ID
180
+ v5TokenIds[66] = 49_000_000_036; // Minted V5 Token ID
181
+ v4TokenIds[66] = 49_000_000_036; // Original V4 Token ID
182
+ v5TokenIds[67] = 49_000_000_037; // Minted V5 Token ID
183
+ v4TokenIds[67] = 49_000_000_037; // Original V4 Token ID
184
+ v5TokenIds[68] = 49_000_000_038; // Minted V5 Token ID
185
+ v4TokenIds[68] = 49_000_000_038; // Original V4 Token ID
186
+ v5TokenIds[69] = 49_000_000_039; // Minted V5 Token ID
187
+ v4TokenIds[69] = 49_000_000_039; // Original V4 Token ID
188
+ v5TokenIds[70] = 49_000_000_040; // Minted V5 Token ID
189
+ v4TokenIds[70] = 49_000_000_040; // Original V4 Token ID
190
+ v5TokenIds[71] = 49_000_000_041; // Minted V5 Token ID
191
+ v4TokenIds[71] = 49_000_000_041; // Original V4 Token ID
192
+ v5TokenIds[72] = 49_000_000_042; // Minted V5 Token ID
193
+ v4TokenIds[72] = 49_000_000_042; // Original V4 Token ID
194
+ v5TokenIds[73] = 49_000_000_043; // Minted V5 Token ID
195
+ v4TokenIds[73] = 49_000_000_043; // Original V4 Token ID
196
+ v5TokenIds[74] = 49_000_000_044; // Minted V5 Token ID
197
+ v4TokenIds[74] = 49_000_000_044; // Original V4 Token ID
198
+ v5TokenIds[75] = 49_000_000_045; // Minted V5 Token ID
199
+ v4TokenIds[75] = 49_000_000_045; // Original V4 Token ID
200
+ v5TokenIds[76] = 49_000_000_046; // Minted V5 Token ID
201
+ v4TokenIds[76] = 49_000_000_046; // Original V4 Token ID
202
+ v5TokenIds[77] = 49_000_000_047; // Minted V5 Token ID
203
+ v4TokenIds[77] = 49_000_000_047; // Original V4 Token ID
204
+ v5TokenIds[78] = 49_000_000_048; // Minted V5 Token ID
205
+ v4TokenIds[78] = 49_000_000_048; // Original V4 Token ID
206
+ v5TokenIds[79] = 49_000_000_049; // Minted V5 Token ID
207
+ v4TokenIds[79] = 49_000_000_049; // Original V4 Token ID
208
+ v5TokenIds[80] = 49_000_000_050; // Minted V5 Token ID
209
+ v4TokenIds[80] = 49_000_000_050; // Original V4 Token ID
210
+ v5TokenIds[81] = 49_000_000_051; // Minted V5 Token ID
211
+ v4TokenIds[81] = 49_000_000_051; // Original V4 Token ID
212
+ v5TokenIds[82] = 49_000_000_052; // Minted V5 Token ID
213
+ v4TokenIds[82] = 49_000_000_052; // Original V4 Token ID
214
+ v5TokenIds[83] = 49_000_000_053; // Minted V5 Token ID
215
+ v4TokenIds[83] = 49_000_000_053; // Original V4 Token ID
216
+ v5TokenIds[84] = 49_000_000_054; // Minted V5 Token ID
217
+ v4TokenIds[84] = 49_000_000_054; // Original V4 Token ID
218
+ v5TokenIds[85] = 49_000_000_055; // Minted V5 Token ID
219
+ v4TokenIds[85] = 49_000_000_055; // Original V4 Token ID
220
+ v5TokenIds[86] = 49_000_000_056; // Minted V5 Token ID
221
+ v4TokenIds[86] = 49_000_000_056; // Original V4 Token ID
222
+ v5TokenIds[87] = 49_000_000_057; // Minted V5 Token ID
223
+ v4TokenIds[87] = 49_000_000_057; // Original V4 Token ID
224
+ v5TokenIds[88] = 49_000_000_058; // Minted V5 Token ID
225
+ v4TokenIds[88] = 49_000_000_058; // Original V4 Token ID
226
+ v5TokenIds[89] = 49_000_000_059; // Minted V5 Token ID
227
+ v4TokenIds[89] = 49_000_000_059; // Original V4 Token ID
228
+ v5TokenIds[90] = 49_000_000_060; // Minted V5 Token ID
229
+ v4TokenIds[90] = 49_000_000_060; // Original V4 Token ID
230
+ v5TokenIds[91] = 49_000_000_061; // Minted V5 Token ID
231
+ v4TokenIds[91] = 49_000_000_061; // Original V4 Token ID
232
+ v5TokenIds[92] = 49_000_000_062; // Minted V5 Token ID
233
+ v4TokenIds[92] = 49_000_000_062; // Original V4 Token ID
234
+ v5TokenIds[93] = 49_000_000_063; // Minted V5 Token ID
235
+ v4TokenIds[93] = 49_000_000_063; // Original V4 Token ID
236
+ v5TokenIds[94] = 49_000_000_064; // Minted V5 Token ID
237
+ v4TokenIds[94] = 49_000_000_064; // Original V4 Token ID
238
+ v5TokenIds[95] = 49_000_000_065; // Minted V5 Token ID
239
+ v4TokenIds[95] = 49_000_000_065; // Original V4 Token ID
240
+ v5TokenIds[96] = 49_000_000_066; // Minted V5 Token ID
241
+ v4TokenIds[96] = 49_000_000_066; // Original V4 Token ID
242
+ v5TokenIds[97] = 49_000_000_067; // Minted V5 Token ID
243
+ v4TokenIds[97] = 49_000_000_067; // Original V4 Token ID
244
+ v5TokenIds[98] = 49_000_000_068; // Minted V5 Token ID
245
+ v4TokenIds[98] = 49_000_000_068; // Original V4 Token ID
246
+ v5TokenIds[99] = 49_000_000_069; // Minted V5 Token ID
247
+ v4TokenIds[99] = 49_000_000_069; // Original V4 Token ID
248
+ v5TokenIds[100] = 49_000_000_070; // Minted V5 Token ID
249
+ v4TokenIds[100] = 49_000_000_070; // Original V4 Token ID
250
+ v5TokenIds[101] = 49_000_000_071; // Minted V5 Token ID
251
+ v4TokenIds[101] = 49_000_000_071; // Original V4 Token ID
252
+ v5TokenIds[102] = 49_000_000_072; // Minted V5 Token ID
253
+ v4TokenIds[102] = 49_000_000_072; // Original V4 Token ID
254
+ v5TokenIds[103] = 49_000_000_073; // Minted V5 Token ID
255
+ v4TokenIds[103] = 49_000_000_073; // Original V4 Token ID
256
+ v5TokenIds[104] = 49_000_000_074; // Minted V5 Token ID
257
+ v4TokenIds[104] = 49_000_000_074; // Original V4 Token ID
258
+ v5TokenIds[105] = 49_000_000_075; // Minted V5 Token ID
259
+ v4TokenIds[105] = 49_000_000_075; // Original V4 Token ID
260
+ v5TokenIds[106] = 49_000_000_076; // Minted V5 Token ID
261
+ v4TokenIds[106] = 49_000_000_076; // Original V4 Token ID
262
+ v5TokenIds[107] = 49_000_000_077; // Minted V5 Token ID
263
+ v4TokenIds[107] = 49_000_000_077; // Original V4 Token ID
264
+ v5TokenIds[108] = 49_000_000_078; // Minted V5 Token ID
265
+ v4TokenIds[108] = 49_000_000_078; // Original V4 Token ID
266
+ v5TokenIds[109] = 49_000_000_079; // Minted V5 Token ID
267
+ v4TokenIds[109] = 49_000_000_079; // Original V4 Token ID
268
+ v5TokenIds[110] = 49_000_000_080; // Minted V5 Token ID
269
+ v4TokenIds[110] = 49_000_000_080; // Original V4 Token ID
270
+ v5TokenIds[111] = 49_000_000_081; // Minted V5 Token ID
271
+ v4TokenIds[111] = 49_000_000_081; // Original V4 Token ID
272
+ v5TokenIds[112] = 49_000_000_082; // Minted V5 Token ID
273
+ v4TokenIds[112] = 49_000_000_082; // Original V4 Token ID
274
+ v5TokenIds[113] = 49_000_000_083; // Minted V5 Token ID
275
+ v4TokenIds[113] = 49_000_000_083; // Original V4 Token ID
276
+ v5TokenIds[114] = 49_000_000_084; // Minted V5 Token ID
277
+ v4TokenIds[114] = 49_000_000_084; // Original V4 Token ID
278
+ v5TokenIds[115] = 49_000_000_085; // Minted V5 Token ID
279
+ v4TokenIds[115] = 49_000_000_085; // Original V4 Token ID
280
+ v5TokenIds[116] = 49_000_000_086; // Minted V5 Token ID
281
+ v4TokenIds[116] = 49_000_000_086; // Original V4 Token ID
282
+ v5TokenIds[117] = 49_000_000_087; // Minted V5 Token ID
283
+ v4TokenIds[117] = 49_000_000_087; // Original V4 Token ID
284
+ v5TokenIds[118] = 49_000_000_088; // Minted V5 Token ID
285
+ v4TokenIds[118] = 49_000_000_088; // Original V4 Token ID
286
+ v5TokenIds[119] = 49_000_000_089; // Minted V5 Token ID
287
+ v4TokenIds[119] = 49_000_000_089; // Original V4 Token ID
288
+ v5TokenIds[120] = 49_000_000_090; // Minted V5 Token ID
289
+ v4TokenIds[120] = 49_000_000_090; // Original V4 Token ID
290
+ v5TokenIds[121] = 49_000_000_091; // Minted V5 Token ID
291
+ v4TokenIds[121] = 49_000_000_091; // Original V4 Token ID
292
+ v5TokenIds[122] = 49_000_000_092; // Minted V5 Token ID
293
+ v4TokenIds[122] = 49_000_000_092; // Original V4 Token ID
294
+ v5TokenIds[123] = 49_000_000_093; // Minted V5 Token ID
295
+ v4TokenIds[123] = 49_000_000_093; // Original V4 Token ID
296
+ v5TokenIds[124] = 49_000_000_094; // Minted V5 Token ID
297
+ v4TokenIds[124] = 49_000_000_094; // Original V4 Token ID
298
+ v5TokenIds[125] = 49_000_000_095; // Minted V5 Token ID
299
+ v4TokenIds[125] = 49_000_000_095; // Original V4 Token ID
300
+ v5TokenIds[126] = 49_000_000_096; // Minted V5 Token ID
301
+ v4TokenIds[126] = 49_000_000_096; // Original V4 Token ID
302
+ v5TokenIds[127] = 49_000_000_097; // Minted V5 Token ID
303
+ v4TokenIds[127] = 49_000_000_097; // Original V4 Token ID
304
+ v5TokenIds[128] = 49_000_000_098; // Minted V5 Token ID
305
+ v4TokenIds[128] = 49_000_000_098; // Original V4 Token ID
306
+ v5TokenIds[129] = 49_000_000_099; // Minted V5 Token ID
307
+ v4TokenIds[129] = 49_000_000_099; // Original V4 Token ID
308
+ v5TokenIds[130] = 49_000_000_100; // Minted V5 Token ID
309
+ v4TokenIds[130] = 49_000_000_100; // Original V4 Token ID
310
+ v5TokenIds[131] = 49_000_000_101; // Minted V5 Token ID
311
+ v4TokenIds[131] = 49_000_000_101; // Original V4 Token ID
312
+ v5TokenIds[132] = 49_000_000_102; // Minted V5 Token ID
313
+ v4TokenIds[132] = 49_000_000_102; // Original V4 Token ID
314
+ v5TokenIds[133] = 49_000_000_103; // Minted V5 Token ID
315
+ v4TokenIds[133] = 49_000_000_103; // Original V4 Token ID
316
+ v5TokenIds[134] = 49_000_000_104; // Minted V5 Token ID
317
+ v4TokenIds[134] = 49_000_000_104; // Original V4 Token ID
318
+ v5TokenIds[135] = 49_000_000_105; // Minted V5 Token ID
319
+ v4TokenIds[135] = 49_000_000_105; // Original V4 Token ID
320
+ v5TokenIds[136] = 49_000_000_106; // Minted V5 Token ID
321
+ v4TokenIds[136] = 49_000_000_106; // Original V4 Token ID
322
+ v5TokenIds[137] = 49_000_000_107; // Minted V5 Token ID
323
+ v4TokenIds[137] = 49_000_000_107; // Original V4 Token ID
324
+ v5TokenIds[138] = 49_000_000_108; // Minted V5 Token ID
325
+ v4TokenIds[138] = 49_000_000_108; // Original V4 Token ID
326
+ v5TokenIds[139] = 49_000_000_109; // Minted V5 Token ID
327
+ v4TokenIds[139] = 49_000_000_109; // Original V4 Token ID
328
+ v5TokenIds[140] = 49_000_000_110; // Minted V5 Token ID
329
+ v4TokenIds[140] = 49_000_000_110; // Original V4 Token ID
330
+ v5TokenIds[141] = 49_000_000_111; // Minted V5 Token ID
331
+ v4TokenIds[141] = 49_000_000_111; // Original V4 Token ID
332
+ v5TokenIds[142] = 49_000_000_112; // Minted V5 Token ID
333
+ v4TokenIds[142] = 49_000_000_112; // Original V4 Token ID
334
+ v5TokenIds[143] = 49_000_000_113; // Minted V5 Token ID
335
+ v4TokenIds[143] = 49_000_000_113; // Original V4 Token ID
336
+ v5TokenIds[144] = 49_000_000_114; // Minted V5 Token ID
337
+ v4TokenIds[144] = 49_000_000_114; // Original V4 Token ID
338
+ v5TokenIds[145] = 49_000_000_115; // Minted V5 Token ID
339
+ v4TokenIds[145] = 49_000_000_115; // Original V4 Token ID
340
+ v5TokenIds[146] = 49_000_000_116; // Minted V5 Token ID
341
+ v4TokenIds[146] = 49_000_000_116; // Original V4 Token ID
342
+ v5TokenIds[147] = 49_000_000_117; // Minted V5 Token ID
343
+ v4TokenIds[147] = 49_000_000_117; // Original V4 Token ID
344
+ v5TokenIds[148] = 49_000_000_118; // Minted V5 Token ID
345
+ v4TokenIds[148] = 49_000_000_118; // Original V4 Token ID
346
+ v5TokenIds[149] = 49_000_000_119; // Minted V5 Token ID
347
+ v4TokenIds[149] = 49_000_000_119; // Original V4 Token ID
348
+ v5TokenIds[150] = 49_000_000_120; // Minted V5 Token ID
349
+ v4TokenIds[150] = 49_000_000_120; // Original V4 Token ID
350
+ v5TokenIds[151] = 49_000_000_121; // Minted V5 Token ID
351
+ v4TokenIds[151] = 49_000_000_121; // Original V4 Token ID
352
+ v5TokenIds[152] = 49_000_000_122; // Minted V5 Token ID
353
+ v4TokenIds[152] = 49_000_000_122; // Original V4 Token ID
354
+ v5TokenIds[153] = 49_000_000_123; // Minted V5 Token ID
355
+ v4TokenIds[153] = 49_000_000_123; // Original V4 Token ID
356
+ v5TokenIds[154] = 49_000_000_124; // Minted V5 Token ID
357
+ v4TokenIds[154] = 49_000_000_124; // Original V4 Token ID
358
+ v5TokenIds[155] = 49_000_000_125; // Minted V5 Token ID
359
+ v4TokenIds[155] = 49_000_000_125; // Original V4 Token ID
360
+ v5TokenIds[156] = 49_000_000_126; // Minted V5 Token ID
361
+ v4TokenIds[156] = 49_000_000_126; // Original V4 Token ID
362
+ v5TokenIds[157] = 49_000_000_127; // Minted V5 Token ID
363
+ v4TokenIds[157] = 49_000_000_127; // Original V4 Token ID
364
+ v5TokenIds[158] = 49_000_000_128; // Minted V5 Token ID
365
+ v4TokenIds[158] = 49_000_000_128; // Original V4 Token ID
366
+ v5TokenIds[159] = 49_000_000_129; // Minted V5 Token ID
367
+ v4TokenIds[159] = 49_000_000_129; // Original V4 Token ID
368
+ v5TokenIds[160] = 49_000_000_130; // Minted V5 Token ID
369
+ v4TokenIds[160] = 49_000_000_130; // Original V4 Token ID
370
+ v5TokenIds[161] = 49_000_000_131; // Minted V5 Token ID
371
+ v4TokenIds[161] = 49_000_000_131; // Original V4 Token ID
372
+ v5TokenIds[162] = 49_000_000_132; // Minted V5 Token ID
373
+ v4TokenIds[162] = 49_000_000_132; // Original V4 Token ID
374
+ v5TokenIds[163] = 49_000_000_133; // Minted V5 Token ID
375
+ v4TokenIds[163] = 49_000_000_133; // Original V4 Token ID
376
+ v5TokenIds[164] = 49_000_000_134; // Minted V5 Token ID
377
+ v4TokenIds[164] = 49_000_000_134; // Original V4 Token ID
378
+ v5TokenIds[165] = 49_000_000_135; // Minted V5 Token ID
379
+ v4TokenIds[165] = 49_000_000_135; // Original V4 Token ID
380
+ v5TokenIds[166] = 49_000_000_136; // Minted V5 Token ID
381
+ v4TokenIds[166] = 49_000_000_136; // Original V4 Token ID
382
+ v5TokenIds[167] = 49_000_000_137; // Minted V5 Token ID
383
+ v4TokenIds[167] = 49_000_000_137; // Original V4 Token ID
384
+ v5TokenIds[168] = 49_000_000_138; // Minted V5 Token ID
385
+ v4TokenIds[168] = 49_000_000_138; // Original V4 Token ID
386
+ v5TokenIds[169] = 49_000_000_139; // Minted V5 Token ID
387
+ v4TokenIds[169] = 49_000_000_139; // Original V4 Token ID
388
+ v5TokenIds[170] = 49_000_000_140; // Minted V5 Token ID
389
+ v4TokenIds[170] = 49_000_000_140; // Original V4 Token ID
390
+ v5TokenIds[171] = 49_000_000_141; // Minted V5 Token ID
391
+ v4TokenIds[171] = 49_000_000_141; // Original V4 Token ID
392
+ v5TokenIds[172] = 49_000_000_142; // Minted V5 Token ID
393
+ v4TokenIds[172] = 49_000_000_142; // Original V4 Token ID
394
+ v5TokenIds[173] = 49_000_000_143; // Minted V5 Token ID
395
+ v4TokenIds[173] = 49_000_000_143; // Original V4 Token ID
396
+ v5TokenIds[174] = 49_000_000_144; // Minted V5 Token ID
397
+ v4TokenIds[174] = 49_000_000_144; // Original V4 Token ID
398
+ v5TokenIds[175] = 49_000_000_145; // Minted V5 Token ID
399
+ v4TokenIds[175] = 49_000_000_145; // Original V4 Token ID
400
+
401
+ uint256 successfulTransfers = 0;
402
+
403
+ for (uint256 i = 0; i < transferOwners.length; i++) {
404
+ uint256 v5TokenId = v5TokenIds[i];
405
+ uint256 v4TokenId = v4TokenIds[i];
406
+
407
+ // Verify V4 ownership using the original V4 token ID
408
+ // This will revert if the token doesn't exist, which indicates a data issue
409
+ address v4Owner = v4Hook.ownerOf(v4TokenId);
410
+ address expectedOwner = transferOwners[i];
411
+
412
+ // If V4 owner is the main resolver, this token is being worn/used and shouldn't be in unused assets
413
+ // contract
414
+ require(
415
+ v4Owner != address(v4ResolverAddress),
416
+ "Token owned by main resolver in V4 - should not be in unused assets contract"
417
+ );
418
+
419
+ // Special case: If V4 owner is the fallback resolver BUT expected owner is NOT a resolver,
420
+ // this is valid - the asset is being worn in V4 but we're minting directly to the actual owner in V5
421
+ // raw.json already accounts for this and has the correct owner
422
+ if (v4Owner == address(fallbackV4ResolverAddress)) {
423
+ // Allow if expected owner is not a resolver (we're minting directly to owner in V5)
424
+ require(
425
+ expectedOwner != address(v4ResolverAddress) && expectedOwner != address(fallbackV4ResolverAddress),
426
+ "Token owned by fallback resolver in V4 but expected owner is also a resolver - should not be in unused assets contract"
427
+ );
428
+ // Skip ownership verification in this case - we trust raw.json
429
+ } else {
430
+ // For all other cases, verify V4 owner matches expected owner
431
+ require(v4Owner == expectedOwner, "V4/V5 ownership mismatch for token");
432
+ }
433
+
434
+ // Verify this contract owns the V5 token before transferring
435
+ require(hook.ownerOf(v5TokenId) == address(this), "Contract does not own token");
436
+
437
+ // Transfer using the minted V5 token ID
438
+ IERC721(address(hook)).safeTransferFrom(address(this), transferOwners[i], v5TokenId);
439
+ successfulTransfers++;
440
+ }
441
+
442
+ // Verify all expected items were transferred
443
+ require(successfulTransfers == transferOwners.length, "Not all items were transferred");
444
+
445
+ // Final verification: Ensure this contract no longer owns any tokens
446
+ // This ensures all transfers completed successfully and no tokens were left behind
447
+ require(hook.balanceOf(address(this)) == 0, "Contract still owns tokens after migration");
448
+
449
+ // Verify tier balances: V5 should never exceed V4 (except for tiers owned by fallback resolver in V4)
450
+
451
+ // // Collect unique owners
452
+ // address[] memory uniqueOwners = new address[](3);
453
+
454
+ // uniqueOwners[0] = 0x7C3F14075F6477fea1aF6cf59f325afDfcD3Ddf7;
455
+ // uniqueOwners[1] = 0x1C51517d8277C9aD6d701Fb5394ceC0C18219eDb;
456
+ // uniqueOwners[2] = 0x57a482EA32c7F75A9C0734206f5BD4f9BCb38e12;
457
+
458
+ // // Collect unique tier IDs
459
+ // uint256[] memory uniqueTierIds = new uint256[](7);
460
+
461
+ // uniqueTierIds[0] = 5;
462
+ // uniqueTierIds[1] = 19;
463
+ // uniqueTierIds[2] = 31;
464
+ // uniqueTierIds[3] = 32;
465
+ // uniqueTierIds[4] = 39;
466
+ // uniqueTierIds[5] = 47;
467
+ // uniqueTierIds[6] = 49;
468
+
469
+ // // Verify tier balances: V5 should never exceed V4 (except for tiers owned by fallback resolver in V4)
470
+ // MigrationHelper.verifyTierBalances(
471
+ // hookAddress,
472
+ // v4HookAddress,
473
+ // fallbackV4ResolverAddress,
474
+ // uniqueOwners,
475
+ // uniqueTierIds
476
+ // );
477
+ }
478
+ }