create-dubhe 1.2.0-pre.99 → 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 (360) 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 +4 -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 +4 -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/sources/codegen/dapp_key.move +45 -31
  297. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/error.move +10 -0
  298. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/genesis.move +30 -13
  299. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/init_test.move +19 -14
  300. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/resources/counter1.move +30 -20
  301. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/resources/counter2.move +35 -24
  302. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/user_storage_init.move +26 -0
  303. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/scripts/deploy_hook.move +6 -10
  304. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/systems/counter.move +7 -20
  305. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/tests/counter.move +14 -27
  306. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/Move.lock +33 -30
  307. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/Move.toml +4 -3
  308. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/dapp_key.move +45 -31
  309. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/error.move +170 -0
  310. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/genesis.move +16 -13
  311. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/init_test.move +8 -14
  312. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/account_key.move +1 -3
  313. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/dapp_service.move +1776 -137
  314. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/data_key.move +1 -20
  315. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/events.move +864 -25
  316. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/scripts/deploy_hook.move +15 -16
  317. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/scripts/migrate.move +0 -3
  318. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/systems/address_system.move +25 -17
  319. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/systems/dapp_system.move +2802 -343
  320. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/systems/utils.move +1 -1
  321. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/address.move +173 -55
  322. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/dapp_test.move +769 -0
  323. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/fee_test.move +2965 -0
  324. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/integration_test.move +303 -0
  325. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/listing_test.move +1422 -0
  326. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/scene_session_test.move +269 -0
  327. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/session_test.move +624 -0
  328. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/storage_test.move +700 -0
  329. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/typed_object_test.move +177 -0
  330. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/typed_scene_test.move +452 -0
  331. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/tests/user_storage_test.move +160 -0
  332. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/utils/math.move +4 -3
  333. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/utils/type_info.move +2 -2
  334. package/templates/101/sui-template/packages/contracts/src/counter/Move.lock +0 -41
  335. package/templates/101/sui-template/packages/contracts/src/counter/Published.toml +0 -9
  336. package/templates/101/sui-template/packages/contracts/src/counter/sources/codegen/errors.move +0 -12
  337. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/errors.move +0 -140
  338. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_fee_config.move +0 -186
  339. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_fee_state.move +0 -306
  340. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_metadata.move +0 -396
  341. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dubhe_config.move +0 -246
  342. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/core/dapp_store.move +0 -29
  343. package/templates/101/sui-template/packages/contracts/src/dubhe/sources/systems/session_system.move +0 -44
  344. package/templates/contract/sui-template/src/dubhe/sources/codegen/errors.move +0 -140
  345. package/templates/contract/sui-template/src/dubhe/sources/codegen/resources/dapp_fee_config.move +0 -186
  346. package/templates/contract/sui-template/src/dubhe/sources/codegen/resources/dapp_fee_state.move +0 -306
  347. package/templates/contract/sui-template/src/dubhe/sources/codegen/resources/dapp_metadata.move +0 -396
  348. package/templates/contract/sui-template/src/dubhe/sources/codegen/resources/dubhe_config.move +0 -246
  349. package/templates/contract/sui-template/src/dubhe/sources/core/dapp_store.move +0 -29
  350. package/templates/contract/sui-template/src/dubhe/sources/systems/session_system.move +0 -44
  351. package/templates/nextjs/sui-template/packages/contracts/src/counter/Move.lock +0 -47
  352. package/templates/nextjs/sui-template/packages/contracts/src/counter/Published.toml +0 -9
  353. package/templates/nextjs/sui-template/packages/contracts/src/counter/sources/codegen/errors.move +0 -12
  354. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/errors.move +0 -140
  355. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_fee_config.move +0 -186
  356. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_fee_state.move +0 -306
  357. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dapp_metadata.move +0 -396
  358. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/codegen/resources/dubhe_config.move +0 -246
  359. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/core/dapp_store.move +0 -29
  360. package/templates/nextjs/sui-template/packages/contracts/src/dubhe/sources/systems/session_system.move +0 -44
@@ -13,6 +13,7 @@ import { toast } from 'sonner';
13
13
  import { Value } from '@/app/state';
14
14
 
