@0xobelisk/sui-common 1.2.0-pre.119 → 1.2.0-pre.120

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.
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- import $e from"prettier";import He from"prettier-plugin-move-js";async function Ot(e,t){let s;t&&(s=await $e.resolveConfig(t));try{return $e.format(e,{plugins:[He],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(n){let r;return n instanceof Error?r=n.message:r=n,console.log(`Error during output formatting: ${r}`),e}}import me from"node:fs/promises";import Ge from"node:path";import _e from"debug";var ne=_e("dubhe:common"),Ye=_e("dubhe:common");ne.log=console.debug.bind(console);Ye.log=console.error.bind(console);var oe=ne.extend("codegen");oe.log=console.debug.bind(console);async function A(e,t,s){let n=e,r=`// Copyright (c) Obelisk Labs, Inc.
1
+ import _e from"prettier";import Ge from"prettier-plugin-move-js";async function It(e,t){let s;t&&(s=await _e.resolveConfig(t));try{return _e.format(e,{plugins:[Ge],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(n){let r;return n instanceof Error?r=n.message:r=n,console.log(`Error during output formatting: ${r}`),e}}import be from"node:fs/promises";import Je from"node:path";import me from"debug";var oe=me("dubhe:common"),qe=me("dubhe:common");oe.log=console.debug.bind(console);qe.log=console.error.bind(console);var ie=oe.extend("codegen");ie.log=console.debug.bind(console);async function A(e,t,s){let n=e,r=`// Copyright (c) Obelisk Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  /* Autogenerated file. Do not edit manually. */
5
5
 
6
6
  `,o=`#[test_only]
7
7
  `,d=r+n,l=`#[allow(lint(share_owned))]
8
- `;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=o+n:t.includes("genesis")&&(d=l+n),await me.mkdir(Ge.dirname(t),{recursive:!0}),await me.writeFile(t,d),oe(`${s}: ${t}`)}import{existsSync as Y}from"fs";import q from"fs";function ie(e){q.existsSync(e)&&(q.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;q.lstatSync(s).isDirectory()?ie(s):q.unlinkSync(s)}),q.rmdirSync(e))}var be={name:"@0xobelisk/sui-common",version:"1.2.0-pre.119",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",author:"team@obelisk.build",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},types:"./dist/index.d.ts",typesVersions:{"*":{index:["./src/index.ts"]}},scripts:{build:"pnpm run type-check && pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",format:"prettier --write .","format:check":"prettier --check .",lint:"eslint . --ext .ts",test:"vitest","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^10.5.0",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5",typescript:"^5.8.3",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^22.16.0","@types/yargs":"^17.0.10",eslint:"^9.0.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3"},engines:{node:">=22.0.0"},publishConfig:{access:"public"}};async function fe(e,t){console.log(`
8
+ `;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=o+n:t.includes("genesis")&&(d=l+n),await be.mkdir(Je.dirname(t),{recursive:!0}),await be.writeFile(t,d),ie(`${s}: ${t}`)}import{existsSync as V}from"fs";import J from"fs";function ae(e){J.existsSync(e)&&(J.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;J.lstatSync(s).isDirectory()?ae(s):J.unlinkSync(s)}),J.rmdirSync(e))}var fe={name:"@0xobelisk/sui-common",version:"1.2.0-pre.120",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",author:"team@obelisk.build",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},types:"./dist/index.d.ts",typesVersions:{"*":{index:["./src/index.ts"]}},scripts:{build:"pnpm run type-check && pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",format:"prettier --write .","format:check":"prettier --check .",lint:"eslint . --ext .ts",test:"vitest","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^10.5.0",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5",typescript:"^5.8.3",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^22.16.0","@types/yargs":"^17.0.10",eslint:"^9.0.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3"},engines:{node:">=22.0.0"},publishConfig:{access:"public"}};async function ye(e,t){console.log(`
9
9
  \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/src/${e.name}/Move.toml`);let s=`[package]
10
10
  name = "${e.name}"
11
11
  version = "1.0.0"
@@ -13,13 +13,13 @@ edition = "2024"
13
13
 
14
14
  [dependencies]
15
15
  Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.46.3" }
16
- Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "framework/src/dubhe", rev = "v${be.version}" }
16
+ Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "framework/src/dubhe", rev = "v${fe.version}" }
17
17
 
18
18
  [addresses]
19
19
  sui = "0x2"
20
20
  ${e.name} = "0x0"
21
21
  `;await A(s,`${t}/src/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
22
- `)}import{existsSync as ye}from"fs";async function he(e,t,s=1){if(!ye(t)){let n=s===1?`// Settlement mode: USER_PAYS \u2014 users pay transaction fees at settlement time.
22
+ `)}import{existsSync as he}from"fs";async function ve(e,t,s=1){if(!he(t)){let n=s===1?`// Settlement mode: USER_PAYS \u2014 users pay transaction fees at settlement time.
23
23
  // The framework admin sets the revenue share via set_dapp_revenue_share.
24
24
  // Initialise any DappStorage-level defaults here (e.g. resource starting values).`:`// Settlement mode: DAPP_SUBSIDIZES \u2014 the DApp pays for user operations.
25
25
  // Recharge the credit pool via dapp_system::recharge_credit before users can write.
@@ -29,14 +29,14 @@ ${e.name} = "0x0"
29
29
  public(package) fun run(_dapp_storage: &mut DappStorage, _ctx: &mut TxContext) {
30
30
  ${n}
31
31
  }
32
- }`;await A(r,t,"formatAndWriteMove")}}async function ve(e,t){if(!ye(`${t}/src/${e.name}/sources/scripts/migrate.move`)){let s=`module ${e.name}::migrate {
32
+ }`;await A(r,t,"formatAndWriteMove")}}async function ke(e,t){if(!he(`${t}/src/${e.name}/sources/scripts/migrate.move`)){let s=`module ${e.name}::migrate {
33
33
  const ON_CHAIN_VERSION: u32 = 1;
34
34
 
35
35
  public fun on_chain_version(): u32 {
36
36
  ON_CHAIN_VERSION
37
37
  }
38
38
  }
39
- `;await A(s,`${t}/src/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function ke(e,t){let s=`module ${e.name}::dapp_key {
39
+ `;await A(s,`${t}/src/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function Se(e,t){let s=`module ${e.name}::dapp_key {
40
40
  use std::type_name;
41
41
  use sui::address;
42
42
  use std::ascii::String;
@@ -62,14 +62,14 @@ ${e.name} = "0x0"
62
62
  type_name::with_defining_ids<DappKey1>() == type_name::with_defining_ids<DappKey2>()
63
63
  }
64
64
  }
65
- `;await A(s,t,"formatAndWriteMove")}import{existsSync as Se}from"fs";import xe from"node:fs/promises";async function Ce(e,t){Se(`${t}/src/${e.name}/sources/systems`)||await xe.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),Se(`${t}/src/${e.name}/sources/tests`)||await xe.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}function qe(e){return"E"+e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Je(e){return typeof e=="string"?e:e.message}async function we(e,t,s){console.log(`
66
- \u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([o,d])=>{let l=qe(o),u=Je(d);return console.log(` \u2514\u2500 ${o}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${o}(condition: bool) { assert!(condition, ${l}) }`].join(`
65
+ `;await A(s,t,"formatAndWriteMove")}import{existsSync as xe}from"fs";import Ce from"node:fs/promises";async function we(e,t){xe(`${t}/src/${e.name}/sources/systems`)||await Ce.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),xe(`${t}/src/${e.name}/sources/tests`)||await Ce.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}function Xe(e){return"E"+e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Qe(e){return typeof e=="string"?e:e.message}async function De(e,t,s){console.log(`
66
+ \u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([o,d])=>{let l=Xe(o),u=Qe(d);return console.log(` \u2514\u2500 ${o}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${o}(condition: bool) { assert!(condition, ${l}) }`].join(`
67
67
  `)}).join(`
68
68
 
69
69
  `),r=`module ${e}::error {
70
70
  ${n}
71
71
  }
72
- `;await A(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function De(e,t){let n=e.name==="dubhe"?"":`
72
+ `;await A(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function je(e,t){let n=e.name==="dubhe"?"":`
73
73
  /// Create a DappStorage for this DApp without sharing it.
74
74
  /// Suitable for unit tests that exercise global-resource functions.
75
75
  public fun create_dapp_storage_for_testing(ctx: &mut TxContext): dubhe::dapp_service::DappStorage {
@@ -91,7 +91,7 @@ module ${e.name}::init_test {
91
91
  }
92
92
  ${n}
93
93
  }
94
- `;await A(r,t,"formatAndWriteMove")}async function je(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
94
+ `;await A(r,t,"formatAndWriteMove")}async function Te(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
95
95
  use dubhe::dapp_service::DappHub;
96
96
 
97
97
  // The framework genesis initialises the DappHub state via deploy_hook.
@@ -141,8 +141,8 @@ ${n}
141
141
  // ==========================================
142
142
  }
143
143
  }
144
- `;await A(r,t,"formatAndWriteMove")}function Te(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Ae(e,t){if(console.log(`
145
- \u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,n]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`);let r=[...n].sort((d,l)=>d.localeCompare(l)),o=Ze(e.name,s,r);await A(o,`${t}/${Te(s)}.move`,"formatAndWriteMove")}}function Ze(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Te(t)} {
144
+ `;await A(r,t,"formatAndWriteMove")}function Ae(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Ee(e,t){if(console.log(`
145
+ \u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,n]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`);let r=[...n].sort((d,l)=>d.localeCompare(l)),o=Ne(e.name,s,r);await A(o,`${t}/${Ae(s)}.move`,"formatAndWriteMove")}}function Ne(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Ae(t)} {
146
146
  use sui::bcs::{BCS, to_bytes, peel_enum_tag};
147
147
 
148
148
  public enum ${t} has copy, drop, store {
@@ -166,43 +166,43 @@ ${s.map((r,o)=>` ${o} => ${t}::${r.charAt(0).toUpperCase()+r.slice(1)
166
166
  _ => abort,
167
167
  }
168
168
  }
169
- }`}function X(e){let t=e.resources??{},s=e.objects??{},n=e.permits??{},r=e.scenes??{},o=new Set(Object.keys(t)),d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),_=new Set;for(let p of o)(d.has(p)||l.has(p)||u.has(p))&&_.add(p);for(let p of d)(l.has(p)||u.has(p))&&_.add(p);for(let p of l)u.has(p)&&_.add(p);if(_.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[..._].sort().join(", ")}`);let g=new Set;for(let[p,c]of Object.entries(s)){for(let $ of c.accepts??[]){g.add($);let f=t[$];if(!f)throw new Error(`objects.${p}.accepts references '${$}' which is not defined in resources`);if(typeof f!="string"&&!f.transferable)throw new Error(`objects.${p}.accepts includes '${$}', but resources.${$} is missing transferable: true. Add transferable: true to resources.${$} to enable cross-storage transfers.`)}for(let $ of c.acceptsFrom??[]){let f=!!s[$],C=!!r[$];if(!f&&!C)throw new Error(`objects.${p}.acceptsFrom references '${$}' which is not defined in objects or scenes`)}}for(let[p,c]of Object.entries(r)){if(!c.authorization)throw new Error(`scenes.${p} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(c.authorization.kind==="permit"){if(!n[c.authorization.permit])throw new Error(`scenes.${p}.authorization references permit '${c.authorization.permit}', but permits.${c.authorization.permit} is not defined`)}else if(c.authorization.kind!=="system")throw new Error(`scenes.${p}.authorization.kind must be 'system' or 'permit'`);for(let $ of c.accepts??[]){g.add($);let f=t[$];if(!f)throw new Error(`scenes.${p}.accepts references '${$}' which is not defined in resources`);if(typeof f!="string"&&!f.transferable)throw new Error(`scenes.${p}.accepts includes '${$}', but resources.${$} is missing transferable: true. Add transferable: true to resources.${$} to enable cross-storage transfers.`)}for(let $ of c.acceptsFrom??[]){let f=!!s[$],C=!!r[$];if(!f&&!C)throw new Error(`scenes.${p}.acceptsFrom references '${$}' which is not defined in objects or scenes`)}}for(let[p,c]of Object.entries(t)){if(typeof c=="string")continue;let $=c;if($.offchain){if($.listable)throw new Error(`resources.${p} has both offchain: true and listable: true. offchain resources emit events but store no on-chain state, so there is nothing to take out and place into a Listing.`);if($.transferable)throw new Error(`resources.${p} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if($.reactive)throw new Error(`resources.${p} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);$.fungible&&console.warn(`[dubhe codegen] WARNING: resources.${p} has both offchain: true and fungible: true. offchain fungible events are emitted only; no on-chain balance is maintained and no add/sub functions are generated. This is unusual \u2014 verify your intent.`)}if($.reactive&&$.fungible&&console.warn(`[dubhe codegen] WARNING: resources.${p} has both reactive: true and fungible: true. Fungible quantity changes (add/sub) do not suit reactive cross-user writes. Consider using a transfer function instead.`),$.global){if($.reactive)throw new Error(`resources.${p} has both global: true and reactive: true. global resources live in DappStorage (shared), not in UserStorage. Reactive writes operate between two UserStorage objects and are incompatible with global resources.`);if($.listable)throw new Error(`resources.${p} has both global: true and listable: true. global resources live in DappStorage and cannot be individually listed for sale. listable requires per-user ownership in UserStorage.`);if($.transferable)throw new Error(`resources.${p} has both global: true and transferable: true. global resources live in DappStorage and are not owned by individual users. transferable requires per-user state in UserStorage or ObjectStorage.`)}$.fungible&&$.listable&&console.warn(`[dubhe codegen] WARNING: resources.${p} has both fungible: true and listable: true. The generated list_${p} entry function will include an amount parameter for partial listings.`),$.transferable&&!g.has(p)&&console.warn(`[dubhe codegen] WARNING: resources.${p} has transferable: true but is not referenced in any objects.accepts or scenes.accepts. The cross-layer transfer functions will not be generated.`)}}function Oe(e){return e==="dubhe"?"dapp_service":"dapp_system"}function P(e){return e!=="dubhe"?"dapp_key::new(), ":""}function z(e,t){return""}function B(e,t){return""}function Fe(e){return e?"DappStorage":"UserStorage"}function Ke(e){return e?"dapp_storage":"user_storage"}function ce(e,t){let s=Oe(e);return t?{set_record:`${s}::set_global_record`,set_field:`${s}::set_global_field`,get_field:`${s}::get_global_field`,has_record:`${s}::has_global_record`,ensure_has:`${s}::ensure_has_global_record`,ensure_has_not:`${s}::ensure_has_not_global_record`,delete_record:`${s}::delete_global_record`,delete_field:`${s}::delete_global_field`}:{set_record:`${s}::set_record`,set_field:`${s}::set_field`,get_field:`${s}::get_field`,has_record:`${s}::has_record`,ensure_has:`${s}::ensure_has_record`,ensure_has_not:`${s}::ensure_has_not_record`,delete_record:`${s}::delete_record`,delete_field:`${s}::delete_field`}}async function Ie(e,t){if(console.log(`
170
- \u{1F4E6} Starting Resources Generation...`),!!e.resources){X(e);for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=Xe(e.name,s,n,"Onchain");await A(l,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let r=Qe(e.name,s,n),o=et(e,s,n),d=o?r.replace(/^}$/m,`
169
+ }`}function Fe(e){return e==="dubhe"?"dapp_service":"dapp_system"}function L(e){return e!=="dubhe"?"dapp_key::new(), ":""}function B(e,t){return""}function H(e,t){return""}function Ke(e){return e?"DappStorage":"UserStorage"}function Ie(e){return e?"dapp_storage":"user_storage"}function ue(e,t){let s=Fe(e);return t?{set_record:`${s}::set_global_record`,set_field:`${s}::set_global_field`,get_field:`${s}::get_global_field`,has_record:`${s}::has_global_record`,ensure_has:`${s}::ensure_has_global_record`,ensure_has_not:`${s}::ensure_has_not_global_record`,delete_record:`${s}::delete_global_record`,delete_field:`${s}::delete_global_field`}:{set_record:`${s}::set_record`,set_field:`${s}::set_field`,get_field:`${s}::get_field`,has_record:`${s}::has_record`,ensure_has:`${s}::ensure_has_record`,ensure_has_not:`${s}::ensure_has_not_record`,delete_record:`${s}::delete_record`,delete_field:`${s}::delete_field`}}async function Me(e,t){if(console.log(`
170
+ \u{1F4E6} Starting Resources Generation...`),!!e.resources)for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=et(e.name,s,n,"Onchain");await A(l,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let r=tt(e.name,s,n),o=rt(e,s,n),d=o?r.replace(/^}$/m,`
171
171
  ${o}
172
- }`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}}function Xe(e,t,s,n="Onchain"){let r=!L(s),o=r?`${ae(s)}`:"",d=n==="Offchain",l=!1,u=Fe(l),_=Ke(l),g=ce(e,l),p=d?"":`
172
+ }`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function et(e,t,s,n="Onchain"){let r=!z(s),o=r?`${ce(s)}`:"",d=n==="Offchain",l=!1,u=Ke(l),_=Ie(l),$=ue(e,l),p=d?"":`
173
173
  public fun has(${_}: &${u}): bool {
174
174
  let mut key_tuple = vector::empty();
175
175
  key_tuple.push_back(TABLE_NAME);
176
- ${g.has_record}<DappKey>(${_}, key_tuple)
176
+ ${$.has_record}<DappKey>(${_}, key_tuple)
177
177
  }
178
178
 
179
179
  public fun ensure_has(${_}: &${u}) {
180
180
  let mut key_tuple = vector::empty();
181
181
  key_tuple.push_back(TABLE_NAME);
182
- ${g.ensure_has}<DappKey>(${_}, key_tuple)
182
+ ${$.ensure_has}<DappKey>(${_}, key_tuple)
183
183
  }
184
184
 
185
185
  public fun ensure_has_not(${_}: &${u}) {
186
186
  let mut key_tuple = vector::empty();
187
187
  key_tuple.push_back(TABLE_NAME);
188
- ${g.ensure_has_not}<DappKey>(${_}, key_tuple)
188
+ ${$.ensure_has_not}<DappKey>(${_}, key_tuple)
189
189
  }
190
190
 
191
191
  public(package) fun delete(${_}: &mut ${u}, ctx: &TxContext) {
192
192
  let mut key_tuple = vector::empty();
193
193
  key_tuple.push_back(TABLE_NAME);
194
- ${g.delete_record}<DappKey>(${P(e)}${_}, key_tuple, vector[b"value"], ctx);
194
+ ${$.delete_record}<DappKey>(${L(e)}${_}, key_tuple, vector[b"value"], ctx);
195
195
  }
196
196
 
197
197
  public fun get(${_}: &${u}): (${s==="string"||s==="String"?"String":s}) {
198
198
  let mut key_tuple = vector::empty();
199
199
  key_tuple.push_back(TABLE_NAME);
200
- let value_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"value");
200
+ let value_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"value");
201
201
  let mut value_bcs = sui::bcs::new(value_raw);
202
202
  let value = ${G(e,s,"value_bcs",r?[{type:s,module:o}]:[])};
203
203
  (value)
204
204
  }
205
- `,c=l?"use dubhe::dapp_service::DappStorage;":"use dubhe::dapp_service::UserStorage;",$=r&&s!=="string"&&s!=="String";return`module ${e}::${t} {${!$?`
205
+ `,c=l?"use dubhe::dapp_service::DappStorage;":"use dubhe::dapp_service::UserStorage;",g=r&&s!=="string"&&s!=="String";return`module ${e}::${t} {${!g?`
206
206
  use sui::bcs::{to_bytes};`:""}${s==="string"||s==="String"?`
207
207
  use std::ascii::{String, into_bytes};`:s==="vector<String>"?`
208
208
  use std::ascii::String;`:""}
@@ -210,18 +210,18 @@ ${o}
210
210
  use dubhe::dapp_system;
211
211
  use ${e}::dapp_key;
212
212
  use ${e}::dapp_key::DappKey;
213
- ${$?` use ${e}::${o}::{${s}};`:""}
213
+ ${g?` use ${e}::${o}::{${s}};`:""}
214
214
 
215
215
  const TABLE_NAME: vector<u8> = b"${t}";
216
216
  const OFFCHAIN: bool = ${n==="Offchain"};
217
217
 
218
218
  ${p}
219
- public(package) fun set(${B(e,l)}${_}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
219
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
220
220
  let mut key_tuple = vector::empty();
221
221
  key_tuple.push_back(TABLE_NAME);
222
222
  let field_names = vector[b"value"];
223
223
  let value_tuple = encode(value);
224
- ${g.set_record}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
224
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
225
225
  }
226
226
 
227
227
  public fun encode(value: ${s==="string"||s==="String"?"String":s}): vector<vector<u8>> {
@@ -229,10 +229,10 @@ ${p}
229
229
  value_tuple.push_back(${s==="string"||s==="String"?"to_bytes(&into_bytes(value))":s==="vector<String>"?"to_bytes(&value)":r?`${e}::${o}::encode(value)`:"to_bytes(&value)"});
230
230
  value_tuple
231
231
  }
232
- }`}function ae(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function Qe(e,t,s){let n=s.fields,r=s.keys||[],o=s.offchain||!1,d=s.global||!1,l=o?"Offchain":"Onchain",u=d,_=Fe(u),g=Ke(u),p=ce(e,u),c=Object.keys(n).every(b=>r.includes(b)),$=Object.entries(n).filter(([b])=>!r.includes(b)),f=$.map(([b])=>b),C=f.length===1,a=$.filter(([b,O])=>!L(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ae(O)}`})).filter((b,O,se)=>se.findIndex(re=>re.type===b.type)===O),m=Object.entries(n).filter(([b,O])=>!L(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ae(O)}`})).filter((b,O,se)=>se.findIndex(re=>re.type===b.type)===O),h=Ne(e,t,n,r,!c&&!C,a,l,u,_,g,p),v=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",j=Object.values(n),D=f.filter(b=>{let O=n[b];return L(O)||O==="string"||O==="String"}).length>0||r.length>0?`
232
+ }`}function ce(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function tt(e,t,s){let n=s.fields,r=s.keys||[],o=s.offchain||!1,d=s.global||!1,l=o?"Offchain":"Onchain",u=d,_=Ke(u),$=Ie(u),p=ue(e,u),c=Object.keys(n).every(b=>r.includes(b)),g=Object.entries(n).filter(([b])=>!r.includes(b)),f=g.map(([b])=>b),C=f.length===1,a=g.filter(([b,O])=>!z(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ce(O)}`})).filter((b,O,re)=>re.findIndex(ne=>ne.type===b.type)===O),m=Object.entries(n).filter(([b,O])=>!z(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ce(O)}`})).filter((b,O,re)=>re.findIndex(ne=>ne.type===b.type)===O),h=st(e,t,n,r,!c&&!C,a,l,u,_,$,p),v=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",j=Object.values(n),D=f.filter(b=>{let O=n[b];return z(O)||O==="string"||O==="String"}).length>0||r.length>0?`
233
233
  use sui::bcs::{to_bytes};`:"",E=j.some(b=>b==="string"||b==="String"),S=j.some(b=>b==="vector<String>"),x=f.some(b=>{let O=n[b];return O==="string"||O==="String"}),I=x?`
234
234
  use std::ascii::{String, into_bytes};`:E||S?`
235
- use std::ascii::String;`:"",U=x?`
235
+ use std::ascii::String;`:"",P=x?`
236
236
  use std::ascii::{string, String, into_bytes};`:E||S?`
237
237
  use std::ascii::String;`:"";if(c||C)return`module ${e}::${t} {${D}${I}
238
238
  ${v}
@@ -256,7 +256,7 @@ ${h}
256
256
  self.${b} = ${b}
257
257
  }`).join(`
258
258
 
259
- `);return`module ${e}::${t} {${D}${U}
259
+ `);return`module ${e}::${t} {${D}${P}
260
260
  ${v}
261
261
  use dubhe::dapp_system;
262
262
  use ${e}::dapp_key;
@@ -282,106 +282,106 @@ ${T}
282
282
  ${M}
283
283
 
284
284
  ${h}
285
- }`}function L(e){return["address","bool","u8","u16","u32","u64","u128","u256","string","String","vector<address>","vector<bool>","vector<u8>","vector<u16>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>","vector<String>"].includes(e)}function G(e,t,s,n){let r=!L(t),o=r?n.find(d=>d.type===t):null;return t==="string"||t==="String"?`dubhe::bcs::peel_string(&mut ${s})`:t==="vector<String>"?`dubhe::bcs::peel_vec_string(&mut ${s})`:r&&o?`${e}::${o.module}::decode(&mut ${s})`:`sui::bcs::peel_${ue(t)}(&mut ${s})`}function Ee(e,t,s,n,r,o,d){let l=`${n}_raw`,u=`${n}_bcs`;return[`let ${l} = ${t.get_field}<DappKey>(${s}, key_tuple, b"${n}");`,`let mut ${u} = sui::bcs::new(${l});`,`let ${n} = ${G(e,r,u,d)};`].join(`
286
- `)}function Ne(e,t,s,n,r=!0,o=[],d="Onchain",l=!1,u="UserStorage",_="user_storage",g=ce("dubhe",!1)){let p=Object.entries(s).filter(([i])=>!n.includes(i)).reduce((i,[y,k])=>({...i,[y]:k}),{}),c=Object.keys(p),$=Object.keys(s).every(i=>n.includes(i)),f=c.length===1,C=d==="Offchain",a=n.length>0?n.map(i=>`${i}: ${s[i]}`).join(", "):"",m=n.length>0?`let mut key_tuple = vector::empty();
285
+ }`}function z(e){return["address","bool","u8","u16","u32","u64","u128","u256","string","String","vector<address>","vector<bool>","vector<u8>","vector<u16>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>","vector<String>"].includes(e)}function G(e,t,s,n){let r=!z(t),o=r?n.find(d=>d.type===t):null;return t==="string"||t==="String"?`dubhe::bcs::peel_string(&mut ${s})`:t==="vector<String>"?`dubhe::bcs::peel_vec_string(&mut ${s})`:r&&o?`${e}::${o.module}::decode(&mut ${s})`:`sui::bcs::peel_${pe(t)}(&mut ${s})`}function Oe(e,t,s,n,r,o,d){let l=`${n}_raw`,u=`${n}_bcs`;return[`let ${l} = ${t.get_field}<DappKey>(${s}, key_tuple, b"${n}");`,`let mut ${u} = sui::bcs::new(${l});`,`let ${n} = ${G(e,r,u,d)};`].join(`
286
+ `)}function st(e,t,s,n,r=!0,o=[],d="Onchain",l=!1,u="UserStorage",_="user_storage",$=ue("dubhe",!1)){let p=Object.entries(s).filter(([i])=>!n.includes(i)).reduce((i,[y,k])=>({...i,[y]:k}),{}),c=Object.keys(p),g=Object.keys(s).every(i=>n.includes(i)),f=c.length===1,C=d==="Offchain",a=n.length>0?n.map(i=>`${i}: ${s[i]}`).join(", "):"",m=n.length>0?`let mut key_tuple = vector::empty();
287
287
  key_tuple.push_back(TABLE_NAME);
288
288
  ${n.map(i=>`key_tuple.push_back(to_bytes(&${i}));`).join(`
289
289
  `)}`:`let mut key_tuple = vector::empty();
290
290
  key_tuple.push_back(TABLE_NAME);`,h=l?"":", ctx: &mut TxContext",v=l?"":", ctx",j=C?"":` public fun has(${_}: &${u}${a?", ":""}${a}): bool {
291
291
  ${m}
292
- ${g.has_record}<DappKey>(${_}, key_tuple)
292
+ ${$.has_record}<DappKey>(${_}, key_tuple)
293
293
  }
294
294
 
295
295
  public fun ensure_has(${_}: &${u}${a?", ":""}${a}) {
296
296
  ${m}
297
- ${g.ensure_has}<DappKey>(${_}, key_tuple)
297
+ ${$.ensure_has}<DappKey>(${_}, key_tuple)
298
298
  }
299
299
 
300
300
  public fun ensure_has_not(${_}: &${u}${a?", ":""}${a}) {
301
301
  ${m}
302
- ${g.ensure_has_not}<DappKey>(${_}, key_tuple)
302
+ ${$.ensure_has_not}<DappKey>(${_}, key_tuple)
303
303
  }
304
304
  `,w=`vector[${c.map(i=>`b"${i}"`).join(", ")}]`,F=C?"":` public(package) fun delete(${_}: &mut ${u}${a?", ":""}${a}${l?"":", ctx: &TxContext"}) {
305
305
  ${m}
306
- ${g.delete_record}<DappKey>(${P(e)}${_}, key_tuple, ${w}${l?"":", ctx"});
307
- }`,D=!f&&!C?c.map(i=>{let y=s[i],k=!L(y),T=k?o.find(M=>M.type===y):null;return` public fun get_${i}(${_}: &${u}${a?", ":""}${a}): ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y} {
306
+ ${$.delete_record}<DappKey>(${L(e)}${_}, key_tuple, ${w}${l?"":", ctx"});
307
+ }`,D=!f&&!C?c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return` public fun get_${i}(${_}: &${u}${a?", ":""}${a}): ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y} {
308
308
  ${m}
309
- let ${i}_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"${i}");
309
+ let ${i}_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"${i}");
310
310
  let mut ${i}_bcs = sui::bcs::new(${i}_raw);
