wao 0.41.3 → 0.41.5

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 (719) hide show
  1. package/.babelrc-cjs +5 -0
  2. package/.babelrc-esm +5 -0
  3. package/.gitmodules +4 -0
  4. package/.prettierrc +6 -0
  5. package/README.md +90 -0
  6. package/app/.eslintrc.json +3 -0
  7. package/app/.mocharc.cjs +6 -0
  8. package/app/arweave.mjs +87 -0
  9. package/app/components/Footer.js +76 -0
  10. package/app/components/Global.js +1128 -0
  11. package/app/components/Header.js +306 -0
  12. package/app/components/Left.js +28 -0
  13. package/app/components/Logo.js +34 -0
  14. package/app/components/Middle.js +37 -0
  15. package/app/components/Sidebar.js +93 -0
  16. package/app/components/Tags.js +42 -0
  17. package/app/components/editor/Editor.js +322 -0
  18. package/app/components/editor/FilePath.js +42 -0
  19. package/app/components/editor/MonacoEditor.js +44 -0
  20. package/app/components/left/LeftMessages.js +85 -0
  21. package/app/components/left/LeftModules.js +86 -0
  22. package/app/components/left/LeftNetworks.js +438 -0
  23. package/app/components/left/LeftProcesses.js +98 -0
  24. package/app/components/left/LeftProjects.js +397 -0
  25. package/app/components/left/LeftTests.js +189 -0
  26. package/app/components/middle/MiddleBlocks.js +79 -0
  27. package/app/components/middle/MiddleEntity.js +16 -0
  28. package/app/components/middle/MiddleEntityAccount.js +264 -0
  29. package/app/components/middle/MiddleEntityAssignment.js +104 -0
  30. package/app/components/middle/MiddleEntityBlock.js +148 -0
  31. package/app/components/middle/MiddleEntityMessage.js +430 -0
  32. package/app/components/middle/MiddleEntityModule.js +183 -0
  33. package/app/components/middle/MiddleEntityProcess.js +323 -0
  34. package/app/components/middle/MiddleEntityTx.js +211 -0
  35. package/app/components/middle/MiddleMessages.js +87 -0
  36. package/app/components/middle/MiddleModules.js +89 -0
  37. package/app/components/middle/MiddleNetworks.js +516 -0
  38. package/app/components/middle/MiddleProcesses.js +87 -0
  39. package/app/components/middle/MiddleTests.js +134 -0
  40. package/app/components/modals/CreateFileModal.js +115 -0
  41. package/app/components/modals/CreateFolderModal.js +83 -0
  42. package/app/components/modals/CreateProjectModal.js +63 -0
  43. package/app/components/modals/FSModal.js +141 -0
  44. package/app/components/modals/ImportModal.js +105 -0
  45. package/app/components/modals/LaunchNetworkModal.js +95 -0
  46. package/app/components/modals/Modal.js +38 -0
  47. package/app/components/modals/ProxyModal.js +122 -0
  48. package/app/components/modals/RenameFileModal.js +95 -0
  49. package/app/components/styles/EditorScrollbarStyle.js +29 -0
  50. package/app/components/styles/EntityScrollbarStyle.js +29 -0
  51. package/app/components/styles/GlobalStyle.js +102 -0
  52. package/app/components/styles/XtermStyle.js +37 -0
  53. package/app/components/terminal/Terminal.js +132 -0
  54. package/app/components/terminal/Xterm.js +160 -0
  55. package/app/components/ui/avatar.jsx +49 -0
  56. package/app/components/ui/checkbox.jsx +17 -0
  57. package/app/components/ui/close-button.jsx +20 -0
  58. package/app/components/ui/color-mode.jsx +61 -0
  59. package/app/components/ui/dialog.jsx +54 -0
  60. package/app/components/ui/drawer.jsx +44 -0
  61. package/app/components/ui/field.jsx +22 -0
  62. package/app/components/ui/input-group.jsx +39 -0
  63. package/app/components/ui/popover.jsx +49 -0
  64. package/app/components/ui/provider.jsx +12 -0
  65. package/app/components/ui/radio.jsx +17 -0
  66. package/app/components/ui/slider.jsx +107 -0
  67. package/app/components/ui/toaster.jsx +69 -0
  68. package/app/components/ui/tooltip.jsx +35 -0
  69. package/app/index.js +10 -0
  70. package/app/jsconfig.json +7 -0
  71. package/app/lib/GithubCSS.js +1218 -0
  72. package/app/lib/addon-fit.js +72 -0
  73. package/app/lib/data.js +31 -0
  74. package/app/lib/github-markdown.css +1169 -0
  75. package/app/lib/global.js +1 -0
  76. package/app/lib/guide.js +82 -0
  77. package/app/lib/hub.js +109 -0
  78. package/app/lib/scripts.js +47 -0
  79. package/app/lib/store.js +34 -0
  80. package/app/lib/use.js +64 -0
  81. package/app/lib/utils.js +387 -0
  82. package/app/lib/webrtc.js +217 -0
  83. package/app/next.config.js +25 -0
  84. package/app/package.json +62 -0
  85. package/app/pages/404.js +9 -0
  86. package/app/pages/_app.js +10 -0
  87. package/app/pages/_document.js +14 -0
  88. package/app/pages/index.js +121 -0
  89. package/app/playwright.config.mjs +41 -0
  90. package/app/proxy.mjs +21 -0
  91. package/app/public/assets/cover.png +0 -0
  92. package/app/public/blueprints/apm.lua +91 -0
  93. package/app/public/blueprints/arena.lua +345 -0
  94. package/app/public/blueprints/arns.lua +318 -0
  95. package/app/public/blueprints/chat.lua +210 -0
  96. package/app/public/blueprints/chatroom.lua +56 -0
  97. package/app/public/blueprints/patch-legacy-reply.lua +13 -0
  98. package/app/public/blueprints/staking.lua +93 -0
  99. package/app/public/blueprints/token.lua +298 -0
  100. package/app/public/blueprints/voting.lua +45 -0
  101. package/app/public/favicon.ico +0 -0
  102. package/app/public/logo.png +0 -0
  103. package/cli-esm.js +55 -0
  104. package/cli.js +54 -0
  105. package/devnet/app/api.js +129 -0
  106. package/devnet/app/components/layout.js +89 -0
  107. package/devnet/app/components/pagination.js +144 -0
  108. package/devnet/app/components/search.js +159 -0
  109. package/devnet/app/components/table.js +124 -0
  110. package/devnet/app/components/tags.js +89 -0
  111. package/devnet/app/index.html +14 -0
  112. package/devnet/app/main.js +215 -0
  113. package/devnet/app/router.js +59 -0
  114. package/devnet/app/state.js +19 -0
  115. package/devnet/app/style.css +1606 -0
  116. package/devnet/app/utils.js +77 -0
  117. package/devnet/app/views/blocks.js +75 -0
  118. package/devnet/app/views/dashboard.js +127 -0
  119. package/devnet/app/views/entity.js +1473 -0
  120. package/devnet/app/views/messages.js +90 -0
  121. package/devnet/app/views/modules.js +165 -0
  122. package/devnet/app/views/processes.js +90 -0
  123. package/devnet/app/views/schedulers.js +90 -0
  124. package/devnet/app/views/transactions.js +88 -0
  125. package/devnet/migrations/0001_initial.sql +51 -0
  126. package/devnet/package.json +26 -0
  127. package/devnet/playwright.config.js +7 -0
  128. package/devnet/src/cu-worker.js +166 -0
  129. package/devnet/src/index.js +309 -0
  130. package/devnet/vite.config.js +17 -0
  131. package/devnet/vitest.config.js +10 -0
  132. package/devnet/wrangler-cu.toml +32 -0
  133. package/devnet/wrangler.toml +38 -0
  134. package/dhfs-tutorial-app/package.json +15 -0
  135. package/dist/esm/workspace/dashboard/public/favicon.png +0 -0
  136. package/dist/esm/workspace/src/counter.lua +14 -0
  137. package/dist/package.json +82 -0
  138. package/hb.sh +18 -0
  139. package/hbsig/.babelrc-cjs +5 -0
  140. package/hbsig/.babelrc-esm +5 -0
  141. package/hbsig/README.md +1 -0
  142. package/hbsig/dist/cjs/bin_to_str.js +44 -0
  143. package/hbsig/dist/cjs/collect-body-keys.js +470 -0
  144. package/hbsig/dist/cjs/commit.js +330 -0
  145. package/hbsig/dist/cjs/encode-array-item.js +110 -0
  146. package/hbsig/dist/cjs/encode-utils.js +242 -0
  147. package/hbsig/dist/cjs/encode.js +1365 -0
  148. package/hbsig/dist/cjs/erl_json.js +326 -0
  149. package/hbsig/dist/cjs/erl_str.js +1042 -0
  150. package/hbsig/dist/cjs/flat.js +279 -0
  151. package/hbsig/dist/cjs/http-message-signatures/httpbis.js +489 -0
  152. package/hbsig/dist/cjs/http-message-signatures/index.js +25 -0
  153. package/hbsig/dist/cjs/http-message-signatures/structured-header.js +129 -0
  154. package/hbsig/dist/cjs/httpsig.js +861 -0
  155. package/hbsig/dist/cjs/id.js +470 -0
  156. package/hbsig/dist/cjs/index.js +174 -0
  157. package/hbsig/dist/cjs/nocrypto.js +51 -0
  158. package/hbsig/dist/cjs/parser.js +201 -0
  159. package/hbsig/dist/cjs/send-utils.js +1231 -0
  160. package/hbsig/dist/cjs/send.js +211 -0
  161. package/hbsig/dist/cjs/signer-utils.js +494 -0
  162. package/hbsig/dist/cjs/signer.js +436 -0
  163. package/hbsig/dist/cjs/structured.js +515 -0
  164. package/hbsig/dist/cjs/test.js +12 -0
  165. package/hbsig/dist/cjs/utils.js +44 -0
  166. package/hbsig/dist/esm/bin_to_str.js +46 -0
  167. package/hbsig/dist/esm/collect-body-keys.js +436 -0
  168. package/hbsig/dist/esm/commit.js +219 -0
  169. package/hbsig/dist/esm/encode-array-item.js +112 -0
  170. package/hbsig/dist/esm/encode-utils.js +191 -0
  171. package/hbsig/dist/esm/encode.js +1256 -0
  172. package/hbsig/dist/esm/erl_json.js +292 -0
  173. package/hbsig/dist/esm/erl_str.js +1144 -0
  174. package/hbsig/dist/esm/flat.js +250 -0
  175. package/hbsig/dist/esm/http-message-signatures/httpbis.js +438 -0
  176. package/hbsig/dist/esm/http-message-signatures/index.js +4 -0
  177. package/hbsig/dist/esm/http-message-signatures/structured-header.js +105 -0
  178. package/hbsig/dist/esm/httpsig.js +866 -0
  179. package/hbsig/dist/esm/id.js +459 -0
  180. package/hbsig/dist/esm/index.js +13 -0
  181. package/hbsig/dist/esm/nocrypto.js +4 -0
  182. package/hbsig/dist/esm/package.json +3 -0
  183. package/hbsig/dist/esm/parser.js +171 -0
  184. package/hbsig/dist/esm/send-utils.js +1132 -0
  185. package/hbsig/dist/esm/send.js +142 -0
  186. package/hbsig/dist/esm/signer-utils.js +375 -0
  187. package/hbsig/dist/esm/signer.js +312 -0
  188. package/hbsig/dist/esm/structured.js +496 -0
  189. package/hbsig/dist/esm/test.js +2 -0
  190. package/hbsig/dist/esm/utils.js +29 -0
  191. package/hbsig/dist/package.json +39 -0
  192. package/hbsig/make.js +36 -0
  193. package/hbsig/package.json +39 -0
  194. package/hbsig/src/bin_to_str.js +46 -0
  195. package/hbsig/src/collect-body-keys.js +436 -0
  196. package/hbsig/src/commit.js +219 -0
  197. package/hbsig/src/encode-array-item.js +112 -0
  198. package/hbsig/src/encode-utils.js +191 -0
  199. package/hbsig/src/encode.js +1256 -0
  200. package/hbsig/src/erl_json.js +292 -0
  201. package/hbsig/src/erl_str.js +1144 -0
  202. package/hbsig/src/flat.js +250 -0
  203. package/hbsig/src/http-message-signatures/httpbis.js +438 -0
  204. package/hbsig/src/http-message-signatures/index.js +4 -0
  205. package/hbsig/src/http-message-signatures/structured-header.js +105 -0
  206. package/hbsig/src/httpsig.js +866 -0
  207. package/hbsig/src/id.js +459 -0
  208. package/hbsig/src/index.js +13 -0
  209. package/hbsig/src/nocrypto.js +4 -0
  210. package/hbsig/src/parser.js +171 -0
  211. package/hbsig/src/send-utils.js +1132 -0
  212. package/hbsig/src/send.js +142 -0
  213. package/hbsig/src/signer-utils.js +375 -0
  214. package/hbsig/src/signer.js +312 -0
  215. package/hbsig/src/structured.js +496 -0
  216. package/hbsig/src/test.js +2 -0
  217. package/hbsig/src/utils.js +29 -0
  218. package/lp/index.html +25 -0
  219. package/lp/package.json +19 -0
  220. package/lp/public/cover.png +0 -0
  221. package/lp/public/favicon.ico +0 -0
  222. package/lp/public/favicon.png +0 -0
  223. package/lp/public/images/book.jpg +0 -0
  224. package/lp/public/images/dashboard.png +0 -0
  225. package/lp/public/images/devnet.png +0 -0
  226. package/lp/public/images/hero-bg.png +0 -0
  227. package/lp/public/images/hyperadd.png +0 -0
  228. package/lp/public/images/message-flow.png +0 -0
  229. package/lp/public/images/mobile.png +0 -0
  230. package/lp/public/images/og-cover.png +0 -0
  231. package/lp/public/images/scan.png +0 -0
  232. package/lp/public/images/wao-hub.png +0 -0
  233. package/lp/public/images/wao-web.png +0 -0
  234. package/lp/public/logo.png +0 -0
  235. package/lp/src/App.jsx +29 -0
  236. package/lp/src/components/CodeBlock.jsx +37 -0
  237. package/lp/src/components/CodeBlock.module.css +89 -0
  238. package/lp/src/components/Footer.jsx +22 -0
  239. package/lp/src/components/Footer.module.css +60 -0
  240. package/lp/src/components/Nav.jsx +80 -0
  241. package/lp/src/components/Nav.module.css +177 -0
  242. package/lp/src/components/SectionWrapper.jsx +15 -0
  243. package/lp/src/hooks/useReveal.js +25 -0
  244. package/lp/src/hooks/useScrolled.js +14 -0
  245. package/lp/src/main.jsx +10 -0
  246. package/lp/src/sections/Book.jsx +60 -0
  247. package/lp/src/sections/Book.module.css +204 -0
  248. package/lp/src/sections/Browser.jsx +46 -0
  249. package/lp/src/sections/Browser.module.css +67 -0
  250. package/lp/src/sections/Devnet.jsx +55 -0
  251. package/lp/src/sections/Devnet.module.css +136 -0
  252. package/lp/src/sections/GetStarted.jsx +51 -0
  253. package/lp/src/sections/GetStarted.module.css +128 -0
  254. package/lp/src/sections/Hero.jsx +67 -0
  255. package/lp/src/sections/Hero.module.css +202 -0
  256. package/lp/src/sections/HyperADD.jsx +46 -0
  257. package/lp/src/sections/HyperADD.module.css +113 -0
  258. package/lp/src/sections/SDK.jsx +90 -0
  259. package/lp/src/sections/SDK.module.css +122 -0
  260. package/lp/src/sections/Testing.jsx +47 -0
  261. package/lp/src/sections/Testing.module.css +124 -0
  262. package/lp/src/sections/Vision.jsx +93 -0
  263. package/lp/src/sections/Vision.module.css +147 -0
  264. package/lp/src/styles/globals.css +285 -0
  265. package/lp/src/utils/scrollTo.js +4 -0
  266. package/lp/vite.config.js +7 -0
  267. package/make.js +39 -0
  268. package/package.json +17 -12
  269. package/patches/@permaweb+ao-loader+0.0.44.patch +64 -0
  270. package/plan.md +435 -0
  271. package/rebar.lock +1 -0
  272. package/src/accounts-web.js +128 -0
  273. package/src/accounts.js +124 -0
  274. package/src/adaptor-base.js +622 -0
  275. package/src/adaptor-cf.js +11 -0
  276. package/src/adaptor-web.js +11 -0
  277. package/src/adaptor.js +10 -0
  278. package/src/ao-loader.js +30660 -0
  279. package/src/ao.js +1173 -0
  280. package/src/aoconnect-base.js +1098 -0
  281. package/src/aoconnect-cf.js +9 -0
  282. package/src/aoconnect-web.js +8 -0
  283. package/src/aoconnect.js +8 -0
  284. package/src/aos_wamr.js +1 -0
  285. package/src/ar-remote.js +87 -0
  286. package/src/ar.js +276 -0
  287. package/src/armem-base.js +529 -0
  288. package/src/armem-cf.js +67 -0
  289. package/src/armem-web.js +19 -0
  290. package/src/armem.js +26 -0
  291. package/src/bao.js +141 -0
  292. package/src/bar.js +366 -0
  293. package/src/build.js +7 -0
  294. package/src/bundler.js +119 -0
  295. package/src/car.js +10 -0
  296. package/src/cf-env.js +29 -0
  297. package/src/cf.js +11 -0
  298. package/src/cli.js +561 -0
  299. package/src/compress.js +112 -0
  300. package/src/create.js +415 -0
  301. package/src/devs.js +86 -0
  302. package/src/dirname.js +1 -0
  303. package/src/dodb.js +26 -0
  304. package/src/erl_json.js +289 -0
  305. package/src/erl_str.js +1139 -0
  306. package/src/gql.js +229 -0
  307. package/src/hb.js +967 -0
  308. package/src/helpers.js +203 -0
  309. package/src/http.js +619 -0
  310. package/src/hub/bundler.js +123 -0
  311. package/src/hub/cu.js +74 -0
  312. package/src/hub/fs.js +157 -0
  313. package/src/hub/index.js +85 -0
  314. package/src/hub/utils.js +64 -0
  315. package/src/hub/ws-proxy.js +67 -0
  316. package/src/hyper-aos.js +1 -0
  317. package/src/hyperbeam-server.js +21 -0
  318. package/src/hyperbeam.js +585 -0
  319. package/src/index.js +5 -0
  320. package/src/keygen.js +47 -0
  321. package/src/lfdb.js +67 -0
  322. package/src/lua/aos.wasm +0 -0
  323. package/src/lua/aos2_0_1.js +1 -0
  324. package/src/lua/aos2_0_1.wasm +0 -0
  325. package/src/lua/aos2_0_3.js +1 -0
  326. package/src/lua/aos2_0_3.wasm +0 -0
  327. package/src/lua/aos2_0_4_32.js +1 -0
  328. package/src/lua/aos2_0_4_32.wasm +0 -0
  329. package/src/lua/aos2_0_6.wasm +0 -0
  330. package/src/lua/apm.lua +61 -0
  331. package/src/lua/llama.wasm +0 -0
  332. package/src/lua/process.wasm +0 -0
  333. package/src/lua/sqlite.js +1 -0
  334. package/src/lua/sqlite.wasm +0 -0
  335. package/src/lua/weavedb_mock.lua +44 -0
  336. package/src/lua/weavedrive.lua +53 -0
  337. package/src/run.js +25 -0
  338. package/src/server.js +173 -0
  339. package/src/storage-multi.js +183 -0
  340. package/src/tao.js +12 -0
  341. package/src/tar.js +10 -0
  342. package/src/test.js +42 -0
  343. package/src/tgql-d1.js +407 -0
  344. package/src/tgql.js +310 -0
  345. package/src/toerl.js +162 -0
  346. package/src/utils.js +777 -0
  347. package/src/wao.js +29 -0
  348. package/src/waosm/README.md +81 -0
  349. package/src/waosm/waosm.d.ts +40 -0
  350. package/src/waosm/waosm.js +240 -0
  351. package/src/waosm/waosm_bg.wasm +0 -0
  352. package/src/waosm/waosm_bg.wasm.d.ts +8 -0
  353. package/src/waosm-node/README.md +81 -0
  354. package/src/waosm-node/waosm.d.ts +8 -0
  355. package/src/waosm-node/waosm.js +4 -0
  356. package/src/waosm-node/waosm_bg.js +147 -0
  357. package/src/waosm-node/waosm_bg.wasm +0 -0
  358. package/src/waosm-node/waosm_bg.wasm.d.ts +8 -0
  359. package/src/waosm-node/waosm_bg.wasm.js +14 -0
  360. package/src/waosm-node.js +9 -0
  361. package/src/war.js +10 -0
  362. package/src/weavedrive.js +376 -0
  363. package/src/web.js +11 -0
  364. package/src/workspace/.mcp.json +8 -0
  365. package/src/workspace/CLAUDE.md +258 -0
  366. package/src/workspace/README.md +85 -0
  367. package/src/workspace/dashboard/index.html +163 -0
  368. package/src/workspace/dashboard/package.json +18 -0
  369. package/src/workspace/dashboard/public/favicon.ico +0 -0
  370. package/src/workspace/dashboard/public/favicon.png +0 -0
  371. package/src/workspace/dashboard/server.js +224 -0
  372. package/src/workspace/dashboard/src/App.jsx +2350 -0
  373. package/{cjs/workspace/frontend → src/workspace/dashboard}/vite.config.js +6 -0
  374. package/src/workspace/package.json +18 -0
  375. package/src/workspace/src/counter.lua +14 -0
  376. package/tsconfig.json +18 -0
  377. package/types/index.d.ts +329 -0
  378. package/waollama/.eslintrc.json +3 -0
  379. package/waollama/README.md +19 -0
  380. package/waollama/arweave.mjs +87 -0
  381. package/waollama/components/ui/avatar.jsx +49 -0
  382. package/waollama/components/ui/checkbox.jsx +17 -0
  383. package/waollama/components/ui/close-button.jsx +20 -0
  384. package/waollama/components/ui/color-mode.jsx +61 -0
  385. package/waollama/components/ui/dialog.jsx +54 -0
  386. package/waollama/components/ui/drawer.jsx +44 -0
  387. package/waollama/components/ui/field.jsx +22 -0
  388. package/waollama/components/ui/input-group.jsx +39 -0
  389. package/waollama/components/ui/popover.jsx +49 -0
  390. package/waollama/components/ui/provider.jsx +12 -0
  391. package/waollama/components/ui/radio.jsx +17 -0
  392. package/waollama/components/ui/slider.jsx +107 -0
  393. package/waollama/components/ui/tooltip.jsx +35 -0
  394. package/waollama/index.js +10 -0
  395. package/waollama/jsconfig.json +7 -0
  396. package/waollama/lib/ao-loader.js +30654 -0
  397. package/waollama/lib/client.js +1 -0
  398. package/waollama/lib/wasm.js +1 -0
  399. package/waollama/next.config.js +25 -0
  400. package/waollama/package.json +43 -0
  401. package/waollama/pages/404.js +9 -0
  402. package/waollama/pages/_app.js +9 -0
  403. package/waollama/pages/_document.js +14 -0
  404. package/waollama/pages/index.js +212 -0
  405. package/waollama/playwright.config.js +31 -0
  406. package/waollama/proxy.mjs +21 -0
  407. package/waollama/public/favicon.ico +0 -0
  408. package/waollama/public/human.png +0 -0
  409. package/waollama/public/llama.png +0 -0
  410. package/waosm/Cargo.toml +11 -0
  411. package/waosm/README.md +81 -0
  412. package/waosm/compress.js +112 -0
  413. package/waosm/make.js +33 -0
  414. package/waosm/package.json +10 -0
  415. package/waosm/src/lib.rs +180 -0
  416. package/waosm/test.js +16 -0
  417. package/cjs/workspace/.claude/agents/builder.md +0 -99
  418. package/cjs/workspace/.claude/agents/device-builder.md +0 -86
  419. package/cjs/workspace/.claude/agents/tester.md +0 -90
  420. package/cjs/workspace/.claude/mcp/dashboard/server.js +0 -128
  421. package/cjs/workspace/.claude/rules/deploy.md +0 -45
  422. package/cjs/workspace/.claude/rules/frontend.md +0 -69
  423. package/cjs/workspace/.claude/rules/hyperbeam.md +0 -104
  424. package/cjs/workspace/.claude/rules/lua.md +0 -108
  425. package/cjs/workspace/.claude/rules/testing.md +0 -257
  426. package/cjs/workspace/.claude/settings.json +0 -109
  427. package/cjs/workspace/.claude/skills/build/SKILL.md +0 -214
  428. package/cjs/workspace/.claude/skills/build-aos/SKILL.md +0 -129
  429. package/cjs/workspace/.claude/skills/build-device/SKILL.md +0 -192
  430. package/cjs/workspace/.claude/skills/build-frontend/SKILL.md +0 -134
  431. package/cjs/workspace/.claude/skills/build-module/SKILL.md +0 -281
  432. package/cjs/workspace/.claude/skills/create-aos/SKILL.md +0 -63
  433. package/cjs/workspace/.claude/skills/create-device/SKILL.md +0 -87
  434. package/cjs/workspace/.claude/skills/create-module/SKILL.md +0 -162
  435. package/cjs/workspace/.claude/skills/debug/SKILL.md +0 -57
  436. package/cjs/workspace/.claude/skills/deploy/SKILL.md +0 -85
  437. package/cjs/workspace/.claude/skills/dev/SKILL.md +0 -32
  438. package/cjs/workspace/.claude/skills/plan/SKILL.md +0 -176
  439. package/cjs/workspace/.claude/skills/readme/SKILL.md +0 -186
  440. package/cjs/workspace/.claude/skills/report/SKILL.md +0 -49
  441. package/cjs/workspace/.claude/skills/team/SKILL.md +0 -101
  442. package/cjs/workspace/.claude/skills/test/SKILL.md +0 -56
  443. package/cjs/workspace/.claude/skills/test-device/SKILL.md +0 -114
  444. package/cjs/workspace/.claude/skills/test-e2e/SKILL.md +0 -103
  445. package/cjs/workspace/.claude/skills/test-hb/SKILL.md +0 -76
  446. package/cjs/workspace/.claude/skills/validate/SKILL.md +0 -96
  447. package/cjs/workspace/.claude/skills/validate/scripts/check-lua.sh +0 -41
  448. package/cjs/workspace/docs/aos-lua.md +0 -428
  449. package/cjs/workspace/docs/debug.md +0 -230
  450. package/cjs/workspace/docs/hyperbeam-dev.md +0 -606
  451. package/cjs/workspace/docs/hyperbeam-devices.md +0 -618
  452. package/cjs/workspace/docs/wao-sdk.md +0 -807
  453. package/cjs/workspace/frontend/e2e/.gitkeep +0 -0
  454. package/cjs/workspace/frontend/index.html +0 -12
  455. package/cjs/workspace/frontend/package.json +0 -24
  456. package/cjs/workspace/frontend/playwright.config.js +0 -10
  457. package/cjs/workspace/frontend/src/App.jsx +0 -24
  458. package/cjs/workspace/frontend/test/.gitkeep +0 -0
  459. package/cjs/workspace/frontend/vitest.config.js +0 -10
  460. package/cjs/workspace/scripts/deploy.js +0 -140
  461. package/cjs/workspace/scripts/keygen.js +0 -52
  462. package/cjs/workspace/test/aos.test.js +0 -98
  463. package/cjs/workspace/test/hyperbeam.test.js +0 -80
  464. package/esm/compiler/native +0 -0
  465. package/esm/workspace/.claude/agents/builder.md +0 -99
  466. package/esm/workspace/.claude/agents/device-builder.md +0 -86
  467. package/esm/workspace/.claude/agents/tester.md +0 -90
  468. package/esm/workspace/.claude/mcp/dashboard/server.js +0 -128
  469. package/esm/workspace/.claude/rules/deploy.md +0 -45
  470. package/esm/workspace/.claude/rules/frontend.md +0 -69
  471. package/esm/workspace/.claude/rules/hyperbeam.md +0 -104
  472. package/esm/workspace/.claude/rules/lua.md +0 -108
  473. package/esm/workspace/.claude/rules/testing.md +0 -257
  474. package/esm/workspace/.claude/settings.json +0 -109
  475. package/esm/workspace/.claude/skills/build/SKILL.md +0 -214
  476. package/esm/workspace/.claude/skills/build-aos/SKILL.md +0 -129
  477. package/esm/workspace/.claude/skills/build-device/SKILL.md +0 -192
  478. package/esm/workspace/.claude/skills/build-frontend/SKILL.md +0 -134
  479. package/esm/workspace/.claude/skills/build-module/SKILL.md +0 -281
  480. package/esm/workspace/.claude/skills/create-aos/SKILL.md +0 -63
  481. package/esm/workspace/.claude/skills/create-device/SKILL.md +0 -87
  482. package/esm/workspace/.claude/skills/create-module/SKILL.md +0 -162
  483. package/esm/workspace/.claude/skills/debug/SKILL.md +0 -57
  484. package/esm/workspace/.claude/skills/deploy/SKILL.md +0 -85
  485. package/esm/workspace/.claude/skills/dev/SKILL.md +0 -32
  486. package/esm/workspace/.claude/skills/plan/SKILL.md +0 -176
  487. package/esm/workspace/.claude/skills/readme/SKILL.md +0 -186
  488. package/esm/workspace/.claude/skills/report/SKILL.md +0 -49
  489. package/esm/workspace/.claude/skills/team/SKILL.md +0 -101
  490. package/esm/workspace/.claude/skills/test/SKILL.md +0 -56
  491. package/esm/workspace/.claude/skills/test-device/SKILL.md +0 -114
  492. package/esm/workspace/.claude/skills/test-e2e/SKILL.md +0 -103
  493. package/esm/workspace/.claude/skills/test-hb/SKILL.md +0 -76
  494. package/esm/workspace/.claude/skills/validate/SKILL.md +0 -96
  495. package/esm/workspace/.claude/skills/validate/scripts/check-lua.sh +0 -41
  496. package/esm/workspace/docs/aos-lua.md +0 -428
  497. package/esm/workspace/docs/debug.md +0 -230
  498. package/esm/workspace/docs/hyperbeam-dev.md +0 -606
  499. package/esm/workspace/docs/hyperbeam-devices.md +0 -618
  500. package/esm/workspace/docs/wao-sdk.md +0 -807
  501. package/esm/workspace/frontend/e2e/.gitkeep +0 -0
  502. package/esm/workspace/frontend/index.html +0 -12
  503. package/esm/workspace/frontend/package.json +0 -24
  504. package/esm/workspace/frontend/playwright.config.js +0 -10
  505. package/esm/workspace/frontend/src/App.jsx +0 -24
  506. package/esm/workspace/frontend/src/main.jsx +0 -9
  507. package/esm/workspace/frontend/test/.gitkeep +0 -0
  508. package/esm/workspace/frontend/vite.config.js +0 -6
  509. package/esm/workspace/frontend/vitest.config.js +0 -10
  510. package/esm/workspace/scripts/deploy.js +0 -140
  511. package/esm/workspace/scripts/keygen.js +0 -52
  512. package/esm/workspace/test/aos.test.js +0 -98
  513. package/esm/workspace/test/hyperbeam.test.js +0 -80
  514. /package/{cjs/workspace/dashboard/public → devnet/app}/favicon.ico +0 -0
  515. /package/{cjs/workspace → dhfs-tutorial-app}/src/counter.lua +0 -0
  516. /package/{cjs → dist/cjs}/accounts-web.js +0 -0
  517. /package/{cjs → dist/cjs}/accounts.js +0 -0
  518. /package/{cjs → dist/cjs}/adaptor-base.js +0 -0
  519. /package/{cjs → dist/cjs}/adaptor-cf.js +0 -0
  520. /package/{cjs → dist/cjs}/adaptor-web.js +0 -0
  521. /package/{cjs → dist/cjs}/adaptor.js +0 -0
  522. /package/{cjs → dist/cjs}/ao-loader.js +0 -0
  523. /package/{cjs → dist/cjs}/ao.js +0 -0
  524. /package/{cjs → dist/cjs}/aoconnect-base.js +0 -0
  525. /package/{cjs → dist/cjs}/aoconnect-cf.js +0 -0
  526. /package/{cjs → dist/cjs}/aoconnect-web.js +0 -0
  527. /package/{cjs → dist/cjs}/aoconnect.js +0 -0
  528. /package/{cjs → dist/cjs}/aos_wamr.js +0 -0
  529. /package/{cjs → dist/cjs}/ar-remote.js +0 -0
  530. /package/{cjs → dist/cjs}/ar.js +0 -0
  531. /package/{cjs → dist/cjs}/armem-base.js +0 -0
  532. /package/{cjs → dist/cjs}/armem-cf.js +0 -0
  533. /package/{cjs → dist/cjs}/armem-web.js +0 -0
  534. /package/{cjs → dist/cjs}/armem.js +0 -0
  535. /package/{cjs → dist/cjs}/bao.js +0 -0
  536. /package/{cjs → dist/cjs}/bar.js +0 -0
  537. /package/{cjs → dist/cjs}/build.js +0 -0
  538. /package/{cjs → dist/cjs}/bundler.js +0 -0
  539. /package/{cjs → dist/cjs}/car.js +0 -0
  540. /package/{cjs → dist/cjs}/cf-env.js +0 -0
  541. /package/{cjs → dist/cjs}/cf.js +0 -0
  542. /package/{cjs → dist/cjs}/cli.js +0 -0
  543. /package/{cjs → dist/cjs}/compress.js +0 -0
  544. /package/{cjs → dist/cjs}/create.js +0 -0
  545. /package/{cjs → dist/cjs}/devs.js +0 -0
  546. /package/{cjs → dist/cjs}/dirname.js +0 -0
  547. /package/{cjs → dist/cjs}/dodb.js +0 -0
  548. /package/{cjs → dist/cjs}/erl_json.js +0 -0
  549. /package/{cjs → dist/cjs}/erl_str.js +0 -0
  550. /package/{cjs → dist/cjs}/gql.js +0 -0
  551. /package/{cjs → dist/cjs}/hb.js +0 -0
  552. /package/{cjs → dist/cjs}/helpers.js +0 -0
  553. /package/{cjs → dist/cjs}/http.js +0 -0
  554. /package/{cjs → dist/cjs}/hub/bundler.js +0 -0
  555. /package/{cjs → dist/cjs}/hub/cu.js +0 -0
  556. /package/{cjs → dist/cjs}/hub/fs.js +0 -0
  557. /package/{cjs → dist/cjs}/hub/index.js +0 -0
  558. /package/{cjs → dist/cjs}/hub/utils.js +0 -0
  559. /package/{cjs → dist/cjs}/hub/ws-proxy.js +0 -0
  560. /package/{cjs → dist/cjs}/hyper-aos.js +0 -0
  561. /package/{cjs → dist/cjs}/hyperbeam-server.js +0 -0
  562. /package/{cjs → dist/cjs}/hyperbeam.js +0 -0
  563. /package/{cjs → dist/cjs}/index.js +0 -0
  564. /package/{cjs → dist/cjs}/keygen.js +0 -0
  565. /package/{cjs → dist/cjs}/lfdb.js +0 -0
  566. /package/{cjs → dist/cjs}/lua/aos.wasm +0 -0
  567. /package/{cjs → dist/cjs}/lua/aos2_0_1.js +0 -0
  568. /package/{cjs → dist/cjs}/lua/aos2_0_1.wasm +0 -0
  569. /package/{cjs → dist/cjs}/lua/aos2_0_3.js +0 -0
  570. /package/{cjs → dist/cjs}/lua/aos2_0_3.wasm +0 -0
  571. /package/{cjs → dist/cjs}/lua/aos2_0_4_32.js +0 -0
  572. /package/{cjs → dist/cjs}/lua/aos2_0_4_32.wasm +0 -0
  573. /package/{cjs → dist/cjs}/lua/aos2_0_6.wasm +0 -0
  574. /package/{cjs → dist/cjs}/lua/apm.lua +0 -0
  575. /package/{cjs → dist/cjs}/lua/llama.wasm +0 -0
  576. /package/{cjs → dist/cjs}/lua/process.wasm +0 -0
  577. /package/{cjs → dist/cjs}/lua/sqlite.js +0 -0
  578. /package/{cjs → dist/cjs}/lua/sqlite.wasm +0 -0
  579. /package/{cjs → dist/cjs}/lua/weavedb_mock.lua +0 -0
  580. /package/{cjs → dist/cjs}/lua/weavedrive.lua +0 -0
  581. /package/{cjs → dist/cjs}/run.js +0 -0
  582. /package/{cjs → dist/cjs}/server.js +0 -0
  583. /package/{cjs → dist/cjs}/storage-multi.js +0 -0
  584. /package/{cjs → dist/cjs}/tao.js +0 -0
  585. /package/{cjs → dist/cjs}/tar.js +0 -0
  586. /package/{cjs → dist/cjs}/test.js +0 -0
  587. /package/{cjs → dist/cjs}/tgql-d1.js +0 -0
  588. /package/{cjs → dist/cjs}/tgql.js +0 -0
  589. /package/{cjs → dist/cjs}/toerl.js +0 -0
  590. /package/{cjs → dist/cjs}/utils.js +0 -0
  591. /package/{cjs → dist/cjs}/wao.js +0 -0
  592. /package/{cjs → dist/cjs}/waosm/waosm.js +0 -0
  593. /package/{cjs → dist/cjs}/waosm-node/waosm.js +0 -0
  594. /package/{cjs → dist/cjs}/waosm-node/waosm_bg.js +0 -0
  595. /package/{cjs → dist/cjs}/waosm-node/waosm_bg.wasm +0 -0
  596. /package/{cjs → dist/cjs}/waosm-node/waosm_bg.wasm.js +0 -0
  597. /package/{cjs → dist/cjs}/waosm-node.js +0 -0
  598. /package/{cjs → dist/cjs}/war.js +0 -0
  599. /package/{cjs → dist/cjs}/weavedrive.js +0 -0
  600. /package/{cjs → dist/cjs}/web.js +0 -0
  601. /package/{cjs → dist/cjs}/workspace/.mcp.json +0 -0
  602. /package/{cjs → dist/cjs}/workspace/CLAUDE.md +0 -0
  603. /package/{cjs → dist/cjs}/workspace/README.md +0 -0
  604. /package/{cjs → dist/cjs}/workspace/dashboard/index.html +0 -0
  605. /package/{cjs → dist/cjs}/workspace/dashboard/package.json +0 -0
  606. /package/{esm → dist/cjs}/workspace/dashboard/public/favicon.ico +0 -0
  607. /package/{cjs → dist/cjs}/workspace/dashboard/public/favicon.png +0 -0
  608. /package/{cjs → dist/cjs}/workspace/dashboard/server.js +0 -0
  609. /package/{cjs → dist/cjs}/workspace/dashboard/src/App.jsx +0 -0
  610. /package/{cjs → dist/cjs}/workspace/dashboard/src/main.jsx +0 -0
  611. /package/{cjs → dist/cjs}/workspace/dashboard/vite.config.js +0 -0
  612. /package/{cjs → dist/cjs}/workspace/package.json +0 -0
  613. /package/{esm → dist/cjs}/workspace/src/counter.lua +0 -0
  614. /package/{esm → dist/esm}/accounts-web.js +0 -0
  615. /package/{esm → dist/esm}/accounts.js +0 -0
  616. /package/{esm → dist/esm}/adaptor-base.js +0 -0
  617. /package/{esm → dist/esm}/adaptor-cf.js +0 -0
  618. /package/{esm → dist/esm}/adaptor-web.js +0 -0
  619. /package/{esm → dist/esm}/adaptor.js +0 -0
  620. /package/{esm → dist/esm}/ao-loader.js +0 -0
  621. /package/{esm → dist/esm}/ao.js +0 -0
  622. /package/{esm → dist/esm}/aoconnect-base.js +0 -0
  623. /package/{esm → dist/esm}/aoconnect-cf.js +0 -0
  624. /package/{esm → dist/esm}/aoconnect-web.js +0 -0
  625. /package/{esm → dist/esm}/aoconnect.js +0 -0
  626. /package/{esm → dist/esm}/aos_wamr.js +0 -0
  627. /package/{esm → dist/esm}/ar-remote.js +0 -0
  628. /package/{esm → dist/esm}/ar.js +0 -0
  629. /package/{esm → dist/esm}/armem-base.js +0 -0
  630. /package/{esm → dist/esm}/armem-cf.js +0 -0
  631. /package/{esm → dist/esm}/armem-web.js +0 -0
  632. /package/{esm → dist/esm}/armem.js +0 -0
  633. /package/{esm → dist/esm}/bao.js +0 -0
  634. /package/{esm → dist/esm}/bar.js +0 -0
  635. /package/{esm → dist/esm}/build.js +0 -0
  636. /package/{esm → dist/esm}/bundler.js +0 -0
  637. /package/{esm → dist/esm}/car.js +0 -0
  638. /package/{esm → dist/esm}/cf-env.js +0 -0
  639. /package/{esm → dist/esm}/cf.js +0 -0
  640. /package/{esm → dist/esm}/cli.js +0 -0
  641. /package/{esm → dist/esm}/compress.js +0 -0
  642. /package/{esm → dist/esm}/create.js +0 -0
  643. /package/{esm → dist/esm}/devs.js +0 -0
  644. /package/{esm → dist/esm}/dirname.js +0 -0
  645. /package/{esm → dist/esm}/dodb.js +0 -0
  646. /package/{esm → dist/esm}/erl_json.js +0 -0
  647. /package/{esm → dist/esm}/erl_str.js +0 -0
  648. /package/{esm → dist/esm}/gql.js +0 -0
  649. /package/{esm → dist/esm}/hb.js +0 -0
  650. /package/{esm → dist/esm}/helpers.js +0 -0
  651. /package/{esm → dist/esm}/http.js +0 -0
  652. /package/{esm → dist/esm}/hub/bundler.js +0 -0
  653. /package/{esm → dist/esm}/hub/cu.js +0 -0
  654. /package/{esm → dist/esm}/hub/fs.js +0 -0
  655. /package/{esm → dist/esm}/hub/index.js +0 -0
  656. /package/{esm → dist/esm}/hub/utils.js +0 -0
  657. /package/{esm → dist/esm}/hub/ws-proxy.js +0 -0
  658. /package/{esm → dist/esm}/hyper-aos.js +0 -0
  659. /package/{esm → dist/esm}/hyperbeam-server.js +0 -0
  660. /package/{esm → dist/esm}/hyperbeam.js +0 -0
  661. /package/{esm → dist/esm}/index.js +0 -0
  662. /package/{esm → dist/esm}/keygen.js +0 -0
  663. /package/{esm → dist/esm}/lfdb.js +0 -0
  664. /package/{esm → dist/esm}/lua/aos.wasm +0 -0
  665. /package/{esm → dist/esm}/lua/aos2_0_1.js +0 -0
  666. /package/{esm → dist/esm}/lua/aos2_0_1.wasm +0 -0
  667. /package/{esm → dist/esm}/lua/aos2_0_3.js +0 -0
  668. /package/{esm → dist/esm}/lua/aos2_0_3.wasm +0 -0
  669. /package/{esm → dist/esm}/lua/aos2_0_4_32.js +0 -0
  670. /package/{esm → dist/esm}/lua/aos2_0_4_32.wasm +0 -0
  671. /package/{esm → dist/esm}/lua/aos2_0_6.wasm +0 -0
  672. /package/{esm → dist/esm}/lua/apm.lua +0 -0
  673. /package/{esm → dist/esm}/lua/llama.wasm +0 -0
  674. /package/{esm → dist/esm}/lua/process.wasm +0 -0
  675. /package/{esm → dist/esm}/lua/sqlite.js +0 -0
  676. /package/{esm → dist/esm}/lua/sqlite.wasm +0 -0
  677. /package/{esm → dist/esm}/lua/weavedb_mock.lua +0 -0
  678. /package/{esm → dist/esm}/lua/weavedrive.lua +0 -0
  679. /package/{esm → dist/esm}/package.json +0 -0
  680. /package/{esm → dist/esm}/run.js +0 -0
  681. /package/{esm → dist/esm}/server.js +0 -0
  682. /package/{esm → dist/esm}/storage-multi.js +0 -0
  683. /package/{esm → dist/esm}/tao.js +0 -0
  684. /package/{esm → dist/esm}/tar.js +0 -0
  685. /package/{esm → dist/esm}/test.js +0 -0
  686. /package/{esm → dist/esm}/tgql-d1.js +0 -0
  687. /package/{esm → dist/esm}/tgql.js +0 -0
  688. /package/{esm → dist/esm}/toerl.js +0 -0
  689. /package/{esm → dist/esm}/utils.js +0 -0
  690. /package/{esm → dist/esm}/wao.js +0 -0
  691. /package/{esm → dist/esm}/waosm/README.md +0 -0
  692. /package/{esm → dist/esm}/waosm/waosm.d.ts +0 -0
  693. /package/{esm → dist/esm}/waosm/waosm.js +0 -0
  694. /package/{esm → dist/esm}/waosm/waosm_bg.wasm +0 -0
  695. /package/{esm → dist/esm}/waosm/waosm_bg.wasm.d.ts +0 -0
  696. /package/{esm → dist/esm}/waosm-node/README.md +0 -0
  697. /package/{esm → dist/esm}/waosm-node/waosm.d.ts +0 -0
  698. /package/{esm → dist/esm}/waosm-node/waosm.js +0 -0
  699. /package/{esm → dist/esm}/waosm-node/waosm_bg.js +0 -0
  700. /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm +0 -0
  701. /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm.d.ts +0 -0
  702. /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm.js +0 -0
  703. /package/{esm → dist/esm}/waosm-node.js +0 -0
  704. /package/{esm → dist/esm}/war.js +0 -0
  705. /package/{esm → dist/esm}/weavedrive.js +0 -0
  706. /package/{esm → dist/esm}/web.js +0 -0
  707. /package/{esm → dist/esm}/workspace/.mcp.json +0 -0
  708. /package/{esm → dist/esm}/workspace/CLAUDE.md +0 -0
  709. /package/{esm → dist/esm}/workspace/README.md +0 -0
  710. /package/{esm → dist/esm}/workspace/dashboard/index.html +0 -0
  711. /package/{esm → dist/esm}/workspace/dashboard/package.json +0 -0
  712. /package/{esm/workspace/dashboard/public/favicon.png → dist/esm/workspace/dashboard/public/favicon.ico} +0 -0
  713. /package/{esm → dist/esm}/workspace/dashboard/server.js +0 -0
  714. /package/{esm → dist/esm}/workspace/dashboard/src/App.jsx +0 -0
  715. /package/{cjs/workspace/frontend → dist/esm/workspace/dashboard}/src/main.jsx +0 -0
  716. /package/{esm → dist/esm}/workspace/dashboard/vite.config.js +0 -0
  717. /package/{esm → dist/esm}/workspace/package.json +0 -0
  718. /package/{postinstall.cjs → dist/postinstall.cjs} +0 -0
  719. /package/{esm → src}/workspace/dashboard/src/main.jsx +0 -0