15
15
  import { useDubhe } from '@0xobelisk/react/sui';
16
+ import ProxyCard from '@/app/components/ProxyCard';
16
17
 
17
18
  export default function Home() {
18
19
  const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction();
@@ -29,6 +30,30 @@ export default function Home() {
29
30
  const [activeTab, setActiveTab] = useState<'ecs' | 'graphql'>('ecs');
30
31
  const [balance, setBalance] = useState<string>('0');
31
32
 
33
+ // UserStorage state
34
+ const [userStorageId, setUserStorageId] = useState<string | null>(null);
35
+ const [userStorageLoading, setUserStorageLoading] = useState(false);
36
+ const [userStorageFields, setUserStorageFields] = useState<{
37
+ write_count: bigint;
38
+ settled_count: bigint;
39
+ write_bytes: bigint;
40
+ settled_bytes: bigint;
41
+ unsettled_count: bigint;
42
+ unsettled_bytes: bigint;
43
+ session_key: string;
44
+ session_expires_at: bigint;
45
+ } | null>(null);
46
+ const [dappStorageFields, setDappStorageFields] = useState<{
47
+ name: string;
48
+ credit_pool: bigint;
49
+ free_credit: bigint;
50
+ suspended: boolean;
51
+ base_fee_per_write: bigint;
52
+ bytes_fee_per_byte: bigint;
53
+ total_settled: bigint;
54
+ } | null>(null);
55
+ const [settleLoading, setSettleLoading] = useState(false);
56
+
32
57
  // General query state
33
58
  const [availableComponents, setAvailableComponents] = useState<string[]>([]);
34
59
  const [availableResources, setAvailableResources] = useState<string[]>([]);
@@ -46,7 +71,16 @@ export default function Home() {
46
71
  const [resourceQueryLoading, setResourceQueryLoading] = useState(false);
47
72
  const [tableQueryLoading, setTableQueryLoading] = useState(false);
48
73
 
49
- const { contract, graphqlClient, ecsWorld, network, dubheSchemaId } = useDubhe();
74
+ const {
75
+ contract,
76
+ graphqlClient,
77
+ ecsWorld,
78
+ network,
79
+ packageId,
80
+ dappHubId,
81
+ dappStorageId,
82
+ frameworkPackageId
83
+ } = useDubhe();
50
84
 
51
85
  /**
52
86
  * Fetches the current balance of the connected wallet
@@ -62,6 +96,144 @@ export default function Home() {
62
96
  }
63
97
  };
64
98
 
99
+ /**
100
+ * Look up the UserStorage object ID for the current address.
101
+ */
102
+ const fetchUserStorageId = async (address: string) => {
103
+ if (!address) return;
104
+ try {
105
+ const id = await contract.getUserStorageId(address);
106
+ setUserStorageId(id);
107
+ if (id) {
108
+ await refreshStorageFields(id);
109
+ } else {
110
+ setUserStorageFields(null);
111
+ }
112
+ } catch (error) {
113
+ console.error('Failed to query UserStorage ID:', error);
114
+ setUserStorageId(null);
115
+ setUserStorageFields(null);
116
+ }
117
+ };
118
+
119
+ /**
120
+ * Refresh on-chain fields for the UserStorage and DappStorage objects.
121
+ */
122
+ const refreshStorageFields = async (storageId: string) => {
123
+ try {
124
+ const [usFields, dsFields] = await Promise.all([
125
+ contract.getUserStorageFields(storageId),
126
+ dappStorageId ? contract.getDappStorageFields(dappStorageId) : null
127
+ ]);
128
+ setUserStorageFields({
129
+ write_count: usFields.write_count,
130
+ settled_count: usFields.settled_count,
131
+ write_bytes: usFields.write_bytes,
132
+ settled_bytes: usFields.settled_bytes,
133
+ unsettled_count: usFields.unsettled_count,
134
+ unsettled_bytes: usFields.unsettled_bytes,
135
+ session_key: usFields.session_key,
136
+ session_expires_at: usFields.session_expires_at
137
+ });
138
+ if (dsFields) {
139
+ setDappStorageFields({
140
+ name: dsFields.name,
141
+ credit_pool: dsFields.credit_pool,
142
+ free_credit: dsFields.free_credit,
143
+ suspended: dsFields.suspended,
144
+ base_fee_per_write: dsFields.base_fee_per_write,
145
+ bytes_fee_per_byte: dsFields.bytes_fee_per_byte,
146
+ total_settled: dsFields.total_settled
147
+ });
148
+ }
149
+ } catch (error) {
150
+ console.error('Failed to refresh storage fields:', error);
151
+ }
152
+ };
153
+
154
+ /**
155
+ * Register a UserStorage for the current address by building the tx
156
+ * manually and signing via the connected wallet.
157
+ */
158
+ const registerUserStorage = async () => {
159
+ const hub = dappHubId;
160
+ const storage = dappStorageId;
161
+ if (!hub || !storage) {
162
+ toast.error('dappHubId or dappStorageId is not configured.');
163
+ return;
164
+ }
165
+ setUserStorageLoading(true);
166
+ try {
167
+ const tx = new Transaction();
168
+ tx.moveCall({
169
+ target: `${packageId}::user_storage_init::init_user_storage`,
170
+ arguments: [tx.object(hub), tx.object(storage)]
171
+ });
172
+ await signAndExecuteTransaction(
173
+ { transaction: tx.serialize(), chain: `sui:${network}` },
174
+ {
175
+ onSuccess: async () => {
176
+ toast.success('UserStorage registered');
177
+ // Wait briefly for indexer, then look up the new ID.
178
+ setTimeout(async () => {
179
+ if (currentAddress) await fetchUserStorageId(currentAddress);
180
+ }, 1500);
181
+ },
182
+ onError: (err) => {
183
+ console.error('UserStorage registration failed:', err);
184
+ toast.error('Registration failed. Please try again.');
185
+ }
186
+ }
187
+ );
188
+ } catch (error) {
189
+ console.error('registerUserStorage error:', error);
190
+ toast.error('Registration failed. Please try again.');
191
+ } finally {
192
+ setUserStorageLoading(false);
193
+ }
194
+ };
195
+
196
+ /**
197
+ * Settle accumulated write debt for the current user.
198
+ * Builds the settle_writes tx and signs via the connected wallet.
199
+ */
200
+ const handleSettleWrites = async () => {
201
+ const hub = dappHubId;
202
+ const storage = dappStorageId;
203
+ const fwPkg = frameworkPackageId;
204
+ if (!hub || !storage || !userStorageId || !fwPkg) {
205
+ toast.error('Missing required IDs for settlement.');
206
+ return;
207
+ }
208
+ setSettleLoading(true);
209
+ try {
210
+ const tx = new Transaction();
211
+ tx.moveCall({
212
+ target: `${fwPkg}::dapp_system::settle_writes`,
213
+ typeArguments: [contract.getDappKey()],
214
+ arguments: [tx.object(hub), tx.object(storage), tx.object(userStorageId)]
215
+ });
216
+ await signAndExecuteTransaction(
217
+ { transaction: tx.serialize(), chain: `sui:${network}` },
218
+ {
219
+ onSuccess: async () => {
220
+ await refreshStorageFields(userStorageId);
221
+ toast.success('Settlement successful — write debt settled.');
222
+ },
223
+ onError: (err) => {
224
+ console.error('Settlement failed:', err);
225
+ toast.error('Settlement failed. Please try again.');
226
+ }
227
+ }
228
+ );
229
+ } catch (error) {
230
+ console.error('handleSettleWrites error:', error);
231
+ toast.error('Settlement failed. Please try again.');
232
+ } finally {
233
+ setSettleLoading(false);
234
+ }
235
+ };
236
+
65
237
  /**
66
238
  * Discover available tables and components
67
239
  */
@@ -282,13 +454,18 @@ export default function Home() {
282
454
  toast.error('Please connect your wallet first');
283
455
  return;
284
456
  }
457
+ if (!userStorageId) {
458
+ toast.error('UserStorage not found. Please register first.');
459
+ return;
460
+ }
285
461
 
286
462
  setLoading(true);
287
463
  try {
288
464
  const tx = new Transaction();
465
+ // counter_system::inc(user_storage: &mut UserStorage, number: u32, ctx)
289
466
  (await contract.tx.counter_system.inc({
290
467
  tx,
291
- params: [tx.object(dubheSchemaId), tx.pure.u32(1)],
468
+ params: [tx.object(userStorageId), tx.pure.u32(1)],
292
469
  isRaw: true
293
470
  })) as TransactionResult;
294
471
 
@@ -308,6 +485,8 @@ export default function Home() {
308
485
  }
309
486
  });
310
487
  }, 200);