311
311
  let ${i} = ${G(e,y,`${i}_bcs`,o)};
312
312
  ${i}
313
313
  }
314
314
 
315
- public(package) fun set_${i}(${B(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${i}: ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y}${h}) {
315
+ public(package) fun set_${i}(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${i}: ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y}${h}) {
316
316
  ${m}
317
317
  let value = ${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`};
318
- ${g.set_field}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, b"${i}", value${v});
318
+ ${$.set_field}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, b"${i}", value${v});
319
319
  }`}).join(`
320
320
 
321
- `):"",E=`vector[${c.map(i=>`b"${i}"`).join(", ")}]`,S=$?` public(package) fun set(${B(e,l)}${_}: &mut ${u}${a?", ":""}${a}${h}) {
321
+ `):"",E=`vector[${c.map(i=>`b"${i}"`).join(", ")}]`,S=g?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}${h}) {
322
322
  ${m}
323
323
  let field_names: vector<vector<u8>> = vector[];
324
324
  let value_tuple: vector<vector<u8>> = vector[];
325
- ${g.set_record}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
326
- }`:f?C?` public(package) fun set(${B(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}${h}) {
325
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
326
+ }`:f?C?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}${h}) {
327
327
  ${m}
328
328
  let field_names = vector[b"${c[0]}"];
329
329
  let value_tuple = encode(value);
330
- ${g.set_record}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
330
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
331
331
  }`:` public fun get(${_}: &${u}${a?", ":""}${a}): ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]} {
332
332
  ${m}
333
- let ${c[0]}_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"${c[0]}");
333
+ let ${c[0]}_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"${c[0]}");
334
334
  let mut ${c[0]}_bcs = sui::bcs::new(${c[0]}_raw);
335
335
  let value = ${G(e,Object.values(p)[0],`${c[0]}_bcs`,o)};
336
336
  value
337
337
  }
338
338
 
339
- public(package) fun set(${B(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}${h}) {
339
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}${h}) {
340
340
  ${m}
341
341
  let field_names = vector[b"${c[0]}"];
342
342
  let value_tuple = encode(value);
343
- ${g.set_record}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
344
- }`:C?` public(package) fun set(${B(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}${h}) {
343
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
344
+ }`:C?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}${h}) {
345
345
  ${m}
346
346
  let field_names = ${E};
347
347
  let value_tuple = encode(${c.join(", ")});
348
- ${g.set_record}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
348
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
349
349
  }`:` public fun get(${_}: &${u}${a?", ":""}${a}): (${Object.values(p).map(i=>i==="string"||i==="String"?"String":i).join(", ")}) {
350
350
  ${m}
351
- ${c.map((i,y)=>Ee(e,g,_,i,s[i],y,o)).join(`
351
+ ${c.map((i,y)=>Oe(e,$,_,i,s[i],y,o)).join(`
352
352
  `)}
353
353
  (${c.join(", ")})
354
354
  }
355
355
 
356
- public(package) fun set(${B(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}${h}) {
356
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}${h}) {
357
357
  ${m}
358
358
  let field_names = ${E};
359
359
  let value_tuple = encode(${c.join(", ")});
360
- ${g.set_record}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
361
- }`,x=r?C?` public(package) fun set_struct(${B(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${K(t)}${h}) {
360
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
361
+ }`,x=r?C?` public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${K(t)}${h}) {
362
362
  ${m}
363
363
  let field_names = ${E};
364
364
  let value_tuple = encode_struct(${t});
365
- ${g.set_record}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
365
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
366
366
  }`:` public fun get_struct(${_}: &${u}${a?", ":""}${a}): ${K(t)} {
367
367
  ${m}
368
- ${c.map((i,y)=>Ee(e,g,_,i,s[i],y,o)).join(`
368
+ ${c.map((i,y)=>Oe(e,$,_,i,s[i],y,o)).join(`
369
369
  `)}
370
370
  ${K(t)} { ${c.join(", ")} }
371
371
  }
372
372
 
373
- public(package) fun set_struct(${B(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${K(t)}${h}) {
373
+ public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${K(t)}${h}) {
374
374
  ${m}
375
375
  let field_names = ${E};
376
376
  let value_tuple = encode_struct(${t});
377
- ${g.set_record}<DappKey>(${P(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
377
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
378
378
  }`:"",I=f?` public fun encode(value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}): vector<vector<u8>> {
379
379
  let mut value_tuple = vector::empty();
380
- value_tuple.push_back(${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(p)[0]==="vector<String>"||L(Object.values(p)[0])?"to_bytes(&value)":`${e}::${o.find(i=>i.type===Object.values(p)[0])?.module}::encode(value)`});
380
+ value_tuple.push_back(${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(p)[0]==="vector<String>"||z(Object.values(p)[0])?"to_bytes(&value)":`${e}::${o.find(i=>i.type===Object.values(p)[0])?.module}::encode(value)`});
381
381
  value_tuple
382
382
  }`:r?C?` public fun encode(${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}): vector<vector<u8>> {
383
383
  let mut value_tuple = vector::empty();
384
- ${c.map(i=>{let y=s[i],k=!L(y),T=k?o.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`});`}).join(`
384
+ ${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`});`}).join(`
385
385
  `)}
386
386
  value_tuple
387
387
  }
@@ -390,7 +390,7 @@ ${h}
390
390
  encode(${c.map(i=>`${t}.${i}`).join(", ")})
391
391
  }`:` public fun encode(${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}): vector<vector<u8>> {
392
392
  let mut value_tuple = vector::empty();
393
- ${c.map(i=>{let y=s[i],k=!L(y),T=k?o.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`});`}).join(`
393
+ ${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`});`}).join(`
394
394
  `)}
395
395
  value_tuple
396
396
  }
@@ -401,7 +401,7 @@ ${h}
401
401
 
402
402
  public fun decode(data: vector<u8>): ${K(t)} {
403
403
  let mut bcs_type = sui::bcs::new(data);
404
- ${c.map(i=>{let y=s[i],k=!L(y),T=k?o.find(M=>M.type===y):null;return`let ${i} = ${y==="string"||y==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":y==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":k?`${e}::${T?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${ue(y)}(&mut bcs_type)`};`}).join(`
404
+ ${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`let ${i} = ${y==="string"||y==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":y==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":k?`${e}::${T?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${pe(y)}(&mut bcs_type)`};`}).join(`
405
405
  `)}
406
406
  ${K(t)} {
407
407
  ${c.map(i=>`${i},`).join(`
@@ -409,21 +409,21 @@ ${h}
409
409
  }
410
410
  }`:"";return[j,F,D,S,x,I].filter(i=>i.trim().length>0).join(`
411
411
 
412
- `)}function K(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ue(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${ue(t)}`}switch(e){case"u8":return"u8";case"u16":return"u16";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"bool":return"bool";case"address":return"address";case"String":return"string";default:return e}}function et(e,t,s){let n=[],r=e.name,o=Oe(r),d=P(r),l=s.fields,u=s.keys??[],_=Object.entries(l).filter(([c])=>!u.includes(c)),g=_.map(([c])=>c),p=u.length>0?u.map(c=>`${c}: ${l[c]}`).join(", "):"";if(s.fungible&&g.length===1){let[c,$]=_[0];n.push(`
412
+ `)}function K(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function pe(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${pe(t)}`}switch(e){case"u8":return"u8";case"u16":return"u16";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"bool":return"bool";case"address":return"address";case"String":return"string";default:return e}}function rt(e,t,s){let n=[],r=e.name,o=Fe(r),d=L(r),l=s.fields,u=s.keys??[],_=Object.entries(l).filter(([c])=>!u.includes(c)),$=_.map(([c])=>c),p=u.length>0?u.map(c=>`${c}: ${l[c]}`).join(", "):"";if(s.fungible&&$.length===1){let[c,g]=_[0];n.push(`
413
413
  // \u2500\u2500\u2500 fungible add / sub \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
414
414
  #[error]
415
415
  const EInsufficientAmount: vector<u8> = b"Insufficient amount";
416
416
 
417
- public(package) fun add(user_storage: &mut UserStorage, amount: ${$}, ctx: &mut TxContext) {
417
+ public(package) fun add(user_storage: &mut UserStorage, amount: ${g}, ctx: &mut TxContext) {
418
418
  let current = if (has(user_storage)) { get(user_storage) } else { 0 };
419
419
  set(user_storage, current + amount, ctx);
420
420
  }
421
421
 
422
- public(package) fun sub(user_storage: &mut UserStorage, amount: ${$}, ctx: &mut TxContext) {
422
+ public(package) fun sub(user_storage: &mut UserStorage, amount: ${g}, ctx: &mut TxContext) {
423
423
  let current = get(user_storage);
424
424
  assert!(current >= amount, EInsufficientAmount);
425
425
  set(user_storage, current - amount, ctx);
426
- }`)}if(u.length>0&&!s.offchain&&!s.global){let c=u.map(m=>`${m}: ${l[m]}`).join(", "),$=g.map(m=>`${m}: ${l[m]}`).join(", "),f=[c,$].filter(Boolean).join(", "),C=u.join(", "),a=[...u,...g].join(", ");n.push(`
426
+ }`)}if(u.length>0&&!s.offchain&&!s.global){let c=u.map(m=>`${m}: ${l[m]}`).join(", "),g=$.map(m=>`${m}: ${l[m]}`).join(", "),f=[c,g].filter(Boolean).join(", "),C=u.join(", "),a=[...u,...$].join(", ");n.push(`
427
427
  // \u2500\u2500\u2500 keys: mint (developer provides keys; framework ensures no duplicate) \u2500
428
428
  // Choosing the ID strategy (fresh address, counter, coordinate pack, etc.)
429
429
  // is intentionally left to the caller.
@@ -436,9 +436,9 @@ ${h}
436
436
  set(user_storage, ${a}, ctx);
437
437
  }`)}if(s.reactive){let c=u.length>0?`let mut key_tuple = vector::empty();
438
438
  key_tuple.push_back(TABLE_NAME);
439
- ${u.map($=>`key_tuple.push_back(sui::bcs::to_bytes(&${$}));`).join(`
439
+ ${u.map(g=>`key_tuple.push_back(sui::bcs::to_bytes(&${g}));`).join(`
440
440
  `)}`:`let mut key_tuple = vector::empty();
441
- key_tuple.push_back(TABLE_NAME);`;if(g.length>1){let $=g.map(f=>`${f}: ${l[f]}`).join(", ");n.push(`
441
+ key_tuple.push_back(TABLE_NAME);`;if($.length>1){let g=$.map(f=>`${f}: ${l[f]}`).join(", ");n.push(`
442
442
  // \u2500\u2500\u2500 reactive: cross-user write variants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
443
443
  // Package-level helpers: add pause checks and access control in your system
444
444
  // functions before calling these.
@@ -447,26 +447,26 @@ ${h}
447
447
  meta: &dubhe::dapp_service::PermitMetadata,
448
448
  from: &mut UserStorage,
449
449
  target: &mut UserStorage,
450
- ${p?p+", ":""}${$},
450
+ ${p?p+", ":""}${g},
451
451
  ctx: &mut TxContext,
452
452
  ) {
453
453
  ${c}
454
- let field_names = vector[${g.map(f=>`b"${f}"`).join(", ")}];
455
- let value_tuple = encode(${g.join(", ")});
454
+ let field_names = vector[${$.map(f=>`b"${f}"`).join(", ")}];
455
+ let value_tuple = encode(${$.join(", ")});
456
456
  ${o}::set_record_reactive<DappKey>(${d}scene_id, meta, from, target, key_tuple, field_names, value_tuple, ctx);
457
- }`)}for(let[$,f]of _){let C=f==="string"||f==="String"?`sui::bcs::to_bytes(&std::ascii::into_bytes(${$}))`:`sui::bcs::to_bytes(&${$})`;n.push(`
458
- public(package) fun set_${$}_reactive(
457
+ }`)}for(let[g,f]of _){let C=f==="string"||f==="String"?`sui::bcs::to_bytes(&std::ascii::into_bytes(${g}))`:`sui::bcs::to_bytes(&${g})`;n.push(`
458
+ public(package) fun set_${g}_reactive(
459
459
  scene_id: &sui::object::UID,
460
460
  meta: &dubhe::dapp_service::PermitMetadata,
461
461
  from: &mut UserStorage,
462
462
  target: &mut UserStorage,
463
- ${p?p+", ":""}${$}: ${f==="string"||f==="String"?"String":f},
463
+ ${p?p+", ":""}${g}: ${f==="string"||f==="String"?"String":f},
464
464
  ctx: &mut TxContext,
465
465
  ) {
466
466
  ${c}
467
467
  let value = ${C};
468
- ${o}::set_field_reactive<DappKey>(${d}scene_id, meta, from, target, key_tuple, b"${$}", value, ctx);
469
- }`)}}if(s.transferable){let c=e.objects??{},$=e.scenes??{},f=!!s.fungible,C=!f&&u.length>0,a=C?u[0]:null;for(let[m,h]of Object.entries(c)){if(!(h.accepts??[]).includes(t))continue;let v=K(m),j=`dubhe::dapp_service::ObjectStorage<${r}::${m}::${v}>`,w=m;if(f&&g.length===1){let[,F]=_[0];n.push(`
468
+ ${o}::set_field_reactive<DappKey>(${d}scene_id, meta, from, target, key_tuple, b"${g}", value, ctx);
469
+ }`)}}if(s.transferable){let c=e.objects??{},g=e.scenes??{},f=!!s.fungible,C=!f&&u.length>0,a=C?u[0]:null;for(let[m,h]of Object.entries(c)){if(!(h.accepts??[]).includes(t))continue;let v=K(m),j=`dubhe::dapp_service::ObjectStorage<${r}::${m}::${v}>`,w=m;if(f&&$.length===1){let[,F]=_[0];n.push(`
470
470
  // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
471
471
  public(package) fun transfer_user_to_${m}(
472
472
  user: &mut UserStorage,
@@ -486,7 +486,7 @@ ${h}
486
486
  ) {
487
487
  ${r}::${w}::sub_${t}(source, amount);
488
488
  add(user, amount, ctx);
489
- }`)}else if(C&&a)if(g.length===1){let[,F]=_[0],D=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,E=Object.entries(e.enums??{}).map(([x])=>({type:K(x),module:x})),S=G(r,F,"bcs",E);n.push(`
489
+ }`)}else if(C&&a)if($.length===1){let[,F]=_[0],D=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,E=Object.entries(e.enums??{}).map(([x])=>({type:K(x),module:x})),S=G(r,F,"bcs",E);n.push(`
490
490
  // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
491
491
  public(package) fun transfer_user_to_${m}(
492
492
  user: &mut UserStorage,
@@ -542,8 +542,8 @@ ${h}
542
542
  let raw = ${r}::${w}::remove_${t}_data(source, ${a});
543
543
  let decoded = decode(raw);
544
544
  set_struct(user, ${a}, decoded, ctx);
545
- }`)}for(let[m,h]of Object.entries($)){if(!(h.accepts??[]).includes(t))continue;let v=K(m),j=`dubhe::dapp_service::SceneStorage<${r}::${m}::${v}>`,w=m,F=h.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${h.authorization.permit}::${K(h.authorization.permit)}>`:"",D=h.authorization.kind==="permit"?` permit: &${F},
546
- `:"",E=h.authorization.kind==="permit"?"permit, ":"",S=h.authorization.kind==="permit"?", ctx":"";if(f&&g.length===1){let[,x]=_[0];n.push(`
545
+ }`)}for(let[m,h]of Object.entries(g)){if(!(h.accepts??[]).includes(t))continue;let v=K(m),j=`dubhe::dapp_service::SceneStorage<${r}::${m}::${v}>`,w=m,F=h.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${h.authorization.permit}::${K(h.authorization.permit)}>`:"",D=h.authorization.kind==="permit"?` permit: &${F},
546
+ `:"",E=h.authorization.kind==="permit"?"permit, ":"",S=h.authorization.kind==="permit"?", ctx":"";if(f&&$.length===1){let[,x]=_[0];n.push(`
547
547
  // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
548
548
  public(package) fun transfer_user_to_${m}(
549
549
  ${D} user: &mut UserStorage,
@@ -564,7 +564,7 @@ ${D} source: &mut ${j},
564
564
  ) {
565
565
  ${r}::${w}::sub_${t}(${E}source, amount${S});
566
566
  add(user, amount, ctx);
567
- }`)}else if(C&&a)if(g.length===1){let[,x]=_[0],I=x==="string"||x==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,U=Object.entries(e.enums??{}).map(([y])=>({type:K(y),module:y})),i=G(r,x,"bcs",U);n.push(`
567
+ }`)}else if(C&&a)if($.length===1){let[,x]=_[0],I=x==="string"||x==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,P=Object.entries(e.enums??{}).map(([y])=>({type:K(y),module:y})),i=G(r,x,"bcs",P);n.push(`
568
568
  // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
569
569
  public(package) fun transfer_user_to_${m}(
570
570
  ${D} user: &mut UserStorage,
@@ -620,7 +620,7 @@ ${D} source: &mut ${j},
620
620
  let raw = ${r}::${w}::remove_${t}_data(${E}source, ${a}${S});
621
621
  let decoded = decode(raw);
622
622
  set_struct(user, ${a}, decoded, ctx);
623
- }`)}}if(s.listable){let c=!!s.fungible,f=!c&&u.length>0,C=f?u[0]:null,a=`b"${t}"`;if(c&&g.length===1)n.push(`
623
+ }`)}}if(s.listable){let c=!!s.fungible,f=!c&&u.length>0,C=f?u[0]:null,a=`b"${t}"`;if(c&&$.length===1)n.push(`
624
624
  // \u2500\u2500\u2500 listable: market protocol (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
625
625
  // Package-level helpers: call these from your system functions.
626
626
  // Add pause checks, access control, and custom logic there.
@@ -636,7 +636,7 @@ ${D} source: &mut ${j},
636
636
  user_storage,
637
637
  ${a},
638
638
  { let mut k = vector::empty(); k.push_back(TABLE_NAME); k },
639
- b"${g[0]}",
639
+ b"${$[0]}",
640
640
  amount,
641
641
  price,
642
642
  listed_until,
@@ -696,7 +696,7 @@ ${D} source: &mut ${j},
696
696
  user_storage,
697
697
  ${a},
698
698
  record_key,
699
- vector[${g.map(v=>`b"${v}"`).join(", ")}],
699
+ vector[${$.map(v=>`b"${v}"`).join(", ")}],
700
700
  price,
701
701
  listed_until,
702
702
  ctx,
@@ -735,7 +735,7 @@ ${D} source: &mut ${j},
735
735
  dapp_key::new(), listing, user_storage, ctx
736
736
  );
737
737
  }`)}}return n.join(`
738
- `)}import tt from"node:path";function W(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function st(e){return e==="string"||e==="String"?"String":e}function Q(e){return`dubhe::dapp_service::ObjectStorage<${e}>`}function rt(e,t){let s=W(e),n=Q(s),r=[];for(let[o,d]of Object.entries(t.fields)){let l=st(d);r.push(`
738
+ `)}import nt from"node:path";function W(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ot(e){return e==="string"||e==="String"?"String":e}function Q(e){return`dubhe::dapp_service::ObjectStorage<${e}>`}function it(e,t){let s=W(e),n=Q(s),r=[];for(let[o,d]of Object.entries(t.fields)){let l=ot(d);r.push(`
739
739
  public fun get_${o}(storage: &${n}): ${l} {
740
740
  dubhe::dapp_system::get_object_field<${s}, ${l}>(storage, b"${o}")
741
741
  }
@@ -745,7 +745,7 @@ ${D} source: &mut ${j},
745
745
  dapp_key::new(), storage, b"${o}", value
746
746
  );
747
747
  }`)}return r.join(`
748
- `)}function nt(e,t){let s=W(e),n=Q(s);return`
748
+ `)}function at(e,t){let s=W(e),n=Q(s);return`
749
749
  public fun get_${t}(storage: &${n}): u64 {
750
750
  if (dubhe::dapp_system::has_object_field<${s}, u64>(storage, b"${t}")) {
751
751
  dubhe::dapp_system::get_object_field<${s}, u64>(storage, b"${t}")
@@ -765,7 +765,7 @@ ${D} source: &mut ${j},
765
765
  dubhe::dapp_system::set_object_field<DappKey, ${s}, u64>(
766
766
  dapp_key::new(), storage, b"${t}", current - amount
767
767
  );
768
- }`}function ot(e,t,s){let n=W(e),r=Q(n);return`
768
+ }`}function ct(e,t,s){let n=W(e),r=Q(n);return`
769
769
  public fun has_${t}(storage: &${r}, ${s}: u64): bool {
770
770
  let key = sui::bcs::to_bytes(&${s});
771
771
  dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key)
@@ -788,9 +788,9 @@ ${D} source: &mut ${j},
788
788
  let key = sui::bcs::to_bytes(&${s});
789
789
  assert!(dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key), EFieldNotFound);
790
790
  dubhe::dapp_system::remove_object_field<DappKey, ${n}, vector<u8>>(dapp_key::new(), storage, key)
791
- }`}function it(e,t,s,n,r){let o=r.resources??{},d=r.objects??{},l=r.scenes??{},u=W(t),_=Q(u),g=[],p=[];for(let c of n){let $=d[c]??l[c];if(!$)continue;let f=$.accepts??[],C=W(c);g.push(` use ${e}::${c};`);let a=f.filter(m=>s.includes(m));for(let m of a){let h=o[m];if(!h||typeof h=="string")continue;let v=h,j=!!l[c],w=`${e}::${c}::${C}`,F=j?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,D=j?l[c]:void 0,E=D?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${D.authorization.permit}::${W(D.authorization.permit)}>`:"",S=D?.authorization.kind==="permit"?` source_permit: &${E},
791
+ }`}function ut(e,t,s,n,r){let o=r.resources??{},d=r.objects??{},l=r.scenes??{},u=W(t),_=Q(u),$=[],p=[];for(let c of n){let g=d[c]??l[c];if(!g)continue;let f=g.accepts??[],C=W(c);$.push(` use ${e}::${c};`);let a=f.filter(m=>s.includes(m));for(let m of a){let h=o[m];if(!h||typeof h=="string")continue;let v=h,j=!!l[c],w=`${e}::${c}::${C}`,F=j?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,D=j?l[c]:void 0,E=D?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${D.authorization.permit}::${W(D.authorization.permit)}>`:"",S=D?.authorization.kind==="permit"?` source_permit: &${E},
792
792
  `:"",x=D?.authorization.kind==="permit"?"source_permit, ":"",I=D?.authorization.kind==="permit"?` ctx: &TxContext,
793
- `:"",U=D?.authorization.kind==="permit"?", ctx":"";if(!v.fungible&&v.keys?.length){let i=v.keys[0];p.push(`
793
+ `:"",P=D?.authorization.kind==="permit"?", ctx":"";if(!v.fungible&&v.keys?.length){let i=v.keys[0];p.push(`
794
794
  /// Transfer ${m} (keyed item) from ${c} into this ${t}.
795
795
  public(package) fun transfer_${c}_to_${t}_${m}(
796
796
  ${S} from: &mut ${F},
@@ -798,7 +798,7 @@ ${S} from: &mut ${F},
798
798
  ${i}: u64,
799
799
  ${I}
800
800
  ) {
801
- let data = ${c}::remove_${m}_data(${x}from, ${i}${U});
801
+ let data = ${c}::remove_${m}_data(${x}from, ${i}${P});
802
802
  set_${m}_data(to, ${i}, data);
803
803
  }`)}else p.push(`
804
804
  /// Transfer ${m} (fungible) from ${c} into this ${t}.
@@ -808,28 +808,28 @@ ${S} from: &mut ${F},
808
808
  amount: u64,
809
809
  ${I}
810
810
  ) {
811
- ${c}::sub_${m}(${x}from, amount${U});
811
+ ${c}::sub_${m}(${x}from, amount${P});
812
812
  add_${m}(to, amount);
813
- }`)}}return{imports:g,functions:p}}async function Me(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
814
- \u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=W(r),l=`${d}Storage`,u=`b"${r}"`,_=rt(r,o),g=o.accepts??[],p=[];for(let k of g){let T=n[k];if(!T||typeof T=="string")continue;let M=T;!M.fungible&&M.keys?.length?p.push(ot(r,k,M.keys[0])):p.push(nt(r,k))}let{imports:c,functions:$}=it(s,r,g,o.acceptsFrom??[],e),f=o.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",C=`dubhe::dapp_service::ObjectStorage<${d}>`,a=`
813
+ }`)}}return{imports:$,functions:p}}async function Ue(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
814
+ \u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=W(r),l=`${d}Storage`,u=`b"${r}"`,_=it(r,o),$=o.accepts??[],p=[];for(let k of $){let T=n[k];if(!T||typeof T=="string")continue;let M=T;!M.fungible&&M.keys?.length?p.push(ct(r,k,M.keys[0])):p.push(at(r,k))}let{imports:c,functions:g}=ut(s,r,$,o.acceptsFrom??[],e),f=o.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",C=`dubhe::dapp_service::ObjectStorage<${d}>`,a=`
815
815
  public fun assert_${r}_id(storage: &${C}, expected: vector<u8>) {
816
816
  assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);
817
817
  }`,m=`
818
818
  public fun entity_id(storage: &${C}): vector<u8> {
819
819
  *dubhe::dapp_service::object_storage_entity_id(storage)
820
820
  }`,j=Object.values(o.fields).some(k=>k==="string"||k==="String"||k==="vector<String>")?`
821
- use std::ascii::String;`:"",w=g.some(k=>{let T=n[k];return!T||typeof T=="string"?!1:!!T.keys?.length&&!T.fungible}),F=g.some(k=>{let T=n[k];return!T||typeof T=="string"?!1:!!T.fungible}),D=w,E=F,S=w,x=!!o.adminOnly,I=[D?` #[error]
821
+ use std::ascii::String;`:"",w=$.some(k=>{let T=n[k];return!T||typeof T=="string"?!1:!!T.keys?.length&&!T.fungible}),F=$.some(k=>{let T=n[k];return!T||typeof T=="string"?!1:!!T.fungible}),D=w,E=F,S=w,x=!!o.adminOnly,I=[D?` #[error]
822
822
  const EFieldNotFound: vector<u8> = b"Field not found";`:"",E?` #[error]
823
823
  const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",S?` #[error]
824
824
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:"",` #[error]
825
825
  const EWrongEntityId: vector<u8> = b"Wrong entity id";`,x?` #[error]
826
826
  const ENoPermission: vector<u8> = b"Caller does not have permission";`:""].filter(Boolean).join(`
827
- `),U=c.length>0?`
827
+ `),P=c.length>0?`
828
828
  `+c.join(`
829
829
  `):"",i=`dubhe::dapp_service::ObjectStorage<${d}>`,y=`module ${s}::${r} {
830
830
  use dubhe::dapp_service::DappStorage;
831
831
  use ${s}::dapp_key;
832
- use ${s}::dapp_key::DappKey;${j}${U}
832
+ use ${s}::dapp_key::DappKey;${j}${P}
833
833
 
834
834
  // \u2500\u2500\u2500 Error constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
835
835
  ${I}
@@ -855,7 +855,7 @@ ${p.join(`
855
855
  `)}
856
856
 
857
857
  // \u2500\u2500\u2500 acceptsFrom: cross-storage transfer functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
858
- ${$.join(`
858
+ ${g.join(`
859
859
  `)}
860
860
 
861
861
  // \u2500\u2500\u2500 Lifecycle entry functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
@@ -880,8 +880,8 @@ ${f}
880
880
  );
881
881
  }
882
882
  }
883
- `;await A(y,tt.join(t,`${r}.move`),"formatAndWriteMove")}}import at from"node:path";function ct(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function Ue(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
884
- \u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=ct(n),o=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
883
+ `;await A(y,nt.join(t,`${r}.move`),"formatAndWriteMove")}}import pt from"node:path";function dt(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function Pe(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
884
+ \u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=dt(n),o=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
885
885
  use dubhe::dapp_service::{Self, DappStorage};
886
886
  use ${s}::dapp_key;
887
887
  use ${s}::dapp_key::DappKey;
@@ -998,53 +998,53 @@ ${f}
998
998
  );
999
999
  }
1000
1000
  }
1001
- `;await A(l,at.join(t,`${n}.move`),"formatAndWriteMove")}}import ut from"node:path";function H(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function pt(e){return e==="string"||e==="String"?"String":e}function Z(e){return`dubhe::dapp_service::SceneStorage<${e}>`}function V(e,t){if(t.authorization.kind==="permit")return`${e.name}::${t.authorization.permit}::${H(t.authorization.permit)}`}function J(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${V(e,t)}>`}function dt(e,t,s){let n=H(t),r=Z(n),o=V(e,s),d=J(e,s),l=[];for(let[u,_]of Object.entries(s.fields)){let g=pt(_);s.authorization.kind==="permit"&&o&&d?l.push(`
1002
- public fun get_${u}(storage: &${r}): ${g} {
1003
- dubhe::dapp_system::get_scene_field<${n}, ${g}>(storage, b"${u}")
1001
+ `;await A(l,pt.join(t,`${n}.move`),"formatAndWriteMove")}}import lt from"node:path";function Y(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function $t(e){return e==="string"||e==="String"?"String":e}function X(e){return`dubhe::dapp_service::SceneStorage<${e}>`}function q(e,t){if(t.authorization.kind==="permit")return`${e.name}::${t.authorization.permit}::${Y(t.authorization.permit)}`}function Z(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${q(e,t)}>`}function gt(e,t,s){let n=Y(t),r=X(n),o=q(e,s),d=Z(e,s),l=[];for(let[u,_]of Object.entries(s.fields)){let $=$t(_);s.authorization.kind==="permit"&&o&&d?l.push(`
1002
+ public fun get_${u}(storage: &${r}): ${$} {
1003
+ dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
1004
1004
  }
1005
1005
 
1006
1006
  public(package) fun set_${u}(
1007
1007
  permit: &${d},
1008
1008
  storage: &mut ${r},
1009
- value: ${g},
1009
+ value: ${$},
1010
1010
  ctx: &TxContext,
1011
1011
  ) {
1012
- dubhe::dapp_system::set_scene_field<DappKey, ${o}, ${n}, ${g}>(
1012
+ dubhe::dapp_system::set_scene_field<DappKey, ${o}, ${n}, ${$}>(
1013
1013
  dapp_key::new(), permit, storage, b"${u}", value, ctx
1014
1014
  );
1015
1015
  }
1016
1016
 
1017
- public(package) fun remove_${u}_system_maintenance(storage: &mut ${r}): ${g} {
1018
- dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${g}>(
1017
+ public(package) fun remove_${u}_system_maintenance(storage: &mut ${r}): ${$} {
1018
+ dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${$}>(
1019
1019
  dapp_key::new(), storage, b"${u}"
1020
1020
  )
1021
1021
  }`):l.push(`
1022
- public fun get_${u}(storage: &${r}): ${g} {
1023
- dubhe::dapp_system::get_scene_field<${n}, ${g}>(storage, b"${u}")
1022
+ public fun get_${u}(storage: &${r}): ${$} {
1023
+ dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
1024
1024
  }
1025
1025
 
1026
- public(package) fun set_${u}(storage: &mut ${r}, value: ${g}) {
1027
- dubhe::dapp_system::set_scene_field_system<DappKey, ${n}, ${g}>(
1026
+ public(package) fun set_${u}(storage: &mut ${r}, value: ${$}) {
1027
+ dubhe::dapp_system::set_scene_field_system<DappKey, ${n}, ${$}>(
1028
1028
  dapp_key::new(), storage, b"${u}", value
1029
1029
  );
1030
1030
  }
1031
1031
 
1032
- public(package) fun remove_${u}(storage: &mut ${r}): ${g} {
1033
- dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${g}>(
1032
+ public(package) fun remove_${u}(storage: &mut ${r}): ${$} {
1033
+ dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${$}>(
1034
1034
  dapp_key::new(), storage, b"${u}"
1035
1035
  )
1036
1036
  }`)}return l.join(`
1037
- `)}function N(e,t){let s=J(e,t);return t.authorization.kind!=="permit"||!s?"":` permit: &${s},
1037
+ `)}function N(e,t){let s=Z(e,t);return t.authorization.kind!=="permit"||!s?"":` permit: &${s},
1038
1038
  `}function ee(e){return e.authorization.kind==="permit"?` ctx: &TxContext,
1039
- `:""}function pe(e,t,s,n,r,o){let d=V(e,t);return t.authorization.kind==="permit"&&d?`dubhe::dapp_system::set_scene_field<DappKey, ${d}, ${s}, ${n}>(
1039
+ `:""}function de(e,t,s,n,r,o){let d=q(e,t);return t.authorization.kind==="permit"&&d?`dubhe::dapp_system::set_scene_field<DappKey, ${d}, ${s}, ${n}>(
1040
1040
  dapp_key::new(), permit, storage, ${r}, ${o}, ctx
1041
1041
  );`:`dubhe::dapp_system::set_scene_field_system<DappKey, ${s}, ${n}>(
1042
1042
  dapp_key::new(), storage, ${r}, ${o}
1043
- );`}function lt(e,t,s,n,r){let o=V(e,t);return t.authorization.kind==="permit"&&o?`dubhe::dapp_system::remove_scene_field<DappKey, ${o}, ${s}, ${n}>(
1043
+ );`}function _t(e,t,s,n,r){let o=q(e,t);return t.authorization.kind==="permit"&&o?`dubhe::dapp_system::remove_scene_field<DappKey, ${o}, ${s}, ${n}>(
1044
1044
  dapp_key::new(), permit, storage, ${r}, ctx
1045
1045
  )`:`dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${s}, ${n}>(
1046
1046
  dapp_key::new(), storage, ${r}
1047
- )`}function gt(e,t,s,n){let r=H(t),o=Z(r);return`
1047
+ )`}function mt(e,t,s,n){let r=Y(t),o=X(r);return`
1048
1048
  public fun get_${n}(storage: &${o}): u64 {
1049
1049
  if (dubhe::dapp_system::has_scene_field<${r}, u64>(storage, b"${n}")) {
1050
1050
  dubhe::dapp_system::get_scene_field<${r}, u64>(storage, b"${n}")
@@ -1056,7 +1056,7 @@ ${N(e,s)} storage: &mut ${o},
1056
1056
  amount: u64,
1057
1057
  ${ee(s)} ) {
1058
1058
  let current = get_${n}(storage);
1059
- ${pe(e,s,r,"u64",`b"${n}"`,"current + amount")}
1059
+ ${de(e,s,r,"u64",`b"${n}"`,"current + amount")}
1060
1060
  }
1061
1061
 
1062
1062
  public(package) fun sub_${n}(
@@ -1065,8 +1065,8 @@ ${N(e,s)} storage: &mut ${o},
1065
1065
  ${ee(s)} ) {
1066
1066
  let current = get_${n}(storage);
1067
1067
  assert!(current >= amount, EInsufficientAmount);
1068
- ${pe(e,s,r,"u64",`b"${n}"`,"current - amount")}
1069
- }`}function $t(e,t,s,n,r){let o=H(t),d=Z(o);return`
1068
+ ${de(e,s,r,"u64",`b"${n}"`,"current - amount")}
1069
+ }`}function bt(e,t,s,n,r){let o=Y(t),d=X(o);return`
1070
1070
  public fun has_${n}(storage: &${d}, ${r}: u64): bool {
1071
1071
  let key = sui::bcs::to_bytes(&${r});
1072
1072
  dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key)
@@ -1084,7 +1084,7 @@ ${N(e,s)} storage: &mut ${d},
1084
1084
  ${ee(s)} ) {
1085
1085
  let key = sui::bcs::to_bytes(&${r});
1086
1086
  assert!(!dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key), EDuplicateItemId);
1087
- ${pe(e,s,o,"vector<u8>","key","data")}
1087
+ ${de(e,s,o,"vector<u8>","key","data")}
1088
1088
  }
1089
1089
 
1090
1090
  public(package) fun remove_${n}_data(
@@ -1093,29 +1093,29 @@ ${N(e,s)} storage: &mut ${d},
1093
1093
  ${ee(s)} ): vector<u8> {
1094
1094
  let key = sui::bcs::to_bytes(&${r});
1095
1095
  assert!(dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key), EFieldNotFound);
1096
- ${lt(e,s,o,"vector<u8>","key")}
1097
- }`}function _t(e,t,s,n,r,o){let d=o.resources??{},l=o.objects??{},u=o.scenes??{},_=H(t),g=Z(_),p=[],c=[],$=J(o,s),f=s.authorization.kind==="permit"&&$?` dest_permit: &${$},
1096
+ ${_t(e,s,o,"vector<u8>","key")}
1097
+ }`}function ft(e,t,s,n,r,o){let d=o.resources??{},l=o.objects??{},u=o.scenes??{},_=Y(t),$=X(_),p=[],c=[],g=Z(o,s),f=s.authorization.kind==="permit"&&g?` dest_permit: &${g},
1098
1098
  `:"",C=s.authorization.kind==="permit"?"dest_permit, ":"",a=s.authorization.kind==="permit"?` ctx: &TxContext,
1099
- `:"",m=s.authorization.kind==="permit"?", ctx":"";for(let h of r){let v=l[h]??u[h];if(!v)continue;let j=v.accepts??[],w=H(h);p.push(` use ${e}::${h};`);let F=!!u[h],D=`${e}::${h}::${w}`,E=F?`dubhe::dapp_service::SceneStorage<${D}>`:`dubhe::dapp_service::ObjectStorage<${D}>`,S=F?v:void 0,x=S?J(o,S):void 0,I=S?.authorization.kind==="permit"&&x?` source_permit: &${x},
1100
- `:"",U=S?.authorization.kind==="permit"?"source_permit, ":"",i=S?.authorization.kind==="permit"?", ctx":"",y=j.filter(k=>n.includes(k));for(let k of y){let T=d[k];if(!T||typeof T=="string")continue;let M=T;if(!M.fungible&&M.keys?.length){let b=M.keys[0];c.push(`
1099
+ `:"",m=s.authorization.kind==="permit"?", ctx":"";for(let h of r){let v=l[h]??u[h];if(!v)continue;let j=v.accepts??[],w=Y(h);p.push(` use ${e}::${h};`);let F=!!u[h],D=`${e}::${h}::${w}`,E=F?`dubhe::dapp_service::SceneStorage<${D}>`:`dubhe::dapp_service::ObjectStorage<${D}>`,S=F?v:void 0,x=S?Z(o,S):void 0,I=S?.authorization.kind==="permit"&&x?` source_permit: &${x},
1100
+ `:"",P=S?.authorization.kind==="permit"?"source_permit, ":"",i=S?.authorization.kind==="permit"?", ctx":"",y=j.filter(k=>n.includes(k));for(let k of y){let T=d[k];if(!T||typeof T=="string")continue;let M=T;if(!M.fungible&&M.keys?.length){let b=M.keys[0];c.push(`
1101
1101
  public(package) fun transfer_${h}_to_${t}_${k}(
1102
1102
  ${I}${f} from: &mut ${E},
1103
- to: &mut ${g},
1103
+ to: &mut ${$},
1104
1104
  ${b}: u64,
1105
1105
  ${a} ) {
1106
- let data = ${h}::remove_${k}_data(${U}from, ${b}${i});
1106
+ let data = ${h}::remove_${k}_data(${P}from, ${b}${i});
1107
1107
  set_${k}_data(${C}to, ${b}, data${m});
1108
1108
  }`)}else c.push(`
1109
1109
  public(package) fun transfer_${h}_to_${t}_${k}(
1110
1110
  ${I}${f} from: &mut ${E},
1111
- to: &mut ${g},
1111
+ to: &mut ${$},
1112
1112
  amount: u64,
1113
1113
  ${a} ) {
1114
- ${h}::sub_${k}(${U}from, amount${i});
1114
+ ${h}::sub_${k}(${P}from, amount${i});
1115
1115
  add_${k}(${C}to, amount${m});
1116
- }`)}}return{imports:p,functions:c}}async function Pe(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
1117
- \u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=H(r),l=`b"${r}"`,u=Z(d),_=dt(e,r,o),g=o.accepts??[],p=[];for(let S of g){let x=n[S];if(!x||typeof x=="string")continue;let I=x;!I.fungible&&I.keys?.length?p.push($t(e,r,o,S,I.keys[0])):p.push(gt(e,r,o,S))}let{imports:c,functions:$}=_t(s,r,o,g,o.acceptsFrom??[],e),a=Object.values(o.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
1118
- use std::ascii::String;`:"",m=g.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.keys?.length&&!x.fungible}),h=g.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.fungible}),v=[m?` #[error]
1116
+ }`)}}return{imports:p,functions:c}}async function Le(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
1117
+ \u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=Y(r),l=`b"${r}"`,u=X(d),_=gt(e,r,o),$=o.accepts??[],p=[];for(let S of $){let x=n[S];if(!x||typeof x=="string")continue;let I=x;!I.fungible&&I.keys?.length?p.push(bt(e,r,o,S,I.keys[0])):p.push(mt(e,r,o,S))}let{imports:c,functions:g}=ft(s,r,o,$,o.acceptsFrom??[],e),a=Object.values(o.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
1118
+ use std::ascii::String;`:"",m=$.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.keys?.length&&!x.fungible}),h=$.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.fungible}),v=[m?` #[error]
1119
1119
  const EFieldNotFound: vector<u8> = b"Field not found";`:"",h?` #[error]
1120
1120
  const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",m?` #[error]
1121
1121
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:""].filter(Boolean).join(`
@@ -1124,13 +1124,13 @@ ${a} ) {
1124
1124
  ${v}
1125
1125
  `:"",w=c.length>0?`
1126
1126
  `+c.join(`
1127
- `):"",F=J(e,o),D=o.authorization.kind==="permit"&&F?`
1127
+ `):"",F=Z(e,o),D=o.authorization.kind==="permit"&&F?`
1128
1128
  public(package) fun new_${r}_with_permit(
1129
1129
  dapp_storage: &DappStorage,
1130
1130
  permit: &${F},
1131
1131
  ctx: &mut TxContext,
1132
1132
  ): ${u} {
1133
- dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${V(e,o)}, ${d}>(
1133
+ dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${q(e,o)}, ${d}>(
1134
1134
  dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
1135
1135
  )
1136
1136
  }
@@ -1140,7 +1140,7 @@ ${v}
1140
1140
  permit: &${F},
1141
1141
  ctx: &mut TxContext,
1142
1142
  ) {
1143
- dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${V(e,o)}, ${d}>(
1143
+ dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${q(e,o)}, ${d}>(
1144
1144
  dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
1145
1145
  );
1146
1146
  }`:`
@@ -1178,7 +1178,7 @@ ${p.join(`
1178
1178
  `)}
1179
1179
 
1180
1180
  // \u2500\u2500\u2500 acceptsFrom: cross-storage transfer functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1181
- ${$.join(`
1181
+ ${g.join(`
1182
1182
  `)}
1183
1183
 
1184
1184
  // \u2500\u2500\u2500 SceneStorage lifecycle wrappers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
@@ -1196,7 +1196,7 @@ ${D}
1196
1196
  );
