create-dubhe 1.2.0-pre.98 → 2.0.0

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 (361) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/cli.js.map +1 -1
  3. package/package.json +16 -16
  4. package/templates/101/sui-template/docker-compose.testnet.yml +73 -0
  5. package/templates/101/sui-template/packages/client/src/app/page.tsx +545 -41
  6. package/templates/101/sui-template/packages/client/src/app/providers.tsx +12 -4
  7. package/templates/101/sui-template/packages/contracts/Pub.localnet.toml +4 -4
  8. package/templates/101/sui-template/packages/contracts/counter.lock.json +20 -0
  9. package/templates/101/sui-template/packages/contracts/deployment.ts +8 -3
  10. package/templates/101/sui-template/packages/contracts/dubhe.config.json +59 -13
  11. package/templates/101/sui-template/packages/contracts/dubhe.config.ts +1 -4
  12. package/templates/101/sui-template/packages/contracts/metadata.json +1015 -68
  13. package/templates/101/sui-template/packages/contracts/package.json +7 -4
  14. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/dapp_key.move +45 -31
  15. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/error.move +8 -0
  16. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/genesis.move +30 -13
  17. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/init_test.move +19 -14
  18. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/resources/counter2.move +198 -0
  19. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/resources/counter2withkey.move +90 -0
  20. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/resources/value.move +30 -20
  21. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/user_storage_init.move +26 -0
  22. package/templates/101/sui-template/packages/contracts/src/counter/sources/scripts/deploy_hook.move +6 -11
  23. package/templates/101/sui-template/packages/contracts/src/counter/sources/systems/counter.move +23 -11
  24. package/templates/101/sui-template/packages/contracts/src/counter/sources/tests/counter.move +15 -14
  25. package/templates/101/sui-template/packages/contracts/src/dubhe/Move.lock +33 -30
  26. package/templates/101/sui-template/packages/contracts/src/dubhe/Move.toml +8 -3
  27. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/dapp_key.move +45 -31
  28. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/error.move +170 -0
  29. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/genesis.move +16 -13
  30. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/init_test.move +8 -14
  31. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/core/account_key.move +1 -3
  32. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/core/dapp_service.move +1776 -137
  33. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/core/data_key.move +1 -20
  34. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/core/events.move +864 -25
  35. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/scripts/deploy_hook.move +15 -16
  36. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/scripts/migrate.move +0 -3
  37. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/systems/address_system.move +25 -17
  38. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/systems/dapp_system.move +2802 -343
  39. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/systems/utils.move +1 -1
  40. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/address.move +173 -55
  41. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/dapp_test.move +769 -0
  42. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/fee_test.move +2965 -0
  43. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/integration_test.move +303 -0
  44. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/listing_test.move +1422 -0
  45. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/scene_session_test.move +269 -0
  46. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/session_test.move +624 -0
  47. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/storage_test.move +700 -0
  48. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/typed_object_test.move +177 -0
  49. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/typed_scene_test.move +452 -0
  50. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/tests/user_storage_test.move +160 -0
  51. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/utils/math.move +4 -3
  52. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/utils/type_info.move +2 -2
  53. package/templates/contract/sui-template/dubhe.config.ts +0 -1
  54. package/templates/contract/sui-template/package.json +3 -3
  55. package/templates/contract/sui-template/src/dubhe/Move.lock +33 -30
  56. package/templates/contract/sui-template/src/dubhe/Move.toml +8 -3
  57. package/templates/contract/sui-template/src/dubhe/sources/codegen/dapp_key.move +45 -31
  58. package/templates/contract/sui-template/src/dubhe/sources/codegen/error.move +170 -0
  59. package/templates/contract/sui-template/src/dubhe/sources/codegen/genesis.move +16 -13
  60. package/templates/contract/sui-template/src/dubhe/sources/codegen/init_test.move +8 -14
  61. package/templates/contract/sui-template/src/dubhe/sources/core/account_key.move +1 -3
  62. package/templates/contract/sui-template/src/dubhe/sources/core/dapp_service.move +1776 -137
  63. package/templates/contract/sui-template/src/dubhe/sources/core/data_key.move +1 -20
  64. package/templates/contract/sui-template/src/dubhe/sources/core/events.move +864 -25
  65. package/templates/contract/sui-template/src/dubhe/sources/scripts/deploy_hook.move +15 -16
  66. package/templates/contract/sui-template/src/dubhe/sources/scripts/migrate.move +0 -3
  67. package/templates/contract/sui-template/src/dubhe/sources/systems/address_system.move +25 -17
  68. package/templates/contract/sui-template/src/dubhe/sources/systems/dapp_system.move +2802 -343
  69. package/templates/contract/sui-template/src/dubhe/sources/systems/utils.move +1 -1
  70. package/templates/contract/sui-template/src/dubhe/sources/tests/address.move +173 -55
  71. package/templates/contract/sui-template/src/dubhe/sources/tests/dapp_test.move +769 -0
  72. package/templates/contract/sui-template/src/dubhe/sources/tests/fee_test.move +2965 -0
  73. package/templates/contract/sui-template/src/dubhe/sources/tests/integration_test.move +303 -0
  74. package/templates/contract/sui-template/src/dubhe/sources/tests/listing_test.move +1422 -0
  75. package/templates/contract/sui-template/src/dubhe/sources/tests/scene_session_test.move +269 -0
  76. package/templates/contract/sui-template/src/dubhe/sources/tests/session_test.move +624 -0
  77. package/templates/contract/sui-template/src/dubhe/sources/tests/storage_test.move +700 -0
  78. package/templates/contract/sui-template/src/dubhe/sources/tests/typed_object_test.move +177 -0
  79. package/templates/contract/sui-template/src/dubhe/sources/tests/typed_scene_test.move +452 -0
  80. package/templates/contract/sui-template/src/dubhe/sources/tests/user_storage_test.move +160 -0
  81. package/templates/contract/sui-template/src/dubhe/sources/utils/math.move +4 -3
  82. package/templates/contract/sui-template/src/dubhe/sources/utils/type_info.move +2 -2
  83. package/templates/contract/sui-template/src/template/Move.toml +12 -0
  84. package/templates/contract/sui-template/src/template/sources/codegen/dapp_key.move +47 -0
  85. package/templates/contract/sui-template/src/template/sources/codegen/genesis.move +34 -0
  86. package/templates/contract/sui-template/src/template/sources/codegen/init_test.move +23 -0
  87. package/templates/contract/sui-template/src/template/sources/codegen/user_storage_init.move +27 -0
  88. package/templates/contract/sui-template/src/template/sources/scripts/deploy_hook.move +13 -0
  89. package/templates/contract/sui-template/src/template/sources/scripts/migrate.move +7 -0
  90. package/templates/nextjs/sui-card-duel/.gitignore_ +51 -0
  91. package/templates/nextjs/sui-card-duel/README.md +213 -0
  92. package/templates/nextjs/sui-card-duel/docker-compose.yml +34 -0
  93. package/templates/nextjs/sui-card-duel/mprocs.yaml +17 -0
  94. package/templates/nextjs/sui-card-duel/package.json +43 -0
  95. package/templates/nextjs/sui-card-duel/packages/client/.gitignore_ +48 -0
  96. package/templates/nextjs/sui-card-duel/packages/client/.prettierignore +1 -0
  97. package/templates/nextjs/sui-card-duel/packages/client/.prettierrc.json +8 -0
  98. package/templates/nextjs/sui-card-duel/packages/client/eslint.config.mjs +22 -0
  99. package/templates/nextjs/sui-card-duel/packages/client/next.config.mjs +8 -0
  100. package/templates/nextjs/sui-card-duel/packages/client/package.json +47 -0
  101. package/templates/nextjs/sui-card-duel/packages/client/postcss.config.mjs +8 -0
  102. package/templates/nextjs/sui-card-duel/packages/client/src/app/admin/ArenaPanel.tsx +307 -0
  103. package/templates/nextjs/sui-card-duel/packages/client/src/app/admin/page.tsx +622 -0
  104. package/templates/nextjs/sui-card-duel/packages/client/src/app/brawl/[id]/page.tsx +559 -0
  105. package/templates/nextjs/sui-card-duel/packages/client/src/app/collection/page.tsx +202 -0
  106. package/templates/nextjs/sui-card-duel/packages/client/src/app/components/CardView.tsx +66 -0
  107. package/templates/nextjs/sui-card-duel/packages/client/src/app/components/GameShell.tsx +294 -0
  108. package/templates/nextjs/sui-card-duel/packages/client/src/app/components/icons.tsx +101 -0
  109. package/templates/nextjs/sui-card-duel/packages/client/src/app/duel/[id]/page.tsx +477 -0
  110. package/templates/nextjs/sui-card-duel/packages/client/src/app/favicon.ico +0 -0
  111. package/templates/nextjs/sui-card-duel/packages/client/src/app/globals.css +85 -0
  112. package/templates/nextjs/sui-card-duel/packages/client/src/app/hooks/useGame.ts +313 -0
  113. package/templates/nextjs/sui-card-duel/packages/client/src/app/layout.tsx +24 -0
  114. package/templates/nextjs/sui-card-duel/packages/client/src/app/leaderboard/page.tsx +123 -0
  115. package/templates/nextjs/sui-card-duel/packages/client/src/app/lib/game.ts +77 -0
  116. package/templates/nextjs/sui-card-duel/packages/client/src/app/lib/scenes.ts +226 -0
  117. package/templates/nextjs/sui-card-duel/packages/client/src/app/market/page.tsx +418 -0
  118. package/templates/nextjs/sui-card-duel/packages/client/src/app/page.tsx +427 -0
  119. package/templates/nextjs/sui-card-duel/packages/client/src/app/providers.tsx +69 -0
  120. package/templates/nextjs/sui-card-duel/packages/client/tailwind.config.ts +21 -0
  121. package/templates/nextjs/sui-card-duel/packages/client/tsconfig.json +30 -0
  122. package/templates/nextjs/sui-card-duel/packages/contracts/.gitignore_ +51 -0
  123. package/templates/nextjs/sui-card-duel/packages/contracts/.prettierignore +1 -0
  124. package/templates/nextjs/sui-card-duel/packages/contracts/.prettierrc.json +8 -0
  125. package/templates/nextjs/sui-card-duel/packages/contracts/Dockerfile +5 -0
  126. package/templates/nextjs/sui-card-duel/packages/contracts/Pub.localnet.toml +13 -0
  127. package/templates/nextjs/sui-card-duel/packages/contracts/card_duel.lock.json +66 -0
  128. package/templates/nextjs/sui-card-duel/packages/contracts/docker-compose.yml +34 -0
  129. package/templates/nextjs/sui-card-duel/packages/contracts/dubhe.config.ts +150 -0
  130. package/templates/nextjs/sui-card-duel/packages/contracts/logs/combined.log +31383 -0
  131. package/templates/nextjs/sui-card-duel/packages/contracts/package.json +49 -0
  132. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/config.ts +17 -0
  133. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/e2e-brawl.ts +270 -0
  134. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/e2e-duel.ts +272 -0
  135. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/e2e-lobby.ts +177 -0
  136. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/e2e-market.ts +219 -0
  137. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/e2e-session.ts +342 -0
  138. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/query-dapp-revenue.ts +95 -0
  139. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/seed.ts +92 -0
  140. package/templates/nextjs/sui-card-duel/packages/contracts/scripts/withdraw-dapp-revenue.ts +56 -0
  141. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/Move.toml +15 -0
  142. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/dapp_key.move +46 -0
  143. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/enums/card_kind.move +47 -0
  144. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/enums/match_state.move +37 -0
  145. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/enums/rarity.move +37 -0
  146. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/error.move +126 -0
  147. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/genesis.move +33 -0
  148. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/init_test.move +23 -0
  149. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/objects/arena.move +137 -0
  150. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/permits/brawl_permit.move +125 -0
  151. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/permits/duel_permit.move +125 -0
  152. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/resources/battle_state.move +255 -0
  153. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/resources/card.move +282 -0
  154. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/resources/deck.move +64 -0
  155. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/resources/game_config.move +267 -0
  156. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/resources/gold.move +205 -0
  157. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/resources/profile.move +255 -0
  158. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/scenes/brawl.move +313 -0
  159. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/scenes/duel.move +313 -0
  160. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/codegen/user_storage_init.move +26 -0
  161. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/scripts/deploy_hook.move +32 -0
  162. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/scripts/migrate.move +7 -0
  163. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/systems/arena_system.move +57 -0
  164. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/systems/brawl_system.move +559 -0
  165. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/systems/card_system.move +146 -0
  166. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/systems/duel_system.move +515 -0
  167. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/systems/market_system.move +115 -0
  168. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/systems/player_system.move +37 -0
  169. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/tests/brawl_tests.move +385 -0
  170. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/tests/duel_tests.move +656 -0
  171. package/templates/nextjs/sui-card-duel/packages/contracts/src/card_duel/sources/tests/test_helpers.move +31 -0
  172. package/templates/nextjs/sui-card-duel/packages/contracts/sui-indexer-schema.graphql +5973 -0
  173. package/templates/nextjs/sui-card-duel/pnpm-workspace.yaml +2 -0
  174. package/templates/nextjs/sui-farm/.gitignore_ +51 -0
  175. package/templates/nextjs/sui-farm/README.md +15 -0
  176. package/templates/nextjs/sui-farm/UPGRADE_NOTES.md +97 -0
  177. package/templates/nextjs/sui-farm/docker-compose.yml +34 -0
  178. package/templates/nextjs/sui-farm/mprocs.yaml +17 -0
  179. package/templates/nextjs/sui-farm/package.json +43 -0
  180. package/templates/nextjs/sui-farm/packages/client/.gitignore_ +48 -0
  181. package/templates/nextjs/sui-farm/packages/client/.prettierignore +1 -0
  182. package/templates/nextjs/sui-farm/packages/client/.prettierrc.json +8 -0
  183. package/templates/nextjs/sui-farm/packages/client/eslint.config.mjs +22 -0
  184. package/templates/nextjs/sui-farm/packages/client/next.config.mjs +8 -0
  185. package/templates/nextjs/sui-farm/packages/client/package.json +47 -0
  186. package/templates/nextjs/sui-farm/packages/client/postcss.config.mjs +8 -0
  187. package/templates/nextjs/sui-farm/packages/client/src/app/admin/page.tsx +618 -0
  188. package/templates/nextjs/sui-farm/packages/client/src/app/components/FarmLand.tsx +526 -0
  189. package/templates/nextjs/sui-farm/packages/client/src/app/components/FarmPlotCard.tsx +215 -0
  190. package/templates/nextjs/sui-farm/packages/client/src/app/components/PetAvatar.tsx +868 -0
  191. package/templates/nextjs/sui-farm/packages/client/src/app/components/PetPanel.tsx +1360 -0
  192. package/templates/nextjs/sui-farm/packages/client/src/app/components/PlantModal.tsx +147 -0
  193. package/templates/nextjs/sui-farm/packages/client/src/app/components/ProxyCard.tsx +684 -0
  194. package/templates/nextjs/sui-farm/packages/client/src/app/components/RanchLand.tsx +822 -0
  195. package/templates/nextjs/sui-farm/packages/client/src/app/components/ResourceHUD.tsx +125 -0
  196. package/templates/nextjs/sui-farm/packages/client/src/app/components/ShopPanel.tsx +232 -0
  197. package/templates/nextjs/sui-farm/packages/client/src/app/components/icons/GameIcons.tsx +574 -0
  198. package/templates/nextjs/sui-farm/packages/client/src/app/favicon.ico +0 -0
  199. package/templates/nextjs/sui-farm/packages/client/src/app/globals.css +423 -0
  200. package/templates/nextjs/sui-farm/packages/client/src/app/hooks/useWorldPermitId.ts +66 -0
  201. package/templates/nextjs/sui-farm/packages/client/src/app/layout.tsx +23 -0
  202. package/templates/nextjs/sui-farm/packages/client/src/app/leaderboard/page.tsx +185 -0
  203. package/templates/nextjs/sui-farm/packages/client/src/app/lib/crops.ts +97 -0
  204. package/templates/nextjs/sui-farm/packages/client/src/app/market/page.tsx +763 -0
  205. package/templates/nextjs/sui-farm/packages/client/src/app/page.tsx +1173 -0
  206. package/templates/nextjs/sui-farm/packages/client/src/app/providers.tsx +69 -0
  207. package/templates/nextjs/sui-farm/packages/client/src/app/state/index.tsx +5 -0
  208. package/templates/nextjs/sui-farm/packages/client/tailwind.config.ts +25 -0
  209. package/templates/nextjs/sui-farm/packages/client/tsconfig.json +30 -0
  210. package/templates/nextjs/sui-farm/packages/contracts/.gitignore_ +51 -0
  211. package/templates/nextjs/sui-farm/packages/contracts/.prettierignore +1 -0
  212. package/templates/nextjs/sui-farm/packages/contracts/.prettierrc.json +8 -0
  213. package/templates/nextjs/sui-farm/packages/contracts/Dockerfile +5 -0
  214. package/templates/nextjs/sui-farm/packages/contracts/Pub.localnet.toml +13 -0
  215. package/templates/nextjs/sui-farm/packages/contracts/counter.lock.json +14 -0
  216. package/templates/nextjs/sui-farm/packages/contracts/docker-compose.yml +34 -0
  217. package/templates/nextjs/sui-farm/packages/contracts/dubhe.config.ts +178 -0
  218. package/templates/nextjs/sui-farm/packages/contracts/harvest.lock.json +120 -0
  219. package/templates/nextjs/sui-farm/packages/contracts/package.json +48 -0
  220. package/templates/nextjs/sui-farm/packages/contracts/scripts/config.ts +17 -0
  221. package/templates/nextjs/sui-farm/packages/contracts/scripts/query-dapp-revenue.ts +95 -0
  222. package/templates/nextjs/sui-farm/packages/contracts/scripts/read-permit.ts +72 -0
  223. package/templates/nextjs/sui-farm/packages/contracts/scripts/seed.ts +85 -0
  224. package/templates/nextjs/sui-farm/packages/contracts/scripts/withdraw-dapp-revenue.ts +56 -0
  225. package/templates/nextjs/sui-farm/packages/contracts/src/counter/Move.toml +14 -0
  226. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/codegen/dapp_key.move +31 -0
  227. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/codegen/error.move +10 -0
  228. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/codegen/genesis.move +33 -0
  229. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/codegen/init_test.move +23 -0
  230. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/codegen/resources/counter1.move +64 -0
  231. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/codegen/resources/counter2.move +70 -0
  232. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/codegen/user_storage_init.move +26 -0
  233. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/scripts/deploy_hook.move +8 -0
  234. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/scripts/migrate.move +8 -0
  235. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/systems/counter.move +13 -0
  236. package/templates/nextjs/sui-farm/packages/contracts/src/counter/sources/tests/counter.move +28 -0
  237. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/Move.toml +14 -0
  238. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/dapp_key.move +46 -0
  239. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/enums/crop_type.move +47 -0
  240. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/enums/egg_type.move +42 -0
  241. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/enums/pet_rarity.move +37 -0
  242. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/enums/pet_species.move +52 -0
  243. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/error.move +110 -0
  244. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/genesis.move +33 -0
  245. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/init_test.move +23 -0
  246. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/permits/world.move +125 -0
  247. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/carrot.move +136 -0
  248. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/carrot_seed.move +80 -0
  249. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/common_egg.move +136 -0
  250. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/corn.move +136 -0
  251. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/corn_seed.move +80 -0
  252. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/crow_charges.move +162 -0
  253. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/crow_damage.move +207 -0
  254. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/farm_plot.move +261 -0
  255. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/gold.move +80 -0
  256. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/pet.move +467 -0
  257. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/pet_config.move +372 -0
  258. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/pet_hatch.move +162 -0
  259. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/pet_slot_index.move +83 -0
  260. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/pet_slots.move +64 -0
  261. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/profile.move +162 -0
  262. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/pumpkin.move +136 -0
  263. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/pumpkin_seed.move +80 -0
  264. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/rare_egg.move +136 -0
  265. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/scarecrow.move +64 -0
  266. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/season_config.move +197 -0
  267. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/season_stats.move +64 -0
  268. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/seasonal_egg.move +136 -0
  269. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/shop_config.move +267 -0
  270. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/trophy.move +245 -0
  271. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/wheat.move +136 -0
  272. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/wheat_seed.move +80 -0
  273. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/resources/world_permit_id.move +64 -0
  274. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/codegen/user_storage_init.move +26 -0
  275. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/scripts/deploy_hook.move +45 -0
  276. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/scripts/migrate.move +7 -0
  277. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/systems/crow_system.move +96 -0
  278. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/systems/farm_system.move +182 -0
  279. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/systems/market_system.move +172 -0
  280. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/systems/pet_system.move +495 -0
  281. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/systems/season_system.move +70 -0
  282. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/systems/shop_system.move +112 -0
  283. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/systems/world_system.move +34 -0
  284. package/templates/nextjs/sui-farm/packages/contracts/src/harvest/sources/tests/farm_tests.move +1192 -0
  285. package/templates/nextjs/sui-farm/pnpm-workspace.yaml +2 -0
  286. package/templates/nextjs/sui-template/packages/client/src/app/components/ProxyCard.tsx +683 -0
  287. package/templates/nextjs/sui-template/packages/client/src/app/page.tsx +510 -5
  288. package/templates/nextjs/sui-template/packages/client/src/app/providers.tsx +13 -5
  289. package/templates/nextjs/sui-template/packages/contracts/Pub.localnet.toml +4 -4
  290. package/templates/nextjs/sui-template/packages/contracts/counter.lock.json +14 -0
  291. package/templates/nextjs/sui-template/packages/contracts/deployment.ts +8 -3
  292. package/templates/nextjs/sui-template/packages/contracts/dubhe.config.json +9 -9
  293. package/templates/nextjs/sui-template/packages/contracts/dubhe.config.ts +0 -4
  294. package/templates/nextjs/sui-template/packages/contracts/metadata.json +180 -124
  295. package/templates/nextjs/sui-template/packages/contracts/package.json +8 -4
  296. package/templates/nextjs/sui-template/packages/contracts/src/counter/Move.toml +4 -0
  297. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/dapp_key.move +45 -31
  298. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/error.move +10 -0
  299. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/genesis.move +30 -13
  300. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/init_test.move +19 -14
  301. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/resources/counter1.move +30 -20
  302. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/resources/counter2.move +35 -24
  303. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/user_storage_init.move +26 -0
  304. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/scripts/deploy_hook.move +6 -10
  305. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/systems/counter.move +7 -20
  306. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/tests/counter.move +14 -27
  307. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/Move.lock +33 -30
  308. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/Move.toml +8 -3
  309. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/dapp_key.move +45 -31
  310. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/error.move +170 -0
  311. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/genesis.move +16 -13
  312. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/init_test.move +8 -14
  313. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/account_key.move +1 -3
  314. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/dapp_service.move +1776 -137
  315. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/data_key.move +1 -20
  316. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/events.move +864 -25
  317. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/scripts/deploy_hook.move +15 -16
  318. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/scripts/migrate.move +0 -3
  319. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/systems/address_system.move +25 -17
  320. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/systems/dapp_system.move +2802 -343
  321. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/systems/utils.move +1 -1
  322. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/address.move +173 -55
  323. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/dapp_test.move +769 -0
  324. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/fee_test.move +2965 -0
  325. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/integration_test.move +303 -0
  326. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/listing_test.move +1422 -0
  327. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/scene_session_test.move +269 -0
  328. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/session_test.move +624 -0
  329. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/storage_test.move +700 -0
  330. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/typed_object_test.move +177 -0
  331. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/typed_scene_test.move +452 -0
  332. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/user_storage_test.move +160 -0
  333. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/utils/math.move +4 -3
  334. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/utils/type_info.move +2 -2
  335. package/templates/101/sui-template/packages/contracts/src/counter/Move.lock +0 -41
  336. package/templates/101/sui-template/packages/contracts/src/counter/Published.toml +0 -9
  337. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/errors.move +0 -12
  338. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/errors.move +0 -140
  339. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_fee_config.move +0 -186
  340. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_fee_state.move +0 -306
  341. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_metadata.move +0 -396
  342. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dubhe_config.move +0 -246
  343. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/core/dapp_store.move +0 -29
  344. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/systems/session_system.move +0 -44
  345. package/templates/contract/sui-template/src/dubhe/sources/codegen/errors.move +0 -140
  346. package/templates/contract/sui-template/src/dubhe/sources/codegen/resources/dapp_fee_config.move +0 -186
  347. package/templates/contract/sui-template/src/dubhe/sources/codegen/resources/dapp_fee_state.move +0 -306
  348. package/templates/contract/sui-template/src/dubhe/sources/codegen/resources/dapp_metadata.move +0 -396
  349. package/templates/contract/sui-template/src/dubhe/sources/codegen/resources/dubhe_config.move +0 -246
  350. package/templates/contract/sui-template/src/dubhe/sources/core/dapp_store.move +0 -29
  351. package/templates/contract/sui-template/src/dubhe/sources/systems/session_system.move +0 -44
  352. package/templates/nextjs/sui-template/packages/contracts/src/counter/Move.lock +0 -47
  353. package/templates/nextjs/sui-template/packages/contracts/src/counter/Published.toml +0 -9
  354. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/errors.move +0 -12
  355. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/errors.move +0 -140
  356. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_fee_config.move +0 -186
  357. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_fee_state.move +0 -306
  358. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_metadata.move +0 -396
  359. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dubhe_config.move +0 -246
  360. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/dapp_store.move +0 -29
  361. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/systems/session_system.move +0 -44