488
+ // Refresh storage fields so write counters stay up to date.
489
+ await refreshStorageFields(userStorageId);
311
490
  },
312
491
  onError: (error) => {
313
492
  console.error('Transaction failed:', error);
@@ -465,9 +644,13 @@ export default function Home() {
465
644
  setValue(0);
466
645
  setEcsValue(0);
467
646
  setGraphqlValue(0);
647
+ setUserStorageId(null);
648
+ setUserStorageFields(null);
649
+ setDappStorageFields(null);
468
650
 
469
- // Get balance
651
+ // Get balance and UserStorage
470
652
  getBalance();
653
+ fetchUserStorageId(currentAddress);
471
654
  } else {
472
655
  console.log('💰 Wallet disconnected');
473
656
 
@@ -477,6 +660,9 @@ export default function Home() {
477
660
  setEcsValue(0);
478
661
  setGraphqlValue(0);
479
662
  setBalance('0');
663
+ setUserStorageId(null);
664
+ setUserStorageFields(null);
665
+ setDappStorageFields(null);
480
666
  }
481
667
  }, [currentAddress]);
482
668
 
@@ -646,6 +832,171 @@ export default function Home() {
646
832
  </p>
647
833
  </div>
648
834
 
835
+ {/* UserStorage panel */}
836
+ <div
837
+ className={`rounded-xl p-4 text-sm font-medium flex flex-col sm:flex-row items-center justify-between gap-3 ${
838
+ userStorageId
839
+ ? 'bg-green-50 border border-green-200 text-green-700'
840
+ : 'bg-amber-50 border border-amber-200 text-amber-700'
841
+ }`}
842
+ >
843
+ <span>
844
+ {userStorageId ? (
845
+ <>
846
+ ✅ UserStorage:{' '}
847
+ <span className="font-mono text-xs">
848
+ {userStorageId.slice(0, 10)}...{userStorageId.slice(-6)}
849
+ </span>
850
+ </>
851
+ ) : (
852
+ '⚠️ No UserStorage found. Register to start interacting.'
853
+ )}
854
+ </span>
855
+ {!userStorageId && dappStorageId && (
856
+ <button
857
+ type="button"
858
+ className="px-4 py-2 bg-amber-500 text-white rounded-lg hover:bg-amber-600 disabled:opacity-50 font-medium whitespace-nowrap"
859
+ onClick={registerUserStorage}
860
+ disabled={userStorageLoading}
861
+ >
862
+ {userStorageLoading ? 'Registering...' : '📝 Register UserStorage'}
863
+ </button>
864
+ )}
865
+ {!userStorageId && !dappStorageId && (
866
+ <span className="text-xs text-amber-600 font-normal">
867
+ Set DappStorageId in deployment.ts to enable UserStorage.
868
+ </span>
869
+ )}
870
+ </div>
871
+
872
+ {/* UserStorage & DappStorage field details */}
873
+ {userStorageId && (
874
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
875
+ {userStorageFields && (
876
+ <div className="bg-indigo-50 border border-indigo-200 rounded-xl p-4">
877
+ <div className="flex items-center justify-between mb-3">
878
+ <h4 className="font-semibold text-indigo-700 text-sm">
879
+ 📦 UserStorage Fields
880
+ </h4>
881
+ <button
882
+ type="button"
883
+ className="text-xs px-2 py-1 bg-indigo-100 text-indigo-600 rounded hover:bg-indigo-200"
884
+ onClick={() => refreshStorageFields(userStorageId)}
885
+ >
886
+ ↻ Refresh
887
+ </button>
888
+ </div>
889
+ <dl className="space-y-1 text-xs font-mono">
890
+ <div className="flex justify-between">
891
+ <dt className="text-gray-500">write_count</dt>
892
+ <dd className="text-gray-800">
893
+ {userStorageFields.write_count.toString()}
894
+ </dd>
895
+ </div>
896
+ <div className="flex justify-between">
897
+ <dt className="text-gray-500">settled_count</dt>
898
+ <dd className="text-gray-800">
899
+ {userStorageFields.settled_count.toString()}
900
+ </dd>
901
+ </div>
902
+ <div
903
+ className={`flex justify-between font-semibold ${
904
+ userStorageFields.unsettled_count > BigInt(0)
905
+ ? 'text-orange-600'
906
+ : 'text-green-600'
907
+ }`}
908
+ >
909
+ <dt>unsettled_count</dt>
910
+ <dd>{userStorageFields.unsettled_count.toString()}</dd>
911
+ </div>
912
+ <div className="flex justify-between">
913
+ <dt className="text-gray-500">write_bytes</dt>
914
+ <dd className="text-gray-800">
915
+ {userStorageFields.write_bytes.toString()}
916
+ </dd>
917
+ </div>
918
+ <div
919
+ className={`flex justify-between font-semibold ${
920
+ userStorageFields.unsettled_bytes > BigInt(0)
921
+ ? 'text-orange-600'
922
+ : 'text-green-600'
923
+ }`}
924
+ >
925
+ <dt>unsettled_bytes</dt>
926
+ <dd>{userStorageFields.unsettled_bytes.toString()}</dd>
927
+ </div>
928
+ {userStorageFields.session_key && (
929
+ <div className="flex justify-between">
930
+ <dt className="text-gray-500">session_key</dt>
931
+ <dd className="text-gray-800 truncate max-w-[120px]">
932
+ {userStorageFields.session_key.slice(0, 8)}…
933
+ </dd>
934
+ </div>
935
+ )}
936
+ </dl>
937
+ {userStorageFields.unsettled_count > BigInt(0) && (
938
+ <button
939
+ type="button"
940
+ className="mt-3 w-full px-3 py-2 bg-orange-500 text-white rounded-lg hover:bg-orange-600 disabled:opacity-50 text-sm font-medium"
941
+ onClick={handleSettleWrites}
942
+ disabled={settleLoading}
943
+ >
944
+ {settleLoading ? 'Settling...' : '💸 Settle Writes'}
945
+ </button>
946
+ )}
947
+ </div>
948
+ )}
949
+
950
+ {dappStorageFields && (
951
+ <div className="bg-purple-50 border border-purple-200 rounded-xl p-4">
952
+ <h4 className="font-semibold text-purple-700 text-sm mb-3">
953
+ 🏗️ DappStorage Fields
954
+ </h4>
955
+ <dl className="space-y-1 text-xs font-mono">
956
+ <div className="flex justify-between">
957
+ <dt className="text-gray-500">name</dt>
958
+ <dd className="text-gray-800 truncate max-w-[120px]">
959
+ {dappStorageFields.name || '—'}
960
+ </dd>
961
+ </div>
962
+ <div className="flex justify-between">
963
+ <dt className="text-gray-500">credit_pool</dt>
964
+ <dd className="text-gray-800">
965
+ {dappStorageFields.credit_pool.toString()}
966
+ </dd>
967
+ </div>
968
+ <div className="flex justify-between">
969
+ <dt className="text-gray-500">free_credit</dt>
970
+ <dd className="text-gray-800">
971
+ {dappStorageFields.free_credit.toString()}
972
+ </dd>
973
+ </div>
974
+ <div className="flex justify-between">
975
+ <dt className="text-gray-500">total_settled</dt>
976
+ <dd className="text-gray-800">
977
+ {dappStorageFields.total_settled.toString()}
978
+ </dd>
979
+ </div>
980
+ <div className="flex justify-between">
981
+ <dt className="text-gray-500">base_fee_per_write</dt>
982
+ <dd className="text-gray-800">
983
+ {dappStorageFields.base_fee_per_write.toString()}
984
+ </dd>
985
+ </div>
986
+ <div
987
+ className={`flex justify-between font-semibold ${
988
+ dappStorageFields.suspended ? 'text-red-600' : 'text-green-600'
989
+ }`}
990
+ >
991
+ <dt>suspended</dt>
992
+ <dd>{dappStorageFields.suspended ? 'YES' : 'NO'}</dd>
993
+ </div>
994
+ </dl>
995
+ </div>
996
+ )}
997
+ </div>
998
+ )}
999
+
649
1000
  {/* ECS Counter Display */}
650
1001
  <div className="text-center bg-gradient-to-r from-indigo-50 to-purple-50 rounded-xl p-8">
651
1002
  <div className="text-6xl font-bold text-indigo-600 mb-4">{ecsValue}</div>
@@ -656,7 +1007,7 @@ export default function Home() {
656
1007
  type="button"
657
1008
  className="px-8 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700 disabled:opacity-50 font-medium text-lg"
658
1009
  onClick={() => incrementCounter()}
659
- disabled={loading || Number(balance) === 0}
1010
+ disabled={loading || Number(balance) === 0 || !userStorageId}
660
1011
  >
661
1012
  {loading ? 'Processing...' : '🚀 Increment Counter'}
662
1013
  </button>
@@ -788,6 +1139,152 @@ export default function Home() {
788
1139
  </p>
789
1140
  </div>
790
1141
 
1142
+ {/* UserStorage panel (GraphQL tab) */}
1143
+ <div
1144
+ className={`rounded-xl p-4 text-sm font-medium flex flex-col sm:flex-row items-center justify-between gap-3 ${
1145
+ userStorageId
1146
+ ? 'bg-green-50 border border-green-200 text-green-700'
1147
+ : 'bg-amber-50 border border-amber-200 text-amber-700'
1148
+ }`}
1149
+ >
1150
+ <span>
1151
+ {userStorageId ? (
1152
+ <>
1153
+ ✅ UserStorage:{' '}
1154
+ <span className="font-mono text-xs">
1155
+ {userStorageId.slice(0, 10)}...{userStorageId.slice(-6)}
1156
+ </span>
1157
+ </>
1158
+ ) : (
1159
+ '⚠️ No UserStorage found. Register to start interacting.'
1160
+ )}
1161
+ </span>
1162
+ {!userStorageId && dappStorageId && (
1163
+ <button
1164
+ type="button"
1165
+ className="px-4 py-2 bg-amber-500 text-white rounded-lg hover:bg-amber-600 disabled:opacity-50 font-medium whitespace-nowrap"
1166
+ onClick={registerUserStorage}
1167
+ disabled={userStorageLoading}
1168
+ >
1169
+ {userStorageLoading ? 'Registering...' : '📝 Register UserStorage'}
1170
+ </button>
1171
+ )}
1172
+ </div>
1173
+
1174
+ {/* UserStorage & DappStorage field details (GraphQL tab) */}
1175
+ {userStorageId && (
1176
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
1177
+ {userStorageFields && (
1178
+ <div className="bg-blue-50 border border-blue-200 rounded-xl p-4">
1179
+ <div className="flex items-center justify-between mb-3">
1180
+ <h4 className="font-semibold text-blue-700 text-sm">
1181
+ 📦 UserStorage Fields
1182
+ </h4>
1183
+ <button
1184
+ type="button"
1185
+ className="text-xs px-2 py-1 bg-blue-100 text-blue-600 rounded hover:bg-blue-200"
1186
+ onClick={() => refreshStorageFields(userStorageId)}
1187
+ >
1188
+ ↻ Refresh
1189
+ </button>
1190
+ </div>
1191
+ <dl className="space-y-1 text-xs font-mono">
1192
+ <div className="flex justify-between">
1193
+ <dt className="text-gray-500">write_count</dt>
1194
+ <dd className="text-gray-800">
1195
+ {userStorageFields.write_count.toString()}
1196
+ </dd>
1197
+ </div>
1198
+ <div className="flex justify-between">
1199
+ <dt className="text-gray-500">settled_count</dt>
1200
+ <dd className="text-gray-800">
1201
+ {userStorageFields.settled_count.toString()}
1202
+ </dd>
1203
+ </div>
1204
+ <div
1205
+ className={`flex justify-between font-semibold ${
1206
+ userStorageFields.unsettled_count > BigInt(0)
1207
+ ? 'text-orange-600'
1208
+ : 'text-green-600'
1209
+ }`}
1210
+ >
1211
+ <dt>unsettled_count</dt>
1212
+ <dd>{userStorageFields.unsettled_count.toString()}</dd>
1213
+ </div>
1214
+ <div className="flex justify-between">
1215
+ <dt className="text-gray-500">write_bytes</dt>
1216
+ <dd className="text-gray-800">
1217
+ {userStorageFields.write_bytes.toString()}
1218
+ </dd>
1219
+ </div>
1220
+ <div
1221
+ className={`flex justify-between font-semibold ${
1222
+ userStorageFields.unsettled_bytes > BigInt(0)
1223
+ ? 'text-orange-600'
1224
+ : 'text-green-600'
1225
+ }`}
1226
+ >
1227
+ <dt>unsettled_bytes</dt>
1228
+ <dd>{userStorageFields.unsettled_bytes.toString()}</dd>
1229
+ </div>
1230
+ </dl>
1231
+ {userStorageFields.unsettled_count > BigInt(0) && (
1232
+ <button
1233
+ type="button"
1234
+ className="mt-3 w-full px-3 py-2 bg-orange-500 text-white rounded-lg hover:bg-orange-600 disabled:opacity-50 text-sm font-medium"
1235
+ onClick={handleSettleWrites}
1236
+ disabled={settleLoading}
1237
+ >
1238
+ {settleLoading ? 'Settling...' : '💸 Settle Writes'}
1239
+ </button>
1240
+ )}
1241
+ </div>
1242
+ )}
1243
+
1244
+ {dappStorageFields && (
1245
+ <div className="bg-cyan-50 border border-cyan-200 rounded-xl p-4">
1246
+ <h4 className="font-semibold text-cyan-700 text-sm mb-3">
1247
+ 🏗️ DappStorage Fields
1248
+ </h4>
1249
+ <dl className="space-y-1 text-xs font-mono">
1250
+ <div className="flex justify-between">
1251
+ <dt className="text-gray-500">name</dt>
1252
+ <dd className="text-gray-800 truncate max-w-[120px]">
1253
+ {dappStorageFields.name || '—'}
1254
+ </dd>
1255
+ </div>
1256
+ <div className="flex justify-between">
1257
+ <dt className="text-gray-500">credit_pool</dt>
1258
+ <dd className="text-gray-800">
1259
+ {dappStorageFields.credit_pool.toString()}
1260
+ </dd>
1261
+ </div>
1262
+ <div className="flex justify-between">
1263
+ <dt className="text-gray-500">free_credit</dt>
1264
+ <dd className="text-gray-800">
1265
+ {dappStorageFields.free_credit.toString()}
1266
+ </dd>
1267
+ </div>
1268
+ <div className="flex justify-between">
1269
+ <dt className="text-gray-500">total_settled</dt>
1270
+ <dd className="text-gray-800">
1271
+ {dappStorageFields.total_settled.toString()}
1272
+ </dd>
1273
+ </div>
1274
+ <div
1275
+ className={`flex justify-between font-semibold ${
1276
+ dappStorageFields.suspended ? 'text-red-600' : 'text-green-600'
1277
+ }`}
1278
+ >
1279
+ <dt>suspended</dt>
1280
+ <dd>{dappStorageFields.suspended ? 'YES' : 'NO'}</dd>
1281
+ </div>
1282
+ </dl>
1283
+ </div>
1284
+ )}
1285
+ </div>
1286
+ )}
1287
+
791
1288
  {/* GraphQL Counter Display */}
792
1289
  <div className="text-center bg-gradient-to-r from-blue-50 to-cyan-50 rounded-xl p-8">
793
1290
  <div className="text-6xl font-bold text-blue-600 mb-4">{graphqlValue}</div>
@@ -798,7 +1295,7 @@ export default function Home() {
798
1295
  type="button"
799
1296
  className="px-8 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 font-medium text-lg"
800
1297
  onClick={() => incrementCounter()}
801
- disabled={loading || Number(balance) === 0}
1298
+ disabled={loading || Number(balance) === 0 || !userStorageId}
802
1299
  >
803
1300
  {loading ? 'Processing...' : '🚀 Increment Counter'}
804
1301
  </button>
@@ -889,6 +1386,14 @@ export default function Home() {
889
1386
  automatically update to display the latest data
890
1387
  </p>
891
1388
  </div>
1389
+
1390
+ {/* Proxy Demo Card */}
1391
+ <ProxyCard
1392
+ userStorageId={userStorageId}
1393
+ onSessionChanged={async () => {
1394
+ if (userStorageId) await refreshStorageFields(userStorageId);
1395
+ }}
1396
+ />
892
1397
  </>
893
1398
  )}
894
1399
  </div>
@@ -6,7 +6,13 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
6
6
 
7
7
  import contractMetadata from 'contracts/metadata.json';
8
8
  import dubheMetadata from 'contracts/dubhe.config.json';
9
- import { DUBHE_SCHEMA_ID, PACKAGE_ID, NETWORK } from 'contracts/deployment';
9
+ import {
10
+ DappHubId,
11
+ DappStorageId,
12
+ PackageId,
13
+ Network,
14
+ FrameworkPackageId
15
+ } from 'contracts/deployment';
10
16
 
11
17
  import { SuiMoveNormalizedModules } from '@0xobelisk/sui-client';
12
18
  import { DubheProvider, DubheConfig } from '@0xobelisk/react/sui';
@@ -23,9 +29,11 @@ const { networkConfig } = createNetworkConfig({
23
29
  const queryClient = new QueryClient();
24
30
 
25
31
  const DUBHE_CONFIG: DubheConfig = {
26
- network: NETWORK,
27
- packageId: PACKAGE_ID,
28
- dubheSchemaId: DUBHE_SCHEMA_ID,
32
+ network: Network,
33
+ packageId: PackageId,
34
+ dappHubId: DappHubId,
35
+ dappStorageId: DappStorageId,
36
+ frameworkPackageId: FrameworkPackageId,
29
37
  metadata: contractMetadata as SuiMoveNormalizedModules,
30
38
  dubheMetadata,
31
39
  endpoints: {
@@ -44,7 +52,7 @@ export function Providers({ children }: { children: React.ReactNode }) {
44
52
  return (
45
53
  <DubheProvider config={DUBHE_CONFIG}>
46
54
  <QueryClientProvider client={queryClient}>
47
- <SuiClientProvider networks={networkConfig} defaultNetwork={NETWORK}>
55
+ <SuiClientProvider networks={networkConfig} defaultNetwork={Network}>
48
56
  <WalletProvider>
49
57
  {children}
50
58
  <Toaster />
@@ -3,11 +3,11 @@
3
3
  # this file should NOT be committed to source control
4
4
 
5
5
  build-env = "testnet"
6
- chain-id = "c75874c2"
6
+ chain-id = "7bcfa15d"
7
7
 
8
8
  [[published]]
9
9
  source = { local = "/Users/feng/Desktop/obelisk/dubhe/templates/nextjs/sui-template/packages/contracts/src/dubhe" }
10
- published-at = "0x0998156fb668348852da7b22e650d80633490e17bb48db8b7c609e310ab16583"
11
- original-id = "0x0998156fb668348852da7b22e650d80633490e17bb48db8b7c609e310ab16583"
12
- upgrade-cap = "0x85f1a0e9644ae9cd6243710330f61cdade34bd51c49ecb9506a5e911219a32dc"
10
+ published-at = "0x954337de6806ee3122d2c6058af41ff4749aa92f8cad1d6963647b6f19f22101"
11
+ original-id = "0x954337de6806ee3122d2c6058af41ff4749aa92f8cad1d6963647b6f19f22101"
12
+ upgrade-cap = "0xda6766ceb1e3fe8cd0975ecf054711ee14fec152b694bd8ac1dd9fb73af83f1d"
13
13
  version = 1
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 1,
3
+ "resources": {
4
+ "counter1": {
5
+ "value": "u32"
6
+ },
7
+ "counter2": {
8
+ "value": "u32",
9
+ "data": "u64"
10
+ }
11
+ },
12
+ "objects": {},
13
+ "scenes": {}
14
+ }