@@ -0,0 +1,318 @@
1
+ local json = require('json')
2
+
3
+ -- Constants
4
+ -- Used to determine when to require name resolution
5
+ ID_TTL_MS = 24 * 60 * 60 * 1000 -- 24 hours by default
6
+ DATA_TTL_MS = 24 * 60 * 60 * 1000 -- 24 hours by default
7
+ OWNER_TTL_MS = 24 * 60 * 60 * 1000 -- 24 hours by default
8
+
9
+ -- URL configurations
10
+ SW_CACHE_URL = "https://api.arns.app/v1/contract/"
11
+
12
+ -- Process IDs for interacting with other services or processes
13
+ ARNS_PROCESS_ID = "TyduW6spZTr3gkdIsdktduJhgtilaR_ex5JukK8gI9o"
14
+ _0RBIT_SEND_PROCESS_ID = "BaMK1dfayo75s3q1ow6AO64UDpD9SEFbeE8xYrY2fyQ"
15
+ _0RBIT_RECEIVE_PROCESS_ID = "8aE3_6NJ_MU_q3fbhz2S6dA8PKQOSCe95Gt7suQ3j7U"
16
+
17
+ -- Initialize the NAMES and ID_NAME_MAPPING tables
18
+ NAMES = NAMES or {}
19
+ ID_NAME_MAPPING = ID_NAME_MAPPING or {}
20
+ Now = Now or 0
21
+
22
+ --- Splits a string into two parts based on the last underscore character, intended to separate ARNS names into undername and rootname components.
23
+ -- @param str The string to be split.
24
+ -- @return Two strings: the rootname (before the last underscore) and the undername (after the last underscore).
25
+ -- If no underscore is found, returns the original string and nil.
26
+ function splitIntoTwoNames(str)
27
+ -- Pattern explanation:
28
+ -- (.-) captures any character as few times as possible up to the last underscore
29
+ -- _ captures the underscore itself
30
+ -- ([^_]+)$ captures one or more characters that are not underscores at the end of the string
31
+ local underName, rootName = str:match("(.-)_([^_]+)$")
32
+
33
+ if underName and rootName then
34
+ return tostring(rootName), tostring(underName)
35
+ else
36
+ -- If the pattern does not match (e.g., there's no underscore in the string),
37
+ -- return the original string as the first chunk and nil as the second
38
+ return str, nil
39
+ end
40
+ end
41
+
42
+ local arnsMeta = {
43
+ __index = function(t, key)
44
+ if key == "resolve" then
45
+ return function(name)
46
+ name = string.lower(name)
47
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
48
+ return "Getting information for name: " .. name
49
+ end
50
+ elseif key == "data" then
51
+ return function(name)
52
+ name = string.lower(name)
53
+ local rootName, underName = splitIntoTwoNames(name)
54
+ if NAMES[rootName] == nil then
55
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = rootName })
56
+ print(name .. ' has not been resolved yet. Resolving now...')
57
+ return nil
58
+ elseif rootName and underName == nil then
59
+ if NAMES[rootName].process and NAMES[rootName].process.records['@'] then
60
+ if Now - NAMES[rootName].process.lastUpdated >= DATA_TTL_MS then
61
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
62
+ print(name .. ' is stale. Refreshing name process now...')
63
+ return nil
64
+ else
65
+ return NAMES[rootName].process.records['@'].transactionId
66
+ end
67
+ elseif NAMES[rootName].contract and NAMES[rootName].contract.records['@'] then
68
+ if Now - NAMES[rootName].contract.lastUpdated >= DATA_TTL_MS then
69
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
70
+ print(name .. ' is stale. Refreshing name contract now...')
71
+ return nil
72
+ else
73
+ return NAMES[rootName].contract.records['@'].transactionId or
74
+ NAMES[rootName].contract.records['@'] or
75
+ nil
76
+ -- NAMES[rootName].contract.records['@'] is used to capture old ANT contracts
77
+ end
78
+ end
79
+ elseif rootName and underName then
80
+ if NAMES[rootName].process and NAMES[rootName].process.records[underName] then
81
+ if Now - NAMES[rootName].process.lastUpdated >= DATA_TTL_MS then
82
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
83
+ print(name .. ' is stale. Refreshing name process now...')
84
+ return nil
85
+ else
86
+ return NAMES[rootName].process.records[underName].transactionId
87
+ end
88
+ elseif NAMES[rootName].contract and NAMES[rootName].contract.records[underName] then
89
+ if Now - NAMES[rootName].contract.lastUpdated >= DATA_TTL_MS then
90
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
91
+ print(name .. ' is stale. Refreshing name contract now...')
92
+ return nil
93
+ else
94
+ return NAMES[rootName].contract.records[underName].transactionId or
95
+ NAMES[rootName].contract.records[underName]
96
+ -- NAMES[rootName].contract.records[underName] is used to capture old ANT contracts
97
+ end
98
+ else
99
+ return nil
100
+ end
101
+ end
102
+ end
103
+ elseif key == "owner" then
104
+ return function(name)
105
+ name = string.lower(name)
106
+ local rootName, underName = splitIntoTwoNames(name)
107
+ if NAMES[rootName] == nil then
108
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = rootName })
109
+ print(name .. ' has not been resolved yet. Cannot get owner. Resolving now...')
110
+ return nil
111
+ elseif NAMES[rootName].process and NAMES[rootName].process.owner then
112
+ if Now - NAMES[rootName].process.lastUpdated >= OWNER_TTL_MS then
113
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
114
+ print(name .. ' is stale. Refreshing name process now...')
115
+ return nil
116
+ else
117
+ return NAMES[rootName].process.owner
118
+ end
119
+ elseif NAMES[rootName].contract and NAMES[rootName].contract.owner then
120
+ if Now - NAMES[rootName].contract.lastUpdated >= OWNER_TTL_MS then
121
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
122
+ print(name .. ' is stale. Refreshing name contract now...')
123
+ return nil
124
+ else
125
+ return NAMES[rootName].contract.owner
126
+ end
127
+ else
128
+ return nil
129
+ end
130
+ end
131
+ elseif key == "id" then
132
+ return function(name)
133
+ name = string.lower(name)
134
+ local rootName, underName = splitIntoTwoNames(name)
135
+ if NAMES[rootName] == nil then
136
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
137
+ print(name .. ' has not been resolved yet. Cannot get id. Resolving now...')
138
+ return nil
139
+ elseif Now - NAMES[rootName].lastUpdated >= ID_TTL_MS then
140
+ ao.send({ Target = ARNS_PROCESS_ID, Action = "Get-Record", Name = name })
141
+ print(name .. ' is stale. Refreshing name data now...')
142
+ return nil
143
+ else
144
+ return NAMES[rootName].processId or NAMES[rootName].contractTxId or nil
145
+ end
146
+ end
147
+ elseif key == "clear" then
148
+ NAMES = {}
149
+ return 'ArNS local name cache cleared.'
150
+ else
151
+ return nil
152
+ end
153
+ end
154
+ }
155
+
156
+ ARNS = setmetatable({}, arnsMeta)
157
+
158
+ --- Requests JSON data from a specified URL via the Orbit process, an external service.
159
+ -- @param url The URL from which JSON data is to be fetched.
160
+ function fetchJsonDataFromOrbit(url)
161
+ -- Validate URL to prevent sending invalid requests
162
+ if type(url) ~= "string" or url == "" then
163
+ print("Invalid URL provided for fetching JSON data.")
164
+ return
165
+ end
166
+ -- Send a request to the Orbit process with the specified URL.
167
+ ao.send({ Target = _0RBIT_SEND_PROCESS_ID, Action = "Get-Real-Data", Url = url })
168
+ end
169
+
170
+ --- Determines if a given message is a record response from the ARNS process.
171
+ -- @param msg The message to evaluate.
172
+ -- @return boolean True if the message is from the ARNS process and action is 'Record-Resolved', otherwise false.
173
+ function isArNSGetRecordMessage(msg)
174
+ if msg.From == ARNS_PROCESS_ID and msg.Action == "Record-Resolved" then
175
+ return true
176
+ else
177
+ return false
178
+ end
179
+ end
180
+
181
+ --- Determines if a message is an 'Info' message from an ANT or related process.
182
+ -- Checks if the sender's ID exists within the ID_NAME_MAPPING.
183
+ -- @param msg The message object to check.
184
+ -- @return boolean True if the sender's ID is recognized, false otherwise.
185
+ function isANTInfoMessage(msg)
186
+ if ID_NAME_MAPPING[msg.From] then
187
+ return true
188
+ else
189
+ return false
190
+ end
191
+ end
192
+
193
+ --- Determines if a message is from the 0RBIT process with a 'Receive-data-feed' action.
194
+ -- @param msg The message object to check.
195
+ -- @return boolean True if the message is from the 0RBIT process and has the specified action, false otherwise.
196
+ function is0rbitMessage(msg)
197
+ if msg.From == _0RBIT_RECEIVE_PROCESS_ID and msg.Action == 'Receive-data-feed' then
198
+ return true
199
+ else
200
+ return false
201
+ end
202
+ end
203
+
204
+ Handlers.prepend(
205
+ "ArNS-Timers",
206
+ function(msg)
207
+ return "continue"
208
+ end,
209
+ function(msg)
210
+ Now = msg.Timestamp
211
+ end
212
+ )
213
+
214
+ --- Handles received ArNS "Record-Resolved" messages by updating the local NAMES table.
215
+ -- Updates or initializes the record for the given name with the latest information.
216
+ -- Fetches additional information from SmartWeave Cache or ANT-AO process if necessary.
217
+ Handlers.add("ReceiveArNSGetRecordMessage", isArNSGetRecordMessage, function(msg)
218
+ local data, err = json.decode(msg.Data)
219
+ if not data or err then
220
+ print("Error decoding JSON data: ", err)
221
+ return
222
+ end
223
+
224
+ -- Update or initialize the record with the latest information.
225
+ NAMES[msg.Tags.Name] = NAMES[msg.Tags.Name] or {
226
+ lastUpdated = msg.Timestamp,
227
+ contractTxId = data.contractTxId,
228
+ -- Assuming these fields are placeholders for future updates.
229
+ contractOwner = nil,
230
+ contract = nil,
231
+ processOwner = nil,
232
+ process = nil
233
+ }
234
+ NAMES[msg.Tags.Name].processId = data.processId
235
+ NAMES[msg.Tags.Name].record = data
236
+ NAMES[msg.Tags.Name].lastUpdated = msg.Timestamp
237
+
238
+ print("Updated " .. msg.Tags.Name .. " with the latest ArNS-AO Registry info!")
239
+
240
+ -- Fetch additional information if contractTxId is provided.
241
+ if data.contractTxId then
242
+ local url = SW_CACHE_URL .. data.contractTxId
243
+ print("...fetching more info from SmartWeave Cache (via 0rbit): " .. url)
244
+ fetchJsonDataFromOrbit(url)
245
+ ID_NAME_MAPPING[data.contractTxId] = msg.Tags.Name
246
+ end
247
+
248
+ -- Request more information if processId is provided and not empty.
249
+ if data.processId then
250
+ print("...fetching more info from ANT-AO process: " .. data.processId)
251
+ ID_NAME_MAPPING[data.processId] = msg.Tags.Name
252
+ ao.send({ Target = data.processId, Action = "Info" })
253
+ end
254
+ end)
255
+
256
+ --- Updates stored information with the latest data from ANT-AO process "Info-Notice" messages.
257
+ -- @param msg The received message object containing updated process info.
258
+ Handlers.add("ReceiveANTProcessInfoMessage", isANTInfoMessage, function(msg)
259
+ if msg.Action == 'Info-Notice' and NAMES[ID_NAME_MAPPING[msg.From]] then
260
+ local nameKey = ID_NAME_MAPPING[msg.From]
261
+ local updatedInfo = NAMES[nameKey]
262
+
263
+ -- Attempt to decode the JSON data from the message.
264
+ local processInfo, err = json.decode(msg.Data)
265
+ if err then
266
+ print("Error decoding process info: ", err)
267
+ return
268
+ end
269
+
270
+ -- Ensure the decoded data is a valid table before updating.
271
+ if type(processInfo) == "table" then
272
+ updatedInfo.process = processInfo
273
+ updatedInfo.process.owner = msg.Tags.ProcessOwner
274
+ updatedInfo.process.lastUpdated = msg.Timestamp
275
+ NAMES[nameKey] = updatedInfo
276
+ print("Updated " .. nameKey .. " with the latest ANT-AO process info!")
277
+ else
278
+ print("Invalid process info format received from " .. nameKey)
279
+ end
280
+
281
+ -- Clear the mapping after updating to prevent redundant updates.
282
+ ID_NAME_MAPPING[msg.From] = nil
283
+ end
284
+ end)
285
+
286
+ --- Processes messages from the 0rbit process to update contract information stored in NAMES.
287
+ -- @param msg The message object received from the 0rbit process.
288
+ Handlers.add("Receive0rbitMessage", is0rbitMessage, function(msg)
289
+ -- Decode the JSON data from the message.
290
+ local data, err = json.decode(msg.Data)
291
+ if err then
292
+ print("Error decoding data from 0rbit message: ", err)
293
+ return
294
+ end
295
+
296
+ -- Validate that the decoded data contains a contractTxId that is currently being tracked.
297
+ local nameKey = ID_NAME_MAPPING[data.contractTxId]
298
+ if nameKey and NAMES[nameKey] then
299
+ local updatedInfo = NAMES[nameKey]
300
+
301
+ -- Ensure the data contains 'state' information for the contract before updating.
302
+ if type(data.state) == "table" then
303
+ updatedInfo.contract = data.state
304
+ updatedInfo.contract.owner = data.state.owner
305
+ updatedInfo.contract.lastUpdated = msg.Timestamp
306
+ NAMES[nameKey] = updatedInfo
307
+ print("Updated " .. nameKey .. " with the latest info from SmartWeave Cache (via 0rbit)!")
308
+ else
309
+ print("Received 0rbit message with invalid or missing 'state' information for contractTxId: " ..
310
+ tostring(data.contractTxId))
311
+ end
312
+
313
+ -- Clear the mapping to prevent repeated updates for the same contractTxId.
314
+ ID_NAME_MAPPING[data.contractTxId] = nil
315
+ else
316
+ print("Received 0rbit message for an untracked or invalid contractTxId: " .. tostring(data.contractTxId))
317
+ end
318
+ end)
@@ -0,0 +1,210 @@
1
+ DevChat = {}
2
+
3
+ DevChat.Router = "8MGp9kOU4JYxAlPT1AyL7O3cedd97y-w8X4ciBsf_Xo"
4
+ DevChat.InitRoom = "6I1JBBc9SOMtqFxlX7OoYgsMh7QeZk2fFwUCHTUqshg"
5
+ DevChat.LastSend = DevChat.LastSend or DevChat.InitRoom
6
+
7
+ DevChat.LastReceive = {
8
+ Room = DevChat.InitRoom,
9
+ Sender = nil
10
+ }
11
+
12
+ DevChat.InitRooms = { [DevChat.InitRoom] = "Getting-Started" }
13
+ DevChat.Rooms = DevChat.Rooms or DevChat.InitRooms
14
+
15
+ DevChat.Confirmations = DevChat.Confirmations or true
16
+
17
+ -- Helper function to go from roomName => address
18
+ DevChat.findRoom =
19
+ function(target)
20
+ for address, name in pairs(DevChat.Rooms) do
21
+ if target == name then
22
+ return address
23
+ end
24
+ end
25
+ end
26
+
27
+ DevChat.add =
28
+ function(...)
29
+ local arg = {...}
30
+ ao.send({
31
+ Target = DevChat.Router,
32
+ Action = "Register",
33
+ Name = arg[1] or Name,
34
+ Address = arg[2] or ao.id
35
+ })
36
+ end
37
+
38
+ List =
39
+ function()
40
+ ao.send({ Target = DevChat.Router, Action = "Get-List" })
41
+ return(Colors.gray .. "Getting the room list from the DevChat index..." .. Colors.reset)
42
+ end
43
+
44
+ Join =
45
+ function(id, ...)
46
+ local arg = {...}
47
+ local addr = DevChat.findRoom(id) or id
48
+ local nick = arg[1] or ao.id
49
+ ao.send({ Target = addr, Action = "Register", Nickname = nick or Name })
50
+ return(
51
+ Colors.gray ..
52
+ "Registering with room " ..
53
+ Colors.blue .. id ..
54
+ Colors.gray .. "..." .. Colors.reset)
55
+ end
56
+
57
+ Say =
58
+ function(text, ...)
59
+ local arg = {...}
60
+ local id = arg[1]
61
+ if id ~= nil then
62
+ -- Remember the new room for next time.
63
+ DevChat.LastSend = DevChat.findRoom(id) or id
64
+ end
65
+ local name = DevChat.Rooms[DevChat.LastSend] or id
66
+ ao.send({ Target = DevChat.LastSend, Action = "Broadcast", Data = text })
67
+ if DevChat.Confirmations then
68
+ return(Colors.gray .. "Broadcasting to " .. Colors.blue ..
69
+ name .. Colors.gray .. "..." .. Colors.reset)
70
+ else
71
+ return ""
72
+ end
73
+ end
74
+
75
+ Tip =
76
+ function(...) -- Recipient, Target, Qty
77
+ local arg = {...}
78
+ local room = arg[2] or DevChat.LastReceive.Room
79
+ local roomName = DevChat.Rooms[room] or room
80
+ local qty = tostring(arg[3] or 1)
81
+ local recipient = arg[1] or DevChat.LastReceive.Sender
82
+ ao.send({
83
+ Action = "Transfer",
84
+ Target = room,
85
+ Recipient = recipient,
86
+ Quantity = qty
87
+ })
88
+ return(Colors.gray .. "Sent tip of " ..
89
+ Colors.green .. qty .. Colors.gray ..
90
+ " to " .. Colors.red .. recipient .. Colors.gray ..
91
+ " in room " .. Colors.blue .. roomName .. Colors.gray ..
92
+ "."
93
+ )
94
+ end
95
+
96
+ Replay =
97
+ function(...) -- depth, room
98
+ local arg = {...}
99
+ local room = nil
100
+ if arg[1] then
101
+ room = DevChat.findRoom(arg[2]) or arg[2]
102
+ else
103
+ room = DevChat.LastReceive.Room
104
+ end
105
+ local roomName = DevChat.Rooms[room] or room
106
+ local depth = arg[1] or 3
107
+
108
+ ao.send({
109
+ Target = room,
110
+ Action = "Replay",
111
+ Depth = tostring(depth)
112
+ })
113
+ return(
114
+ Colors.gray ..
115
+ "Requested replay of the last " ..
116
+ Colors.green .. depth ..
117
+ Colors.gray .. " messages from " .. Colors.blue ..
118
+ roomName .. Colors.reset .. ".")
119
+ end
120
+
121
+ Leave =
122
+ function(id)
123
+ local addr = DevChat.findRoom(id) or id
124
+ ao.send({ Target = addr, Action = "Unregister" })
125
+ return(
126
+ Colors.gray ..
127
+ "Leaving room " ..
128
+ Colors.blue .. id ..
129
+ Colors.gray .. "..." .. Colors.reset)
130
+ end
131
+
132
+
133
+ Handlers.add(
134
+ "DevChat-Broadcasted",
135
+ Handlers.utils.hasMatchingTag("Action", "Broadcasted"),
136
+ function (m)
137
+ local shortRoom = DevChat.Rooms[m.From] or string.sub(m.From, 1, 6)
138
+ if m.Broadcaster == ao.id then
139
+ if DevChat.Confirmations == true then
140
+ print(
141
+ Colors.gray .. "[Received confirmation of your broadcast in "
142
+ .. Colors.blue .. shortRoom .. Colors.gray .. ".]"
143
+ .. Colors.reset)
144
+ end
145
+ end
146
+ local nick = string.sub(m.Nickname, 1, 10)
147
+ if m.Broadcaster ~= m.Nickname then
148
+ nick = nick .. Colors.gray .. "#" .. string.sub(m.Broadcaster, 1, 3)
149
+ end
150
+ print(
151
+ "[" .. Colors.red .. nick .. Colors.reset
152
+ .. "@" .. Colors.blue .. shortRoom .. Colors.reset
153
+ .. "]> " .. Colors.green .. m.Data .. Colors.reset)
154
+
155
+ DevChat.LastReceive.Room = m.From
156
+ DevChat.LastReceive.Sender = m.Broadcaster
157
+ end
158
+ )
159
+
160
+ Handlers.add(
161
+ "DevChat-List",
162
+ function(m)
163
+ if m.Action == "Room-List" and m.From == DevChat.Router then
164
+ return true
165
+ end
166
+ return false
167
+ end,
168
+ function(m)
169
+ local intro = "👋 The following rooms are currently available on DevChat:\n\n"
170
+ local rows = ""
171
+ DevChat.Rooms = DevChat.InitRooms
172
+
173
+ for i = 1, #m.TagArray do
174
+ local filterPrefix = "Room-" -- All of our room tags start with this
175
+ local tagPrefix = string.sub(m.TagArray[i].name, 1, #filterPrefix)
176
+ local name = string.sub(m.TagArray[i].name, #filterPrefix + 1, #m.TagArray[i].name)
177
+ local address = m.TagArray[i].value
178
+
179
+ if tagPrefix == filterPrefix then
180
+ rows = rows .. Colors.blue .. " " .. name .. Colors.reset .. "\n"
181
+ DevChat.Rooms[address] = name
182
+ end
183
+ end
184
+
185
+ print(
186
+ intro .. rows .. "\nJoin a chat by running `Join(\"chatName\"[, \"yourNickname\"])`! You can leave chats with `Leave(\"name\")`.")
187
+ end
188
+ )
189
+
190
+ if DevChatRegistered == nil then
191
+ DevChatRegistered = true
192
+ Join(DevChat.InitRoom)
193
+ end
194
+
195
+ function help()
196
+ return(
197
+ Colors.blue .. "\n\nWelcome to ao DevChat v0.1!\n\n" .. Colors.reset ..
198
+ "DevChat is a simple service that helps the ao community communicate as we build our new computer.\n" ..
199
+ "The interface is simple. Run...\n\n" ..
200
+ Colors.green .. "\t\t`List()`" .. Colors.reset .. " to see which rooms are available.\n" ..
201
+ Colors.green .. "\t\t`Join(\"RoomName\")`" .. Colors.reset .. " to join a room.\n" ..
202
+ Colors.green .. "\t\t`Say(\"Msg\", \"RoomName\") or Say(\"Msg\", \"RoomName1\", \"RoomName2\")`" .. Colors.reset .. " to post to a room (remembering your last choice for next time).\n" ..
203
+ Colors.green .. "\t\t`Replay(Count, \"RoomName\") e.g. Replay(1, \"Getting-Started\")`" .. Colors.reset .. " to reprint the most recent messages from a chat.\n" ..
204
+ Colors.green .. "\t\t`Leave(\"RoomName\")`" .. Colors.reset .. " at any time to unsubscribe from a chat.\n" ..
205
+ Colors.green .. "\t\t`Tip([\"Recipient\"])`" .. Colors.reset .. " to send a token from the chatroom to the sender of the last message.\n\n" ..
206
+ "You have already been registered to the " .. Colors.blue .. DevChat.Rooms[DevChat.InitRoom] .. Colors.reset .. ".\n" ..
207
+ "Have fun, be respectful, and remember: Cypherpunks ship code! 🫡")
208
+ end
209
+
210
+ return help()
@@ -0,0 +1,56 @@
1
+ Members = Members or {}
2
+
3
+ Handlers.add(
4
+ "register",
5
+ "Register",
6
+ function (msg)
7
+ local found = false
8
+ for _, member in ipairs(Members) do
9
+ if member == msg.From then
10
+ found = true
11
+ break
12
+ end
13
+ end
14
+
15
+ if not found then
16
+ table.insert(Members, msg.From)
17
+ Handlers.utils.reply("Registered.")(msg)
18
+ else
19
+ Handlers.utils.reply("Already registered.")(msg)
20
+ end
21
+ end
22
+ )
23
+
24
+ Handlers.add(
25
+ "unregister",
26
+ "Unregister",
27
+ function (msg)
28
+ local found = false
29
+ for i, v in ipairs(Members) do
30
+ if v == msg.From then
31
+ table.remove(Members, i)
32
+ Handlers.utils.reply("Unregistered")(msg)
33
+ found = true
34
+ break
35
+ end
36
+ end
37
+ if not found then
38
+ Handlers.utils.reply("Not registered")(msg)
39
+ end
40
+ end
41
+ )
42
+
43
+ Handlers.add(
44
+ "broadcast",
45
+ "Broadcast",
46
+ function (msg)
47
+ local haveSentRecords = {}
48
+ for _, recipient in ipairs(Members) do
49
+ if not haveSentRecords[recipient] then
50
+ ao.send({Target = recipient, Action = "Broadcast-Notice", Data = msg.Data})
51
+ haveSentRecords[recipient] = true
52
+ end
53
+ end
54
+ Handlers.utils.reply("Broadcasted.")(msg)
55
+ end
56
+ )
@@ -0,0 +1,13 @@
1
+ local function patchReply(msg)
2
+ if not msg.reply then
3
+ msg.reply = function (replyMsg)
4
+ replyMsg.Target = msg["Reply-To"] or (replyMsg.Target or msg.From)
5
+ replyMsg["X-Reference"] = msg["X-Reference"] or msg.Reference or ""
6
+ replyMsg["X-Origin"] = msg["X-Origin"] or ""
7
+
8
+ return ao.send(replyMsg)
9
+ end
10
+ end
11
+ end
12
+
13
+ Handlers.prepend("_patch_reply", function (msg) return "continue" end, patchReply)
@@ -0,0 +1,93 @@
1
+ Variant = "0.0.4"
2
+ Stakers = Stakers or {}
3
+ Unstaking = Unstaking or {}
4
+ UnstakeDelay = UnstakeDelay or 670
5
+ local bint = require('.bint')(256)
6
+
7
+ --[[
8
+ utils helper functions to remove the bint complexity.
9
+ ]]
10
+ --
11
+
12
+
13
+ local utils = {
14
+ add = function (a,b)
15
+ return tostring(bint(a) + bint(b))
16
+ end,
17
+ subtract = function (a,b)
18
+ return tostring(bint(a) - bint(b))
19
+ end
20
+ }
21
+
22
+ -- Stake Action Handler
23
+ Handlers.stake = function(msg)
24
+ local quantity = bint(msg.Tags.Quantity)
25
+ local height = tonumber(msg['Block-Height'])
26
+ assert(Balances[msg.From] and bint(Balances[msg.From]) >= quantity, "Insufficient balance to stake")
27
+ Balances[msg.From] = utils.subtract(Balances[msg.From], msg.Tags.Quantity)
28
+ Stakers[msg.From] = Stakers[msg.From] or { amount = "0" }
29
+ Stakers[msg.From].amount = utils.add(Stakers[msg.From].amount, msg.Tags.Quantity)
30
+ Stakers[msg.From].unstake_at = height + UnstakeDelay
31
+ print("Successfully Staked " .. msg.Tags.Quantity)
32
+ if msg.reply then
33
+ msg.reply({ Data = "Successfully Staked " .. msg.Tags.Quantity})
34
+ else
35
+ Send({Target = msg.From, Data = "Successfully Staked " .. msg.Tags.Quantity })
36
+ end
37
+ end
38
+
39
+ -- Unstake Action Handler
40
+ Handlers.unstake = function(msg)
41
+ local stakerInfo = Stakers[msg.From]
42
+ assert(stakerInfo and bint(stakerInfo.amount) >= bint(msg.Tags.Quantity), "Insufficient staked amount")
43
+ stakerInfo.amount = utils.subtract(stakerInfo.amount, msg.Tags.Quantity)
44
+ Unstaking[msg.From] = {
45
+ amount = msg.Tags.Quantity,
46
+ release_at = stakerInfo.unstake_at
47
+ }
48
+ if msg.reply then
49
+ msg.reply({ Data = "Successfully unstaked " .. msg.Tags.Quantity})
50
+ else
51
+ Send({Target = msg.From, Data = "Successfully unstaked " .. msg.Tags.Quantity })
52
+ end
53
+ end
54
+
55
+ -- Finalization Handler
56
+ local finalizationHandler = function(msg)
57
+ local currentHeight = tonumber(msg['Block-Height'])
58
+ -- Process unstaking
59
+ for address, unstakeInfo in pairs(Unstaking) do
60
+ if unstakeInfo.release_at == nil or currentHeight >= unstakeInfo.release_at then
61
+ Balances[address] = utils.add(Balances[address] or "0", unstakeInfo.amount)
62
+ Unstaking[address] = nil
63
+ end
64
+ end
65
+ end
66
+
67
+ -- wrap function to continue handler flow
68
+ local function continue(fn)
69
+ return function (msg)
70
+ local result = fn(msg)
71
+ if (result) == -1 then
72
+ return "continue"
73
+ end
74
+ return result
75
+ end
76
+ end
77
+
78
+ Handlers.add('staking.balances', Handlers.utils.hasMatchingTag("Action", 'Stakers'),
79
+ function(msg)
80
+ if msg.reply then
81
+ msg.reply({ Data = require('json').encode(Stakers) })
82
+ else
83
+ Send({Target = msg.From, Data = require('json').encode(Stakers) })
84
+ end
85
+ end)
86
+ -- Registering Handlers
87
+ Handlers.add("staking.stake",
88
+ continue(Handlers.utils.hasMatchingTag("Action", "Stake")), Handlers.stake)
89
+ Handlers.add("staking.unstake",
90
+ continue(Handlers.utils.hasMatchingTag("Action", "Unstake")), Handlers.unstake)
91
+ -- Finalization handler should be called for every message
92
+ -- changed to continue to let messages pass-through
93
+ Handlers.prepend("staking.finalize", function (msg) return "continue" end, finalizationHandler)