@@ -0,0 +1,423 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap');
6
+
7
+ :root {
8
+ --background: #1a2e1a;
9
+ --foreground: #f0e6c8;
10
+ }
11
+
12
+ body {
13
+ color: var(--foreground);
14
+ background: var(--background);
15
+ font-family: Arial, Helvetica, sans-serif;
16
+ }
17
+
18
+ /* Pixel art image rendering */
19
+ .pixel-art {
20
+ image-rendering: pixelated;
21
+ image-rendering: -moz-crisp-edges;
22
+ image-rendering: crisp-edges;
23
+ }
24
+
25
+ /* Farm tile style */
26
+ .farm-tile {
27
+ @apply relative rounded-lg border-2 border-amber-700 bg-amber-900/40 overflow-hidden cursor-pointer
28
+ transition-transform hover:scale-105 active:scale-95;
29
+ }
30
+
31
+ .farm-tile-empty {
32
+ @apply border-dashed border-amber-800/50 bg-amber-950/30 cursor-pointer;
33
+ }
34
+
35
+ /* Progress bar */
36
+ .progress-bar-fill {
37
+ transition: width 1s linear;
38
+ }
39
+
40
+ /* ═══════════════════════════════════════════════════════════════
41
+ PET ANIMATIONS
42
+ ═══════════════════════════════════════════════════════════════ */
43
+
44
+ /* Bunny — quick vertical hop */
45
+ @keyframes pet-hop {
46
+ 0%,
47
+ 100% {
48
+ transform: translateY(0);
49
+ }
50
+ 40% {
51
+ transform: translateY(-8px) scaleX(0.92);
52
+ }
53
+ 60% {
54
+ transform: translateY(-6px) scaleX(0.92);
55
+ }
56
+ }
57
+ .pet-anim-bunny {
58
+ animation: pet-hop 1s ease-in-out infinite;
59
+ }
60
+
61
+ /* Chick — left-right head wobble */
62
+ @keyframes pet-wobble {
63
+ 0%,
64
+ 100% {
65
+ transform: rotate(0deg);
66
+ }
67
+ 25% {
68
+ transform: rotate(-10deg);
69
+ }
70
+ 75% {
71
+ transform: rotate(10deg);
72
+ }
73
+ }
74
+ .pet-anim-chick {
75
+ animation: pet-wobble 0.8s ease-in-out infinite;
76
+ }
77
+
78
+ /* Fox — tail-wag rotation pivot at bottom */
79
+ @keyframes pet-wag {
80
+ 0%,
81
+ 100% {
82
+ transform: rotate(0deg);
83
+ transform-origin: bottom center;
84
+ }
85
+ 30% {
86
+ transform: rotate(-8deg);
87
+ transform-origin: bottom center;
88
+ }
89
+ 70% {
90
+ transform: rotate(8deg);
91
+ transform-origin: bottom center;
92
+ }
93
+ }
94
+ .pet-anim-fox {
95
+ animation: pet-wag 1.2s ease-in-out infinite;
96
+ }
97
+
98
+ /* Deer — gentle side sway */
99
+ @keyframes pet-sway {
100
+ 0%,
101
+ 100% {
102
+ transform: translateX(0) rotate(0deg);
103
+ }
104
+ 33% {
105
+ transform: translateX(-4px) rotate(-4deg);
106
+ }
107
+ 66% {
108
+ transform: translateX(4px) rotate(4deg);
109
+ }
110
+ }
111
+ .pet-anim-deer {
112
+ animation: pet-sway 2s ease-in-out infinite;
113
+ }
114
+
115
+ /* Dragon — float up/down with scale pulse */
116
+ @keyframes pet-float {
117
+ 0%,
118
+ 100% {
119
+ transform: translateY(0) scale(1);
120
+ }
121
+ 50% {
122
+ transform: translateY(-7px) scale(1.04);
123
+ }
124
+ }
125
+ .pet-anim-dragon {
126
+ animation: pet-float 1.8s ease-in-out infinite;
127
+ }
128
+
129
+ /* Slow-down modifier for hungry pets (satiety 30-60) */
130
+ .pet-anim-slow {
131
+ animation-duration: 3s !important;
132
+ opacity: 0.75;
133
+ }
134
+
135
+ /* Shake for starving pets (satiety < 30) */
136
+ @keyframes pet-shake {
137
+ 0%,
138
+ 100% {
139
+ transform: translateX(0);
140
+ }
141
+ 20% {
142
+ transform: translateX(-4px);
143
+ }
144
+ 40% {
145
+ transform: translateX(4px);
146
+ }
147
+ 60% {
148
+ transform: translateX(-3px);
149
+ }
150
+ 80% {
151
+ transform: translateX(3px);
152
+ }
153
+ }
154
+ .pet-anim-starving {
155
+ animation: pet-shake 0.5s ease-in-out infinite !important;
156
+ filter: drop-shadow(0 0 4px #ef4444);
157
+ }
158
+
159
+ /* Egg idle wobble (ready state) */
160
+ @keyframes egg-wobble-ready {
161
+ 0%,
162
+ 100% {
163
+ transform: rotate(0deg) scale(1);
164
+ }
165
+ 20% {
166
+ transform: rotate(-8deg) scale(1.02);
167
+ }
168
+ 40% {
169
+ transform: rotate(8deg) scale(1.02);
170
+ }
171
+ 60% {
172
+ transform: rotate(-5deg) scale(1.01);
173
+ }
174
+ 80% {
175
+ transform: rotate(5deg) scale(1.01);
176
+ }
177
+ }
178
+ .egg-ready {
179
+ animation: egg-wobble-ready 0.5s ease-in-out infinite;
180
+ }
181
+
182
+ /* Egg gentle rocking (>80% incubation progress) */
183
+ @keyframes egg-rock {
184
+ 0%,
185
+ 100% {
186
+ transform: rotate(0deg);
187
+ }
188
+ 30% {
189
+ transform: rotate(-6deg);
190
+ }
191
+ 70% {
192
+ transform: rotate(6deg);
193
+ }
194
+ }
195
+ .egg-rocking {
196
+ animation: egg-rock 1.4s ease-in-out infinite;
197
+ }
198
+
199
+ /* Egg glow pulse */
200
+ @keyframes egg-glow {
201
+ 0%,
202
+ 100% {
203
+ filter: drop-shadow(0 0 4px #86efac);
204
+ }
205
+ 50% {
206
+ filter: drop-shadow(0 0 12px #4ade80);
207
+ }
208
+ }
209
+ .egg-glow {
210
+ animation: egg-glow 1s ease-in-out infinite;
211
+ }
212
+
213
+ /* Egg crack: left half */
214
+ @keyframes egg-crack-left {
215
+ 0% {
216
+ transform: translateX(0) rotate(0deg) opacity(1);
217
+ }
218
+ 100% {
219
+ transform: translateX(-40px) rotate(-30deg);
220
+ opacity: 0;
221
+ }
222
+ }
223
+ /* Egg crack: right half */
224
+ @keyframes egg-crack-right {
225
+ 0% {
226
+ transform: translateX(0) rotate(0deg);
227
+ opacity: 1;
228
+ }
229
+ 100% {
230
+ transform: translateX(40px) rotate(30deg);
231
+ opacity: 0;
232
+ }
233
+ }
234
+ .egg-crack-left {
235
+ animation: egg-crack-left 0.4s ease-in forwards;
236
+ }
237
+ .egg-crack-right {
238
+ animation: egg-crack-right 0.4s ease-in forwards;
239
+ }
240
+
241
+ /* New pet pop-in after hatch */
242
+ @keyframes pet-pop-in {
243
+ 0% {
244
+ transform: scale(0) translateY(20px);
245
+ opacity: 0;
246
+ }
247
+ 60% {
248
+ transform: scale(1.4) translateY(-4px);
249
+ opacity: 1;
250
+ }
251
+ 100% {
252
+ transform: scale(1) translateY(0);
253
+ opacity: 1;
254
+ }
255
+ }
256
+ .pet-pop-in {
257
+ animation: pet-pop-in 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
258
+ }
259
+
260
+ /* Food fly — driven by inline style (JS sets --tx, --ty) */
261
+ @keyframes food-fly {
262
+ 0% {
263
+ transform: translate(0, 0) scale(1);
264
+ opacity: 1;
265
+ }
266
+ 100% {
267
+ transform: translate(var(--tx, -20px), var(--ty, -40px)) scale(0.4);
268
+ opacity: 0;
269
+ }
270
+ }
271
+ .food-fly {
272
+ animation: food-fly 0.5s ease-in forwards;
273
+ }
274
+
275
+ /* Heart particle float up */
276
+ @keyframes heart-float {
277
+ 0% {
278
+ transform: translateY(0) scale(1) rotate(var(--rot, 0deg));
279
+ opacity: 1;
280
+ }
281
+ 100% {
282
+ transform: translateY(-48px) scale(0.6) rotate(var(--rot, 0deg));
283
+ opacity: 0;
284
+ }
285
+ }
286
+ .heart-float {
287
+ animation: heart-float 0.8s ease-out forwards;
288
+ }
289
+
290
+ /* Level-up star burst */
291
+ @keyframes star-burst {
292
+ 0% {
293
+ transform: translate(0, 0) scale(1);
294
+ opacity: 1;
295
+ }
296
+ 100% {
297
+ transform: translate(var(--sx, 0px), var(--sy, -30px)) scale(0);
298
+ opacity: 0;
299
+ }
300
+ }
301
+ .star-burst {
302
+ animation: star-burst 0.7s ease-out forwards;
303
+ }
304
+
305
+ /* Level-up gold glow on pet */
306
+ @keyframes level-glow {
307
+ 0%,
308
+ 100% {
309
+ filter: drop-shadow(0 0 0px #fbbf24);
310
+ }
311
+ 50% {
312
+ filter: drop-shadow(0 0 16px #fbbf24) drop-shadow(0 0 32px #f59e0b);
313
+ }
314
+ }
315
+ .level-up-glow {
316
+ animation: level-glow 0.8s ease-in-out 2;
317
+ }
318
+
319
+ /* Level-up banner slide-in / fade-out */
320
+ @keyframes banner-slide {
321
+ 0% {
322
+ transform: translateY(-12px);
323
+ opacity: 0;
324
+ }
325
+ 20% {
326
+ transform: translateY(0);
327
+ opacity: 1;
328
+ }
329
+ 70% {
330
+ transform: translateY(0);
331
+ opacity: 1;
332
+ }
333
+ 100% {
334
+ transform: translateY(-8px);
335
+ opacity: 0;
336
+ }
337
+ }
338
+ .level-banner {
339
+ animation: banner-slide 1.8s ease-in-out forwards;
340
+ }
341
+
342
+ /* Pet selected pulse ring */
343
+ @keyframes pet-select-ring {
344
+ 0%,
345
+ 100% {
346
+ box-shadow: 0 0 0 2px rgba(251, 191, 36, 0.6);
347
+ }
348
+ 50% {
349
+ box-shadow: 0 0 0 4px rgba(251, 191, 36, 0.9), 0 0 14px rgba(251, 191, 36, 0.4);
350
+ }
351
+ }
352
+ .pet-selected {
353
+ animation: pet-select-ring 1.4s ease-in-out infinite;
354
+ border-color: rgb(251 191 36 / 0.8) !important;
355
+ }
356
+
357
+ /* Quick heartbeat when eating */
358
+ @keyframes pet-eat {
359
+ 0% {
360
+ transform: scale(1);
361
+ }
362
+ 30% {
363
+ transform: scale(1.3);
364
+ }
365
+ 65% {
366
+ transform: scale(0.9);
367
+ }
368
+ 100% {
369
+ transform: scale(1);
370
+ }
371
+ }
372
+ .pet-eating {
373
+ animation: pet-eat 0.35s ease-in-out forwards;
374
+ }
375
+
376
+ /* Ground strip shimmer inside habitat */
377
+ @keyframes ground-shimmer {
378
+ 0%,
379
+ 100% {
380
+ opacity: 0.35;
381
+ }
382
+ 50% {
383
+ opacity: 0.65;
384
+ }
385
+ }
386
+ .ground-shimmer {
387
+ animation: ground-shimmer 2.4s ease-in-out infinite;
388
+ }
389
+
390
+ /* Ranch pet shadow pulse */
391
+ @keyframes pet-shadow-breathe {
392
+ 0%,
393
+ 100% {
394
+ transform: scaleX(1);
395
+ opacity: 0.28;
396
+ }
397
+ 50% {
398
+ transform: scaleX(0.8);
399
+ opacity: 0.18;
400
+ }
401
+ }
402
+ .pet-shadow {
403
+ animation: pet-shadow-breathe 1.8s ease-in-out infinite;
404
+ }
405
+
406
+ /* Water ripple on trough */
407
+ @keyframes water-ripple {
408
+ 0% {
409
+ transform: scaleX(1);
410
+ opacity: 0.85;
411
+ }
412
+ 50% {
413
+ transform: scaleX(1.04);
414
+ opacity: 0.6;
415
+ }
416
+ 100% {
417
+ transform: scaleX(1);
418
+ opacity: 0.85;
419
+ }
420
+ }
421
+ .water-ripple {
422
+ animation: water-ripple 1.6s ease-in-out infinite;
423
+ }
@@ -0,0 +1,66 @@
1
+ 'use client';
2
+
3
+ import { useState, useEffect } from 'react';
4
+ import { useDubhe } from '@0xobelisk/react/sui';
5
+ import { DappStorageId } from 'contracts/deployment';
6
+
7
+ /**
8
+ * Reads the WorldPermit object ID directly from DappStorage dynamic fields.
9
+ *
10
+ * The world_permit_id global resource is stored by deploy_hook as:
11
+ * key = [b"world_permit_id", b"object_id"] (vector<vector<u8>>)
12
+ * value = 32-byte BCS-encoded address
13
+ *
14
+ * This hook queries it once on mount and caches it for the session.
15
+ * It automatically stays correct across redeployments without any manual update.
16
+ */
17
+
18
+ let _cached: string | null = null; // module-level cache — one fetch per browser session
19
+
20
+ export function useWorldPermitId() {
21
+ const { contract, dappStorageId } = useDubhe();
22
+ const [permitId, setPermitId] = useState<string | null>(_cached);
23
+ const [loading, setLoading] = useState(_cached === null);
24
+ const [error, setError] = useState<string | null>(null);
25
+
26
+ useEffect(() => {
27
+ if (_cached) {
28
+ setPermitId(_cached);
29
+ setLoading(false);
30
+ return;
31
+ }
32
+
33
+ const storageId = dappStorageId ?? DappStorageId;
34
+ if (!contract || !storageId || storageId === '0x0') return;
35
+
36
+ setLoading(true);
37
+ setError(null);
38
+
39
+ const KEY_WORLD = Array.from(Buffer.from('world_permit_id'));
40
+ const KEY_OBJECT_ID = Array.from(Buffer.from('object_id'));
41
+
42
+ const dfName = {
43
+ type: 'vector<vector<u8>>',
44
+ value: [KEY_WORLD, KEY_OBJECT_ID]
45
+ };
46
+
47
+ (contract as any).suiInteractor.currentClient
48
+ .getDynamicFieldObject({ parentId: storageId, name: dfName })
49
+ .then((res: any) => {
50
+ const bytes: number[] = res?.data?.content?.fields?.value;
51
+ if (!Array.isArray(bytes) || bytes.length !== 32) {
52
+ throw new Error('world_permit_id field not found or malformed');
53
+ }
54
+ const hex = '0x' + bytes.map((b: number) => b.toString(16).padStart(2, '0')).join('');
55
+ _cached = hex;
56
+ setPermitId(hex);
57
+ })
58
+ .catch((err: any) => {
59
+ console.error('useWorldPermitId error:', err);
60
+ setError(err?.message ?? String(err));
61
+ })
62
+ .finally(() => setLoading(false));
63
+ }, [contract, dappStorageId]);
64
+
65
+ return { permitId, loading, error };
66
+ }
@@ -0,0 +1,23 @@
1
+ import type { Metadata } from 'next';
2
+ import { Providers } from './providers';
3
+ import './globals.css';
4
+ import '@mysten/dapp-kit/dist/index.css';
5
+
6
+ export const metadata: Metadata = {
7
+ title: 'Harvest — Full-Chain Farming',
8
+ description: 'A full-chain casual farming game built on Sui with Dubhe'
9
+ };
10
+
11
+ export default function RootLayout({
12
+ children
13
+ }: Readonly<{
14
+ children: React.ReactNode;
15
+ }>) {
16
+ return (
17
+ <html lang="en" suppressHydrationWarning>
18
+ <body className="antialiased" suppressHydrationWarning>
19
+ <Providers>{children}</Providers>
20
+ </body>
21
+ </html>
22
+ );
23
+ }
@@ -0,0 +1,185 @@
1
+ 'use client';
2
+
3
+ import { useState, useEffect, useCallback } from 'react';
4
+ import { ConnectButton, useCurrentAccount } from '@mysten/dapp-kit';
5
+ import { useDubhe } from '@0xobelisk/react/sui';
6
+ import { motion } from 'framer-motion';
7
+ import { IconTrophy, IconMedal } from '../components/PetAvatar';
8
+ import { IconGold } from '../components/icons/GameIcons';
9
+
10
+ interface LeaderboardEntry {
11
+ address: string;
12
+ earned: bigint;
13
+ rank: number;
14
+ }
15
+
16
+ export default function LeaderboardPage() {
17
+ const account = useCurrentAccount();
18
+ const { ecsWorld, graphqlClient } = useDubhe();
19
+ const [entries, setEntries] = useState<LeaderboardEntry[]>([]);
20
+ const [seasonId, setSeasonId] = useState(0);
21
+ const [seasonEnd, setSeasonEnd] = useState<bigint>(BigInt(0));
22
+ const [isLoading, setIsLoading] = useState(true);
23
+
24
+ const fetchLeaderboard = useCallback(async () => {
25
+ if (!ecsWorld || !graphqlClient) return;
26
+ setIsLoading(true);
27
+ try {
28
+ // Fetch season config (global resource, no entityId key)
29
+ const seasonResult = await graphqlClient
30
+ .getAllTables<any>('seasonConfig', { first: 1 })
31
+ .catch(() => null);
32
+ const season = seasonResult?.edges?.[0]?.node;
33
+ if (season) {
34
+ setSeasonId(Number(season.seasonId ?? 0));
35
+ setSeasonEnd(BigInt(season.endMs ?? 0));
36
+ }
37
+
38
+ // Query top earners via season_stats (sorted by earned amount)
39
+ const statsResult = await graphqlClient
40
+ .getAllTables<any>('seasonStats', {
41
+ first: 20,
42
+ orderBy: [{ field: 'amount', direction: 'DESC' }]
43
+ })
44
+ .catch(() => null);
45
+
46
+ const edges = statsResult?.edges ?? [];
47
+ setEntries(
48
+ edges.map((e, i) => ({
49
+ address: e.node.entityId,
50
+ earned: BigInt(e.node.amount ?? 0),
51
+ rank: i + 1
52
+ }))
53
+ );
54
+ } catch (err) {
55
+ console.error('fetchLeaderboard error:', err);
56
+ } finally {
57
+ setIsLoading(false);
58
+ }
59
+ }, [ecsWorld, graphqlClient]);
60
+
61
+ useEffect(() => {
62
+ if (ecsWorld) fetchLeaderboard();
63
+ }, [ecsWorld, fetchLeaderboard]);
64
+
65
+ const now = Date.now();
66
+ const timeLeft = Math.max(0, Number(seasonEnd) - now);
67
+ const daysLeft = Math.floor(timeLeft / 86400000);
68
+ const hoursLeft = Math.floor((timeLeft % 86400000) / 3600000);
69
+ const isSeasonActive = seasonId > 0 && timeLeft > 0;
70
+
71
+ const rankMedal = (rank: number) => {
72
+ if (rank <= 3) return <IconMedal rank={rank as 1 | 2 | 3} size={28} />;
73
+ return <span className="font-pixel text-amber-600 text-sm">#{rank}</span>;
74
+ };
75
+
76
+ return (
77
+ <div
78
+ className="min-h-screen p-4 md:p-6"
79
+ style={{ background: 'radial-gradient(ellipse at top, #1a3a1a 0%, #0a1a0a 100%)' }}
80
+ >
81
+ {/* Header */}
82
+ <div className="flex items-center justify-between mb-6 flex-wrap gap-3">
83
+ <div className="flex items-center gap-2">
84
+ <IconTrophy size={24} />
85
+ <h1 className="font-pixel text-amber-300 text-sm">LEADERBOARD</h1>
86
+ </div>
87
+ <ConnectButton />
88
+ </div>
89
+
90
+ {/* Navigation */}
91
+ <div className="flex gap-2 mb-6">
92
+ {['Farm', 'Market', 'Leaderboard'].map((tab) => (
93
+ <a
94
+ key={tab}
95
+ href={tab === 'Farm' ? '/' : `/${tab.toLowerCase()}`}
96
+ className={`px-4 py-2 text-xs font-pixel rounded-lg transition-colors border
97
+ ${
98
+ tab === 'Leaderboard'
99
+ ? 'bg-amber-700 text-amber-100 border-amber-600'
100
+ : 'bg-amber-900/40 hover:bg-amber-800/40 text-amber-400 border-amber-700/30'
101
+ }`}
102
+ >
103
+ {tab}
104
+ </a>
105
+ ))}
106
+ </div>
107
+
108
+ {/* Season info */}
109
+ <div className="bg-amber-950/60 border border-amber-700/50 rounded-xl p-4 mb-6">
110
+ <div className="flex items-center justify-between flex-wrap gap-3">
111
+ <div>
112
+ <p className="font-pixel text-amber-300 text-xs">
113
+ {isSeasonActive
114
+ ? `Season ${seasonId}`
115
+ : seasonId === 0
116
+ ? 'No Active Season'
117
+ : `Season ${seasonId} Ended`}
118
+ </p>
119
+ {isSeasonActive && (
120
+ <p className="text-amber-500 text-xs mt-1">
121
+ {daysLeft}d {hoursLeft}h remaining · Top 3 earn Trophy NFTs
122
+ </p>
123
+ )}
124
+ </div>
125
+ {isSeasonActive && (
126
+ <div className="flex gap-2 text-xs text-amber-400">
127
+ <div className="flex items-center gap-1">
128
+ <IconTrophy size={14} />
129
+ <span className="font-pixel">Trophy for top 3</span>
130
+ </div>
131
+ </div>
132
+ )}
133
+ </div>
134
+ </div>
135
+
136
+ {/* Rankings */}
137
+ {isLoading ? (
138
+ <div className="flex items-center justify-center py-12">
139
+ <div className="w-8 h-8 border-2 border-amber-500 border-t-transparent rounded-full animate-spin" />
140
+ </div>
141
+ ) : entries.length === 0 ? (
142
+ <div className="text-center py-12">
143
+ <p className="font-pixel text-amber-600 text-xs">No rankings yet.</p>
144
+ <p className="text-amber-700 text-xs mt-2">Start farming to appear here!</p>
145
+ </div>
146
+ ) : (
147
+ <div className="space-y-2">
148
+ {entries.map((entry, i) => {
149
+ const isMe = entry.address === account?.address;
150
+ return (
151
+ <motion.div
152
+ key={entry.address}
153
+ initial={{ opacity: 0, x: -20 }}
154
+ animate={{ opacity: 1, x: 0 }}
155
+ transition={{ delay: i * 0.05 }}
156
+ className={`flex items-center justify-between px-4 py-3 rounded-xl border
157
+ ${
158
+ isMe
159
+ ? 'bg-amber-800/40 border-amber-500'
160
+ : 'bg-amber-950/40 border-amber-800/30'
161
+ }`}
162
+ >
163
+ <div className="flex items-center gap-3">
164
+ <div className="w-8 flex justify-center">{rankMedal(entry.rank)}</div>
165
+ <div>
166
+ <p className="text-sm text-amber-200 font-pixel">
167
+ {entry.address.slice(0, 6)}...{entry.address.slice(-4)}
168
+ {isMe && <span className="text-amber-400 ml-2">(you)</span>}
169
+ </p>
170
+ </div>
171
+ </div>
172
+ <div className="flex items-center gap-1">
173
+ <IconGold size={14} />
174
+ <p className="text-amber-300 font-pixel text-sm tabular-nums">
175
+ {Number(entry.earned).toLocaleString()}
176
+ </p>
177
+ </div>
178
+ </motion.div>
179
+ );
180
+ })}
181
+ </div>
182
+ )}
183
+ </div>
184
+ );
185
+ }