1197
1197
  }
1198
1198
  }
1199
- `;await A(E,ut.join(t,`${r}.move`),"formatAndWriteMove")}}async function Re(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
1199
+ `;await A(E,lt.join(t,`${r}.move`),"formatAndWriteMove")}}async function Re(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
1200
1200
  use dubhe::dapp_service::{DappHub, DappStorage};
1201
1201
  use dubhe::dapp_system;
1202
1202
  use ${e.name}::dapp_key::DappKey;
@@ -1213,7 +1213,7 @@ ${D}
1213
1213
  dapp_system::create_user_storage<DappKey>(dapp_hub, dapp_storage, ctx);
1214
1214
  }
1215
1215
  }
1216
- `;await A(s,t,"formatAndWriteMove")}import{existsSync as mt,readFileSync as bt,writeFileSync as Le}from"fs";import ft from"node:path";function yt(e){if(typeof e=="string")return{value:e};let t={};for(let[s,n]of Object.entries(e.fields??{}))t[s]=n;return t}function ze(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function ht(e){let t={};for(let[r,o]of Object.entries(e.resources??{}))t[r]=yt(o);let s={};for(let[r,o]of Object.entries(e.objects??{}))s[r]=ze(o);let n={};for(let[r,o]of Object.entries(e.scenes??{}))n[r]=ze(o);return{version:1,resources:t,objects:s,scenes:n}}function de(e,t,s){for(let[n,r]of Object.entries(s)){let o=t[n];if(o)for(let[d,l]of Object.entries(o)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
1216
+ `;await A(s,t,"formatAndWriteMove")}import ze from"chalk";import{existsSync as yt,readFileSync as ht,writeFileSync as Be}from"fs";import vt from"node:path";function kt(e){if(typeof e=="string")return{value:e};let t={};for(let[s,n]of Object.entries(e.fields??{}))t[s]=n;return t}function He(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function St(e){let t={};for(let[r,o]of Object.entries(e.resources??{}))t[r]=kt(o);let s={};for(let[r,o]of Object.entries(e.objects??{}))s[r]=He(o);let n={};for(let[r,o]of Object.entries(e.scenes??{}))n[r]=He(o);return{version:1,resources:t,objects:s,scenes:n}}function le(e,t,s){for(let[n,r]of Object.entries(s)){let o=t[n];if(o)for(let[d,l]of Object.entries(o)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
1217
1217
  Field "${d}" was removed.
1218
1218
 
1219
1219
  Resources, objects, and scenes are stored as raw bytes on-chain.
@@ -1221,10 +1221,10 @@ Removing fields corrupts existing data. Use a new name (e.g. "${n}_v2") for brea
1221
1221
  Field "${d}" type changed from "${l}" to "${r[d]}".
1222
1222
 
1223
1223
  Resources, objects, and scenes are stored as raw bytes on-chain.
1224
- Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function Be(e,t){let s=ft.join(e,`${t.name}.lock.json`),n=ht(t);if(mt(s)){let r;try{r=JSON.parse(bt(s,"utf-8"))}catch{console.warn(`[dubhe] Could not parse ${s}, skipping break-check.`),Le(s,JSON.stringify(n,null,2)+`
1225
- `,"utf-8");return}de("resources",r.resources??{},n.resources),de("objects",r.objects??{},n.objects),de("scenes",r.scenes??{},n.scenes)}Le(s,JSON.stringify(n,null,2)+`
1226
- `,"utf-8")}import R from"node:path";async function vt(e,t,s,n=1){console.log(`
1227
- \u{1F680} Starting Code Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(` \u2514\u2500 Settlement Mode: ${n===1?"USER_PAYS":"DAPP_SUBSIDIZES"}`),Be(e,t),console.log(e);let r=R.join(e,"src",t.name);Y(`${r}`)&&ie(`${r}/sources/codegen`),Y(`${r}/Move.toml`)||await fe(t,e);let o=R.join(r,"sources","codegen","genesis.move");Y(o)||await je(t,o,n);let d=R.join(r,"sources","codegen","init_test.move");Y(d)||await De(t,d);let l=R.join(r,"sources","codegen","dapp_key.move");Y(l)||await ke(t,l);let u=R.join(r,"sources","scripts","deploy_hook.move");Y(u)||await he(t,u,n);let _=R.join(r,"sources","codegen","resources");await Ie(t,_);let g=R.join(r,"sources","codegen","objects");await Me(t,g);let p=R.join(r,"sources","codegen","permits");await Ue(t,p);let c=R.join(r,"sources","codegen","scenes");await Pe(t,c);let $=R.join(r,"sources","codegen","enums");Y($)||await Ae(t,$),t.errors&&await we(t.name,t.errors,e);let f=R.join(r,"sources","codegen","user_storage_init.move");await Re(t,f),await Ce(t,e),await ve(t,e),console.log(`
1224
+ Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function We(e,t){let s=vt.join(e,`${t.name}.lock.json`),n=St(t);if(yt(s)){let r;try{r=JSON.parse(ht(s,"utf-8"))}catch{console.warn(ze.yellow("[dubhe]")+` Could not parse ${ze.bold(s)}, skipping break-check.`),Be(s,JSON.stringify(n,null,2)+`
1225
+ `,"utf-8");return}le("resources",r.resources??{},n.resources),le("objects",r.objects??{},n.objects),le("scenes",r.scenes??{},n.scenes)}Be(s,JSON.stringify(n,null,2)+`
1226
+ `,"utf-8")}import U from"chalk";var te=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function Ye(e){let t=e.resources??{},s=e.objects??{},n=e.permits??{},r=e.scenes??{},o=new Set(Object.keys(t)),d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),_=new Set;for(let p of o)(d.has(p)||l.has(p)||u.has(p))&&_.add(p);for(let p of d)(l.has(p)||u.has(p))&&_.add(p);for(let p of l)u.has(p)&&_.add(p);if(_.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[..._].sort().join(", ")}`);let $=new Set;for(let[p,c]of Object.entries(s)){for(let g of c.accepts??[]){$.add(g);let f=t[g];if(!f)throw new Error(`objects.${p}.accepts references '${g}' which is not defined in resources`);if(typeof f!="string"&&!f.transferable)throw new Error(`objects.${p}.accepts includes '${g}', but resources.${g} is missing transferable: true. Add transferable: true to resources.${g} to enable cross-storage transfers.`)}for(let g of c.acceptsFrom??[]){let f=!!s[g],C=!!r[g];if(!f&&!C)throw new Error(`objects.${p}.acceptsFrom references '${g}' which is not defined in objects or scenes`)}}for(let[p,c]of Object.entries(r)){if(!c.authorization)throw new Error(`scenes.${p} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(c.authorization.kind==="permit"){if(!n[c.authorization.permit])throw new Error(`scenes.${p}.authorization references permit '${c.authorization.permit}', but permits.${c.authorization.permit} is not defined`)}else if(c.authorization.kind!=="system")throw new Error(`scenes.${p}.authorization.kind must be 'system' or 'permit'`);for(let g of c.accepts??[]){$.add(g);let f=t[g];if(!f)throw new Error(`scenes.${p}.accepts references '${g}' which is not defined in resources`);if(typeof f!="string"&&!f.transferable)throw new Error(`scenes.${p}.accepts includes '${g}', but resources.${g} is missing transferable: true. Add transferable: true to resources.${g} to enable cross-storage transfers.`)}for(let g of c.acceptsFrom??[]){let f=!!s[g],C=!!r[g];if(!f&&!C)throw new Error(`scenes.${p}.acceptsFrom references '${g}' which is not defined in objects or scenes`)}}for(let[p,c]of Object.entries(t)){if(typeof c=="string")continue;let g=c;if(g.offchain){if(g.listable)throw new Error(`resources.${p} has both offchain: true and listable: true. offchain resources emit events but store no on-chain state, so there is nothing to take out and place into a Listing.`);if(g.transferable)throw new Error(`resources.${p} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if(g.reactive)throw new Error(`resources.${p} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);g.fungible&&te(`resources.${U.bold(p)} has both ${U.cyan("offchain: true")} and ${U.cyan("fungible: true")}. offchain fungible events are emitted only; no on-chain balance is maintained and no add/sub functions are generated. This is unusual \u2014 verify your intent.`)}if(g.reactive&&g.fungible&&te(`resources.${U.bold(p)} has both ${U.cyan("reactive: true")} and ${U.cyan("fungible: true")}. Fungible quantity changes (add/sub) do not suit reactive cross-user writes. Consider using a transfer function instead.`),g.global){if(g.reactive)throw new Error(`resources.${p} has both global: true and reactive: true. global resources live in DappStorage (shared), not in UserStorage. Reactive writes operate between two UserStorage objects and are incompatible with global resources.`);if(g.listable)throw new Error(`resources.${p} has both global: true and listable: true. global resources live in DappStorage and cannot be individually listed for sale. listable requires per-user ownership in UserStorage.`);if(g.transferable)throw new Error(`resources.${p} has both global: true and transferable: true. global resources live in DappStorage and are not owned by individual users. transferable requires per-user state in UserStorage or ObjectStorage.`)}g.fungible&&g.listable&&te(`resources.${U.bold(p)} has both ${U.cyan("fungible: true")} and ${U.cyan("listable: true")}. The generated ${U.green(`list_${p}`)} entry function will include an ${U.cyan("amount")} parameter for partial listings.`),g.transferable&&!$.has(p)&&te(`resources.${U.bold(p)} has ${U.cyan("transferable: true")} but is not referenced in any ${U.cyan("objects.accepts")} or ${U.cyan("scenes.accepts")}. The cross-layer transfer functions will not be generated.`)}}import R from"node:path";async function xt(e,t,s,n=1){console.log(`
1227
+ \u{1F680} Starting Code Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(` \u2514\u2500 Settlement Mode: ${n===1?"USER_PAYS":"DAPP_SUBSIDIZES"}`),Ye(t),We(e,t),console.log(e);let r=R.join(e,"src",t.name);V(`${r}`)&&ae(`${r}/sources/codegen`),V(`${r}/Move.toml`)||await ye(t,e);let o=R.join(r,"sources","codegen","genesis.move");V(o)||await Te(t,o,n);let d=R.join(r,"sources","codegen","init_test.move");V(d)||await je(t,d);let l=R.join(r,"sources","codegen","dapp_key.move");V(l)||await Se(t,l);let u=R.join(r,"sources","scripts","deploy_hook.move");V(u)||await ve(t,u,n);let _=R.join(r,"sources","codegen","resources");await Me(t,_);let $=R.join(r,"sources","codegen","objects");await Ue(t,$);let p=R.join(r,"sources","codegen","permits");await Pe(t,p);let c=R.join(r,"sources","codegen","scenes");await Le(t,c);let g=R.join(r,"sources","codegen","enums");V(g)||await Ee(t,g),t.errors&&await De(t.name,t.errors,e);let f=R.join(r,"sources","codegen","user_storage_init.move");await Re(t,f),await we(t,e),await ke(t,e),console.log(`
1228
1228
  \u2705 Code Generation Complete!
1229
- `)}var Ys=vt;var qs=e=>(X(e),e);import{findUp as kt}from"find-up";import le from"path";import St from"esbuild";var te=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as xt}from"fs";import{pathToFileURL as Ct}from"url";import wt from"os";var Dt=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],ge="dubhe.config.example.mjs";async function nr(e){e=await We(e);try{return await St.build({entryPoints:[e],format:"esm",outfile:ge,platform:"node",bundle:!0,packages:"external"}),e=await We(ge,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{xt(ge,{force:!0})}}async function We(e,t){return e===void 0?e=await jt():le.isAbsolute(e)||(e=le.join(process.cwd(),e),e=le.normalize(e)),t&&wt.platform()==="win32"?Ct(e).href:e}async function jt(){let e=await kt(Dt);if(e===void 0)throw new te;return e}var Tt=(s=>(s.Event="event",s.Schema="schema",s))(Tt||{});export{Tt as SubscriptionKind,Be as checkAndUpdateLock,vt as codegen,qs as defineConfig,A as formatAndWriteMove,Ot as formatMove,Me as generateObjects,Pe as generateScenes,nr as loadConfig,Ys as schemaGen};
1229
+ `)}var Zs=xt;var Qs=e=>e;import{findUp as Ct}from"find-up";import $e from"path";import wt from"esbuild";var se=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as Dt}from"fs";import{pathToFileURL as jt}from"url";import Tt from"os";var At=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],ge="dubhe.config.example.mjs";async function cr(e){e=await Ve(e);try{return await wt.build({entryPoints:[e],format:"esm",outfile:ge,platform:"node",bundle:!0,packages:"external"}),e=await Ve(ge,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Dt(ge,{force:!0})}}async function Ve(e,t){return e===void 0?e=await Et():$e.isAbsolute(e)||(e=$e.join(process.cwd(),e),e=$e.normalize(e)),t&&Tt.platform()==="win32"?jt(e).href:e}async function Et(){let e=await Ct(At);if(e===void 0)throw new se;return e}var Ot=(s=>(s.Event="event",s.Schema="schema",s))(Ot||{});export{Ot as SubscriptionKind,We as checkAndUpdateLock,xt as codegen,Qs as defineConfig,A as formatAndWriteMove,It as formatMove,Ue as generateObjects,Le as generateScenes,cr as loadConfig,Zs as schemaGen};
1230
1230
  //# sourceMappingURL=index.js.map