@0xobelisk/sui-common 1.2.0-pre.124 → 1.2.0-pre.125

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 be from"prettier";import Je from"prettier-plugin-move-js";async function Ut(e,t){let s;t&&(s=await be.resolveConfig(t));try{return be.format(e,{plugins:[Je],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 ye from"node:fs/promises";import Xe from"node:path";import fe from"debug";var ie=fe("dubhe:common"),Ze=fe("dubhe:common");ie.log=console.debug.bind(console);Ze.log=console.error.bind(console);var ae=ie.extend("codegen");ae.log=console.debug.bind(console);async function A(e,t,s){let n=e,r=`// Copyright (c) Obelisk Labs, Inc.
1
+ import ye from"prettier";import Xe from"prettier-plugin-move-js";async function Rt(e,t){let s;t&&(s=await ye.resolveConfig(t));try{return ye.format(e,{plugins:[Xe],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 ve from"node:fs/promises";import Ne from"node:path";import he from"debug";var ce=he("dubhe:common"),Qe=he("dubhe:common");ce.log=console.debug.bind(console);Qe.log=console.error.bind(console);var ue=ce.extend("codegen");ue.log=console.debug.bind(console);async function E(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
  `,i=`#[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=i+n:t.includes("genesis")&&(d=l+n),await ye.mkdir(Xe.dirname(t),{recursive:!0}),await ye.writeFile(t,d),ae(`${s}: ${t}`)}import{existsSync as V}from"fs";import Z from"fs";function ce(e){Z.existsSync(e)&&(Z.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;Z.lstatSync(s).isDirectory()?ce(s):Z.unlinkSync(s)}),Z.rmdirSync(e))}var he={name:"@0xobelisk/sui-common",version:"1.2.0-pre.124",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 ve(e,t){console.log(`
8
+ `;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=i+n:t.includes("genesis")&&(d=l+n),await ve.mkdir(Ne.dirname(t),{recursive:!0}),await ve.writeFile(t,d),ue(`${s}: ${t}`)}import{existsSync as q}from"fs";import X from"fs";function pe(e){X.existsSync(e)&&(X.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;X.lstatSync(s).isDirectory()?pe(s):X.unlinkSync(s)}),X.rmdirSync(e))}var ke={name:"@0xobelisk/sui-common",version:"1.2.0-pre.125",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 Se(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${he.version}" }
16
+ Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "framework/src/dubhe", rev = "v${ke.version}" }
17
17
 
18
18
  [addresses]
19
19
  sui = "0x2"
20
20
  ${e.name} = "0x0"
21
- `;await A(s,`${t}/src/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
22
- `)}import{existsSync as ke}from"fs";async function Se(e,t,s=1){if(!ke(t)){let n=s===1?`// Settlement mode: USER_PAYS \u2014 users pay transaction fees at settlement time.
21
+ `;await E(s,`${t}/src/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
22
+ `)}import{existsSync as xe}from"fs";async function Ce(e,t,s=1){if(!xe(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 xe(e,t){if(!ke(`${t}/src/${e.name}/sources/scripts/migrate.move`)){let s=`module ${e.name}::migrate {
32
+ }`;await E(r,t,"formatAndWriteMove")}}async function we(e,t){if(!xe(`${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 Ce(e,t){let s=`module ${e.name}::dapp_key {
39
+ `;await E(s,`${t}/src/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function De(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;
@@ -77,14 +77,14 @@ ${e.name} = "0x0"
77
77
  type_name::with_defining_ids<DappKey1>() == type_name::with_defining_ids<DappKey2>()
78
78
  }
79
79
  }
80
- `;await A(s,t,"formatAndWriteMove")}import{existsSync as we}from"fs";import De from"node:fs/promises";async function je(e,t){we(`${t}/src/${e.name}/sources/systems`)||await De.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),we(`${t}/src/${e.name}/sources/tests`)||await De.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}function Ne(e){return"E"+e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function et(e){return typeof e=="string"?e:e.message}async function Te(e,t,s){console.log(`
81
- \u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([i,d])=>{let l=Ne(i),u=et(d);return console.log(` \u2514\u2500 ${i}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${i}(condition: bool) { assert!(condition, ${l}) }`].join(`
80
+ `;await E(s,t,"formatAndWriteMove")}import{existsSync as je}from"fs";import Te from"node:fs/promises";async function Ae(e,t){je(`${t}/src/${e.name}/sources/systems`)||await Te.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),je(`${t}/src/${e.name}/sources/tests`)||await Te.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}function tt(e){return"E"+e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function st(e){return typeof e=="string"?e:e.message}async function Ee(e,t,s){console.log(`
81
+ \u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([i,d])=>{let l=tt(i),u=st(d);return console.log(` \u2514\u2500 ${i}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${i}(condition: bool) { assert!(condition, ${l}) }`].join(`
82
82
  `)}).join(`
83
83
 
84
84
  `),r=`module ${e}::error {
85
85
  ${n}
86
86
  }
87
- `;await A(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function Ae(e,t){let n=e.name==="dubhe"?"":`
87
+ `;await E(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function Oe(e,t){let n=e.name==="dubhe"?"":`
88
88
  /// Create a DappStorage for this DApp without sharing it.
89
89
  /// Suitable for unit tests that exercise global-resource functions.
90
90
  public fun create_dapp_storage_for_testing(ctx: &mut TxContext): dubhe::dapp_service::DappStorage {
@@ -106,7 +106,7 @@ module ${e.name}::init_test {
106
106
  }
107
107
  ${n}
108
108
  }
109
- `;await A(r,t,"formatAndWriteMove")}async function Ee(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
109
+ `;await E(r,t,"formatAndWriteMove")}async function Fe(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
110
110
  use dubhe::dapp_service::DappHub;
111
111
 
112
112
  // The framework genesis initialises the DappHub state via deploy_hook.
@@ -156,8 +156,8 @@ ${n}
156
156
  // ==========================================
157
157
  }
158
158
  }
159
- `;await A(r,t,"formatAndWriteMove")}function Oe(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Fe(e,t){if(console.log(`
160
- \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)),i=tt(e.name,s,r);await A(i,`${t}/${Oe(s)}.move`,"formatAndWriteMove")}}function tt(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Oe(t)} {
159
+ `;await E(r,t,"formatAndWriteMove")}function Ke(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Ie(e,t){if(console.log(`
160
+ \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)),i=rt(e.name,s,r);await E(i,`${t}/${Ke(s)}.move`,"formatAndWriteMove")}}function rt(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Ke(t)} {
161
161
  use sui::bcs::{BCS, to_bytes, peel_enum_tag};
162
162
 
163
163
  public enum ${t} has copy, drop, store {
@@ -181,40 +181,40 @@ ${s.map((r,i)=>` ${i} => ${t}::${r.charAt(0).toUpperCase()+r.slice(1)
181
181
  _ => abort,
182
182
  }
183
183
  }
184
- }`}function Ie(e){return e==="dubhe"?"dapp_service":"dapp_system"}function R(e){return e!=="dubhe"?"dapp_key::new(), ":""}function B(e,t){return""}function H(e,t){return""}function Me(e){return e?"DappStorage":"UserStorage"}function Ue(e){return e?"dapp_storage":"user_storage"}function pe(e,t){let s=Ie(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 Pe(e,t){if(console.log(`
185
- \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=st(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=rt(e.name,s,n),i=ot(e,s,n),d=i?r.replace(/^}$/m,`
184
+ }`}function Me(e){return e==="dubhe"?"dapp_service":"dapp_system"}function R(e){return e!=="dubhe"?"dapp_key::new(), ":""}function z(e,t){return""}function H(e,t){return""}function Pe(e){return e?"DappStorage":"UserStorage"}function Re(e){return e?"dapp_storage":"user_storage"}function le(e,t){let s=Me(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 Le(e,t){if(console.log(`
185
+ \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=nt(e.name,s,n,"Onchain");await E(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=ot(e.name,s,n),i=at(e,s,n),d=i?r.replace(/^}$/m,`
186
186
  ${i}
187
- }`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function st(e,t,s,n="Onchain"){let r=!z(s),i=r?`${ue(s)}`:"",d=n==="Offchain",l=!1,u=Me(l),$=Ue(l),g=pe(e,l),f=d?"":`
188
- public fun has(${$}: &${u}): bool {
187
+ }`):r;await E(d,`${t}/${s}.move`,"formatAndWriteMove")}}function nt(e,t,s,n="Onchain"){let r=!B(s),i=r?`${de(s)}`:"",d=n==="Offchain",l=!1,u=Pe(l),_=Re(l),g=le(e,l),y=d?"":`
188
+ public fun has(${_}: &${u}): bool {
189
189
  let mut key_tuple = vector::empty();
190
190
  key_tuple.push_back(TABLE_NAME);
191
- ${g.has_record}<DappKey>(${$}, key_tuple)
191
+ ${g.has_record}<DappKey>(${_}, key_tuple)
192
192
  }
193
193
 
194
- public fun ensure_has(${$}: &${u}) {
194
+ public fun ensure_has(${_}: &${u}) {
195
195
  let mut key_tuple = vector::empty();
196
196
  key_tuple.push_back(TABLE_NAME);
197
- ${g.ensure_has}<DappKey>(${$}, key_tuple)
197
+ ${g.ensure_has}<DappKey>(${_}, key_tuple)
198
198
  }
199
199
 
200
- public fun ensure_has_not(${$}: &${u}) {
200
+ public fun ensure_has_not(${_}: &${u}) {
201
201
  let mut key_tuple = vector::empty();
202
202
  key_tuple.push_back(TABLE_NAME);
203
- ${g.ensure_has_not}<DappKey>(${$}, key_tuple)
203
+ ${g.ensure_has_not}<DappKey>(${_}, key_tuple)
204
204
  }
205
205
 
206
- public(package) fun delete(${$}: &mut ${u}, ctx: &TxContext) {
206
+ public(package) fun delete(${_}: &mut ${u}, ctx: &TxContext) {
207
207
  let mut key_tuple = vector::empty();
208
208
  key_tuple.push_back(TABLE_NAME);
209
- ${g.delete_record}<DappKey>(${R(e)}${$}, key_tuple, vector[b"value"], ctx);
209
+ ${g.delete_record}<DappKey>(${R(e)}${_}, key_tuple, vector[b"value"], ctx);
210
210
  }
211
211
 
212
- public fun get(${$}: &${u}): (${s==="string"||s==="String"?"String":s}) {
212
+ public fun get(${_}: &${u}): (${s==="string"||s==="String"?"String":s}) {
213
213
  let mut key_tuple = vector::empty();
214
214
  key_tuple.push_back(TABLE_NAME);
215
- let value_raw = ${g.get_field}<DappKey>(${$}, key_tuple, b"value");
215
+ let value_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"value");
216
216
  let mut value_bcs = sui::bcs::new(value_raw);
217
- let value = ${G(e,s,"value_bcs",r?[{type:s,module:i}]:[])};
217
+ let value = ${J(e,s,"value_bcs",r?[{type:s,module:i}]:[])};
218
218
  (value)
219
219
  }
220
220
  `,o=l?"use dubhe::dapp_service::DappStorage;":"use dubhe::dapp_service::UserStorage;",b=r&&s!=="string"&&s!=="String";return`module ${e}::${t} {${!b?`
@@ -230,13 +230,13 @@ ${b?` use ${e}::${i}::{${s}};`:""}
230
230
  const TABLE_NAME: vector<u8> = b"${t}";
231
231
  const OFFCHAIN: bool = ${n==="Offchain"};
232
232
 
233
- ${f}
234
- public(package) fun set(${H(e,l)}${$}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
233
+ ${y}
234
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
235
235
  let mut key_tuple = vector::empty();
236
236
  key_tuple.push_back(TABLE_NAME);
237
237
  let field_names = vector[b"value"];
238
238
  let value_tuple = encode(value);
239
- ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
239
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
240
240
  }
241
241
 
242
242
  public fun encode(value: ${s==="string"||s==="String"?"String":s}): vector<vector<u8>> {
@@ -244,188 +244,188 @@ ${f}
244
244
  value_tuple.push_back(${s==="string"||s==="String"?"to_bytes(&into_bytes(value))":s==="vector<String>"?"to_bytes(&value)":r?`${e}::${i}::encode(value)`:"to_bytes(&value)"});
245
245
  value_tuple
246
246
  }
247
- }`}function ue(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function rt(e,t,s){let n=s.fields,r=s.keys||[],i=s.offchain||!1,d=s.global||!1,l=i?"Offchain":"Onchain",u=d,$=Me(u),g=Ue(u),f=pe(e,u),o=Object.keys(n).every(m=>r.includes(m)),b=Object.entries(n).filter(([m])=>!r.includes(m)),p=b.map(([m])=>m),h=p.length===1,c=b.filter(([m,O])=>!z(O)&&O!=="string"&&O!=="String").map(([m,O])=>({type:O,module:`${ue(O)}`})).filter((m,O,ne)=>ne.findIndex(oe=>oe.type===m.type)===O),_=Object.entries(n).filter(([m,O])=>!z(O)&&O!=="string"&&O!=="String").map(([m,O])=>({type:O,module:`${ue(O)}`})).filter((m,O,ne)=>ne.findIndex(oe=>oe.type===m.type)===O),v=nt(e,t,n,r,!o&&!h,c,l,u,$,g,f),k=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",D=s.reactive?`
248
- use dubhe::dapp_service::ScenePermit;`:"",w=Object.values(n),E=p.filter(m=>{let O=n[m];return z(O)||O==="string"||O==="String"}).length>0||r.length>0?`
249
- use sui::bcs::{to_bytes};`:"",x=w.some(m=>m==="string"||m==="String"),C=w.some(m=>m==="vector<String>"),K=p.some(m=>{let O=n[m];return O==="string"||O==="String"}),P=K?`
250
- use std::ascii::{String, into_bytes};`:x||C?`
251
- use std::ascii::String;`:"",a=K?`
252
- use std::ascii::{string, String, into_bytes};`:x||C?`
253
- use std::ascii::String;`:"";if(o||h)return`module ${e}::${t} {${E}${P}
254
- ${k}${D}
247
+ }`}function de(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function ot(e,t,s){let n=s.fields,r=s.keys||[],i=s.offchain||!1,d=s.global||!1,l=i?"Offchain":"Onchain",u=d,_=Pe(u),g=Re(u),y=le(e,u),o=Object.keys(n).every(m=>r.includes(m)),b=Object.entries(n).filter(([m])=>!r.includes(m)),p=b.map(([m])=>m),h=p.length===1,a=b.filter(([m,C])=>!B(C)&&C!=="string"&&C!=="String").map(([m,C])=>({type:C,module:`${de(C)}`})).filter((m,C,W)=>W.findIndex(Y=>Y.type===m.type)===C),$=Object.entries(n).filter(([m,C])=>!B(C)&&C!=="string"&&C!=="String").map(([m,C])=>({type:C,module:`${de(C)}`})).filter((m,C,W)=>W.findIndex(Y=>Y.type===m.type)===C),x=it(e,t,n,r,!o&&!h,a,l,u,_,g,y),k=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",T=s.reactive?`
248
+ use dubhe::dapp_service::ScenePermit;`:"",w=Object.values(n),A=p.filter(m=>{let C=n[m];return B(C)||C==="string"||C==="String"}).length>0||r.length>0?`
249
+ use sui::bcs::{to_bytes};`:"",D=w.some(m=>m==="string"||m==="String"),v=w.some(m=>m==="vector<String>"),K=p.some(m=>{let C=n[m];return C==="string"||C==="String"}),P=K?`
250
+ use std::ascii::{String, into_bytes};`:D||v?`
251
+ use std::ascii::String;`:"",c=K?`
252
+ use std::ascii::{string, String, into_bytes};`:D||v?`
253
+ use std::ascii::String;`:"";if(o||h)return`module ${e}::${t} {${A}${P}
254
+ ${k}${T}
255
255
  use dubhe::dapp_system;
256
256
  use ${e}::dapp_key;
257
257
  use ${e}::dapp_key::DappKey;
258
- ${_.length>0?_.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
258
+ ${$.length>0?$.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
259
259
  `):""}
260
260
 
261
261
  const TABLE_NAME: vector<u8> = b"${t}";
262
262
  const OFFCHAIN: bool = ${i};
263
263
 
264
- ${v}
265
- }`;let y=p.map(m=>` ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]},`).join(`
266
- `),S=p.map(m=>`${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]}`).join(", "),T=p.map(m=>` ${m},`).join(`
264
+ ${x}
265
+ }`;let f=p.map(m=>` ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]},`).join(`
266
+ `),S=p.map(m=>`${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]}`).join(", "),j=p.map(m=>` ${m},`).join(`
267
267
  `),M=p.map(m=>` public fun ${m}(self: &${I(t)}): ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]} {
268
268
  self.${m}
269
269
  }`).join(`
270
270
 
271
- `),J=p.map(m=>` public fun update_${m}(self: &mut ${I(t)}, ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]}) {
271
+ `),ee=p.map(m=>` public fun update_${m}(self: &mut ${I(t)}, ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]}) {
272
272
  self.${m} = ${m}
273
273
  }`).join(`
274
274
 
275
- `);return`module ${e}::${t} {${E}${a}
276
- ${k}${D}
275
+ `);return`module ${e}::${t} {${A}${c}
276
+ ${k}${T}
277
277
  use dubhe::dapp_system;
278
278
  use ${e}::dapp_key;
279
279
  use ${e}::dapp_key::DappKey;
280
- ${_.length>0?_.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
280
+ ${$.length>0?$.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
281
281
  `):""}
282
282
 
283
283
  const TABLE_NAME: vector<u8> = b"${t}";
284
284
  const OFFCHAIN: bool = ${i};
285
285
 
286
286
  public struct ${I(t)} has copy, drop, store {
287
- ${y}
287
+ ${f}
288
288
  }
289
289
 
290
290
  public fun new(${S}): ${I(t)} {
291
291
  ${I(t)} {
292
- ${T}
292
+ ${j}
293
293
  }
294
294
  }
295
295
 
296
296
  ${M}
297
297
 
298
- ${J}
298
+ ${ee}
299
299
 
300
- ${v}
301
- }`}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),i=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&&i?`${e}::${i.module}::decode(&mut ${s})`:`sui::bcs::peel_${de(t)}(&mut ${s})`}function Ke(e,t,s,n,r,i,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(`
302
- `)}function nt(e,t,s,n,r=!0,i=[],d="Onchain",l=!1,u="UserStorage",$="user_storage",g=pe("dubhe",!1)){let f=Object.entries(s).filter(([a])=>!n.includes(a)).reduce((a,[y,S])=>({...a,[y]:S}),{}),o=Object.keys(f),b=Object.keys(s).every(a=>n.includes(a)),p=o.length===1,h=d==="Offchain",c=n.length>0?n.map(a=>`${a}: ${s[a]}`).join(", "):"",_=n.length>0?`let mut key_tuple = vector::empty();
300
+ ${x}
301
+ }`}function B(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 J(e,t,s,n){let r=!B(t),i=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&&i?`${e}::${i.module}::decode(&mut ${s})`:`sui::bcs::peel_${ge(t)}(&mut ${s})`}function Ue(e,t,s,n,r,i,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} = ${J(e,r,u,d)};`].join(`
302
+ `)}function it(e,t,s,n,r=!0,i=[],d="Onchain",l=!1,u="UserStorage",_="user_storage",g=le("dubhe",!1)){let y=Object.entries(s).filter(([c])=>!n.includes(c)).reduce((c,[f,S])=>({...c,[f]:S}),{}),o=Object.keys(y),b=Object.keys(s).every(c=>n.includes(c)),p=o.length===1,h=d==="Offchain",a=n.length>0?n.map(c=>`${c}: ${s[c]}`).join(", "):"",$=n.length>0?`let mut key_tuple = vector::empty();
303
303
  key_tuple.push_back(TABLE_NAME);
304
- ${n.map(a=>`key_tuple.push_back(to_bytes(&${a}));`).join(`
304
+ ${n.map(c=>`key_tuple.push_back(to_bytes(&${c}));`).join(`
305
305
  `)}`:`let mut key_tuple = vector::empty();
306
- key_tuple.push_back(TABLE_NAME);`,v=l?"":", ctx: &mut TxContext",k=l?"":", ctx",D=h?"":` public fun has(${$}: &${u}${c?", ":""}${c}): bool {
307
- ${_}
308
- ${g.has_record}<DappKey>(${$}, key_tuple)
306
+ key_tuple.push_back(TABLE_NAME);`,x=l?"":", ctx: &mut TxContext",k=l?"":", ctx",T=h?"":` public fun has(${_}: &${u}${a?", ":""}${a}): bool {
307
+ ${$}
308
+ ${g.has_record}<DappKey>(${_}, key_tuple)
309
309
  }
310
310
 
311
- public fun ensure_has(${$}: &${u}${c?", ":""}${c}) {
312
- ${_}
313
- ${g.ensure_has}<DappKey>(${$}, key_tuple)
311
+ public fun ensure_has(${_}: &${u}${a?", ":""}${a}) {
312
+ ${$}
313
+ ${g.ensure_has}<DappKey>(${_}, key_tuple)
314
314
  }
315
315
 
316
- public fun ensure_has_not(${$}: &${u}${c?", ":""}${c}) {
317
- ${_}
318
- ${g.ensure_has_not}<DappKey>(${$}, key_tuple)
316
+ public fun ensure_has_not(${_}: &${u}${a?", ":""}${a}) {
317
+ ${$}
318
+ ${g.ensure_has_not}<DappKey>(${_}, key_tuple)
319
319
  }
320
- `,w=`vector[${o.map(a=>`b"${a}"`).join(", ")}]`,F=h?"":` public(package) fun delete(${$}: &mut ${u}${c?", ":""}${c}${l?"":", ctx: &TxContext"}) {
321
- ${_}
322
- ${g.delete_record}<DappKey>(${R(e)}${$}, key_tuple, ${w}${l?"":", ctx"});
323
- }`,j=!p&&!h?o.map(a=>{let y=s[a],S=!z(y),T=S?i.find(M=>M.type===y):null;return` public fun get_${a}(${$}: &${u}${c?", ":""}${c}): ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y} {
324
- ${_}
325
- let ${a}_raw = ${g.get_field}<DappKey>(${$}, key_tuple, b"${a}");
326
- let mut ${a}_bcs = sui::bcs::new(${a}_raw);
327
- let ${a} = ${G(e,y,`${a}_bcs`,i)};
328
- ${a}
320
+ `,w=`vector[${o.map(c=>`b"${c}"`).join(", ")}]`,F=h?"":` public(package) fun delete(${_}: &mut ${u}${a?", ":""}${a}${l?"":", ctx: &TxContext"}) {
321
+ ${$}
322
+ ${g.delete_record}<DappKey>(${R(e)}${_}, key_tuple, ${w}${l?"":", ctx"});
323
+ }`,O=!p&&!h?o.map(c=>{let f=s[c],S=!B(f),j=S?i.find(M=>M.type===f):null;return` public fun get_${c}(${_}: &${u}${a?", ":""}${a}): ${f==="string"||f==="String"?"String":f==="vector<String>"?"vector<String>":f} {
324
+ ${$}
325
+ let ${c}_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"${c}");
326
+ let mut ${c}_bcs = sui::bcs::new(${c}_raw);
327
+ let ${c} = ${J(e,f,`${c}_bcs`,i)};
328
+ ${c}
329
329
  }
330
330
 
331
- public(package) fun set_${a}(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${a}: ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y}${v}) {
332
- ${_}
333
- let value = ${y==="string"||y==="String"?`to_bytes(&into_bytes(${a}))`:y==="vector<String>"?`to_bytes(&${a})`:S?`${e}::${T?.module}::encode(${a})`:`to_bytes(&${a})`};
334
- ${g.set_field}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, b"${a}", value${k});
331
+ public(package) fun set_${c}(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c}: ${f==="string"||f==="String"?"String":f==="vector<String>"?"vector<String>":f}${x}) {
332
+ ${$}
333
+ let value = ${f==="string"||f==="String"?`to_bytes(&into_bytes(${c}))`:f==="vector<String>"?`to_bytes(&${c})`:S?`${e}::${j?.module}::encode(${c})`:`to_bytes(&${c})`};
334
+ ${g.set_field}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, b"${c}", value${k});
335
335
  }`}).join(`
336
336
 
337
- `):"",E=`vector[${o.map(a=>`b"${a}"`).join(", ")}]`,x=b?` public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}${v}) {
338
- ${_}
337
+ `):"",A=`vector[${o.map(c=>`b"${c}"`).join(", ")}]`,D=b?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}${x}) {
338
+ ${$}
339
339
  let field_names: vector<vector<u8>> = vector[];
340
340
  let value_tuple: vector<vector<u8>> = vector[];
341
- ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
342
- }`:p?h?` public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}${v}) {
343
- ${_}
341
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
342
+ }`:p?h?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"String":Object.values(y)[0]}${x}) {
343
+ ${$}
344
344
  let field_names = vector[b"${o[0]}"];
345
345
  let value_tuple = encode(value);
346
- ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
347
- }`:` public fun get(${$}: &${u}${c?", ":""}${c}): ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]} {
348
- ${_}
349
- let ${o[0]}_raw = ${g.get_field}<DappKey>(${$}, key_tuple, b"${o[0]}");
346
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
347
+ }`:` public fun get(${_}: &${u}${a?", ":""}${a}): ${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"String":Object.values(y)[0]} {
348
+ ${$}
349
+ let ${o[0]}_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"${o[0]}");
350
350
  let mut ${o[0]}_bcs = sui::bcs::new(${o[0]}_raw);
351
- let value = ${G(e,Object.values(f)[0],`${o[0]}_bcs`,i)};
351
+ let value = ${J(e,Object.values(y)[0],`${o[0]}_bcs`,i)};
352
352
  value
353
353
  }
354
354
 
355
- public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}${v}) {
356
- ${_}
355
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"String":Object.values(y)[0]}${x}) {
356
+ ${$}
357
357
  let field_names = vector[b"${o[0]}"];
358
358
  let value_tuple = encode(value);
359
- ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
360
- }`:h?` public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}${v}) {
361
- ${_}
362
- let field_names = ${E};
359
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
360
+ }`:h?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${o.map(c=>`${c}: ${s[c]==="string"||s[c]==="String"?"String":s[c]}`).join(", ")}${x}) {
361
+ ${$}
362
+ let field_names = ${A};
363
363
  let value_tuple = encode(${o.join(", ")});
364
- ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
365
- }`:` public fun get(${$}: &${u}${c?", ":""}${c}): (${Object.values(f).map(a=>a==="string"||a==="String"?"String":a).join(", ")}) {
366
- ${_}
367
- ${o.map((a,y)=>Ke(e,g,$,a,s[a],y,i)).join(`
364
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
365
+ }`:` public fun get(${_}: &${u}${a?", ":""}${a}): (${Object.values(y).map(c=>c==="string"||c==="String"?"String":c).join(", ")}) {
366
+ ${$}
367
+ ${o.map((c,f)=>Ue(e,g,_,c,s[c],f,i)).join(`
368
368
  `)}
369
369
  (${o.join(", ")})
370
370
  }
371
371
 
372
- public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}${v}) {
373
- ${_}
374
- let field_names = ${E};
372
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${o.map(c=>`${c}: ${s[c]==="string"||s[c]==="String"?"String":s[c]}`).join(", ")}${x}) {
373
+ ${$}
374
+ let field_names = ${A};
375
375
  let value_tuple = encode(${o.join(", ")});
376
- ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
377
- }`,C=r?h?` public(package) fun set_struct(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
378
- ${_}
379
- let field_names = ${E};
376
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
377
+ }`,v=r?h?` public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${I(t)}${x}) {
378
+ ${$}
379
+ let field_names = ${A};
380
380
  let value_tuple = encode_struct(${t});
381
- ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
382
- }`:` public fun get_struct(${$}: &${u}${c?", ":""}${c}): ${I(t)} {
383
- ${_}
384
- ${o.map((a,y)=>Ke(e,g,$,a,s[a],y,i)).join(`
381
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
382
+ }`:` public fun get_struct(${_}: &${u}${a?", ":""}${a}): ${I(t)} {
383
+ ${$}
384
+ ${o.map((c,f)=>Ue(e,g,_,c,s[c],f,i)).join(`
385
385
  `)}
386
386
  ${I(t)} { ${o.join(", ")} }
387
387
  }
388
388
 
389
- public(package) fun set_struct(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
390
- ${_}
391
- let field_names = ${E};
389
+ public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${I(t)}${x}) {
390
+ ${$}
391
+ let field_names = ${A};
392
392
  let value_tuple = encode_struct(${t});
393
- ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
394
- }`:"",K=p?` public fun encode(value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}): vector<vector<u8>> {
393
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
394
+ }`:"",K=p?` public fun encode(value: ${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"String":Object.values(y)[0]}): vector<vector<u8>> {
395
395
  let mut value_tuple = vector::empty();
396
- value_tuple.push_back(${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(f)[0]==="vector<String>"||z(Object.values(f)[0])?"to_bytes(&value)":`${e}::${i.find(a=>a.type===Object.values(f)[0])?.module}::encode(value)`});
396
+ value_tuple.push_back(${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(y)[0]==="vector<String>"||B(Object.values(y)[0])?"to_bytes(&value)":`${e}::${i.find(c=>c.type===Object.values(y)[0])?.module}::encode(value)`});
397
397
  value_tuple
398
- }`:r?h?` public fun encode(${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}): vector<vector<u8>> {
398
+ }`:r?h?` public fun encode(${o.map(c=>`${c}: ${s[c]==="string"||s[c]==="String"?"String":s[c]}`).join(", ")}): vector<vector<u8>> {
399
399
  let mut value_tuple = vector::empty();
400
- ${o.map(a=>{let y=s[a],S=!z(y),T=S?i.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${a}))`:y==="vector<String>"?`to_bytes(&${a})`:S?`${e}::${T?.module}::encode(${a})`:`to_bytes(&${a})`});`}).join(`
400
+ ${o.map(c=>{let f=s[c],S=!B(f),j=S?i.find(M=>M.type===f):null;return`value_tuple.push_back(${f==="string"||f==="String"?`to_bytes(&into_bytes(${c}))`:f==="vector<String>"?`to_bytes(&${c})`:S?`${e}::${j?.module}::encode(${c})`:`to_bytes(&${c})`});`}).join(`
401
401
  `)}
402
402
  value_tuple
403
403
  }
404
404
 
405
405
  public fun encode_struct(${t}: ${I(t)}): vector<vector<u8>> {
406
- encode(${o.map(a=>`${t}.${a}`).join(", ")})
407
- }`:` public fun encode(${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}): vector<vector<u8>> {
406
+ encode(${o.map(c=>`${t}.${c}`).join(", ")})
407
+ }`:` public fun encode(${o.map(c=>`${c}: ${s[c]==="string"||s[c]==="String"?"String":s[c]}`).join(", ")}): vector<vector<u8>> {
408
408
  let mut value_tuple = vector::empty();
409
- ${o.map(a=>{let y=s[a],S=!z(y),T=S?i.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${a}))`:y==="vector<String>"?`to_bytes(&${a})`:S?`${e}::${T?.module}::encode(${a})`:`to_bytes(&${a})`});`}).join(`
409
+ ${o.map(c=>{let f=s[c],S=!B(f),j=S?i.find(M=>M.type===f):null;return`value_tuple.push_back(${f==="string"||f==="String"?`to_bytes(&into_bytes(${c}))`:f==="vector<String>"?`to_bytes(&${c})`:S?`${e}::${j?.module}::encode(${c})`:`to_bytes(&${c})`});`}).join(`
410
410
  `)}
411
411
  value_tuple
412
412
  }
413
413
 
414
414
  public fun encode_struct(${t}: ${I(t)}): vector<vector<u8>> {
415
- encode(${o.map(a=>`${t}.${a}`).join(", ")})
415
+ encode(${o.map(c=>`${t}.${c}`).join(", ")})
416
416
  }
417
417
 
418
418
  public fun decode(data: vector<u8>): ${I(t)} {
419
419
  let mut bcs_type = sui::bcs::new(data);
420
- ${o.map(a=>{let y=s[a],S=!z(y),T=S?i.find(M=>M.type===y):null;return`let ${a} = ${y==="string"||y==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":y==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":S?`${e}::${T?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${de(y)}(&mut bcs_type)`};`}).join(`
420
+ ${o.map(c=>{let f=s[c],S=!B(f),j=S?i.find(M=>M.type===f):null;return`let ${c} = ${f==="string"||f==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":f==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":S?`${e}::${j?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${ge(f)}(&mut bcs_type)`};`}).join(`
421
421
  `)}
422
422
  ${I(t)} {
423
- ${o.map(a=>`${a},`).join(`
423
+ ${o.map(c=>`${c},`).join(`
424
424
  `)}
425
425
  }
426
- }`:"";return[D,F,j,x,C,K].filter(a=>a.trim().length>0).join(`
426
+ }`:"";return[T,F,O,D,v,K].filter(c=>c.trim().length>0).join(`
427
427
 
428
- `)}function I(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function de(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${de(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 ot(e,t,s){let n=[],r=e.name,i=Ie(r),d=R(r),l=s.fields,u=s.keys??[],$=Object.entries(l).filter(([o])=>!u.includes(o)),g=$.map(([o])=>o),f=u.length>0?u.map(o=>`${o}: ${l[o]}`).join(", "):"";if(s.fungible&&g.length===1){let[o,b]=$[0];n.push(`
428
+ `)}function I(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ge(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${ge(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 at(e,t,s){let n=[],r=e.name,i=Me(r),d=R(r),l=s.fields,u=s.keys??[],_=Object.entries(l).filter(([o])=>!u.includes(o)),g=_.map(([o])=>o),y=u.length>0?u.map(o=>`${o}: ${l[o]}`).join(", "):"";if(s.fungible&&g.length===1){let[o,b]=_[0];n.push(`
429
429
  // \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
430
430
  #[error]
431
431
  const EInsufficientAmount: vector<u8> = b"Insufficient amount";
@@ -439,7 +439,7 @@ ${v}
439
439
  let current = get(user_storage);
440
440
  assert!(current >= amount, EInsufficientAmount);
441
441
  set(user_storage, current - amount, ctx);
442
- }`)}if(u.length>0&&!s.offchain&&!s.global){let o=u.map(_=>`${_}: ${l[_]}`).join(", "),b=g.map(_=>`${_}: ${l[_]}`).join(", "),p=[o,b].filter(Boolean).join(", "),h=u.join(", "),c=[...u,...g].join(", ");n.push(`
442
+ }`)}if(u.length>0&&!s.offchain&&!s.global){let o=u.map($=>`${$}: ${l[$]}`).join(", "),b=g.map($=>`${$}: ${l[$]}`).join(", "),p=[o,b].filter(Boolean).join(", "),h=u.join(", "),a=[...u,...g].join(", ");n.push(`
443
443
  // \u2500\u2500\u2500 keys: mint (developer provides keys; framework ensures no duplicate) \u2500
444
444
  // Choosing the ID strategy (fresh address, counter, coordinate pack, etc.)
445
445
  // is intentionally left to the caller.
@@ -449,7 +449,7 @@ ${v}
449
449
  ctx: &mut TxContext,
450
450
  ) {
451
451
  ensure_has_not(user_storage, ${h});
452
- set(user_storage, ${c}, ctx);
452
+ set(user_storage, ${a}, ctx);
453
453
  }`)}if(s.reactive){let o=u.length>0?`let mut key_tuple = vector::empty();
454
454
  key_tuple.push_back(TABLE_NAME);
455
455
  ${u.map(b=>`key_tuple.push_back(sui::bcs::to_bytes(&${b}));`).join(`
@@ -462,29 +462,29 @@ ${v}
462
462
  permit: &ScenePermit<PermType>,
463
463
  from: &mut UserStorage,
464
464
  target: &mut UserStorage,
465
- ${f?f+", ":""}${b},
465
+ ${y?y+", ":""}${b},
466
466
  ctx: &mut TxContext,
467
467
  ) {
468
468
  ${o}
469
469
  let field_names = vector[${g.map(p=>`b"${p}"`).join(", ")}];
470
470
  let value_tuple = encode(${g.join(", ")});
471
471
  ${i}::set_record_reactive<DappKey, PermType>(${d}permit, from, target, key_tuple, field_names, value_tuple, ctx);
472
- }`)}for(let[b,p]of $){let h=p==="string"||p==="String"?`sui::bcs::to_bytes(&std::ascii::into_bytes(${b}))`:`sui::bcs::to_bytes(&${b})`;n.push(`
472
+ }`)}for(let[b,p]of _){let h=p==="string"||p==="String"?`sui::bcs::to_bytes(&std::ascii::into_bytes(${b}))`:`sui::bcs::to_bytes(&${b})`;n.push(`
473
473
  public(package) fun set_${b}_reactive<PermType>(
474
474
  permit: &ScenePermit<PermType>,
475
475
  from: &mut UserStorage,
476
476
  target: &mut UserStorage,
477
- ${f?f+", ":""}${b}: ${p==="string"||p==="String"?"String":p},
477
+ ${y?y+", ":""}${b}: ${p==="string"||p==="String"?"String":p},
478
478
  ctx: &mut TxContext,
479
479
  ) {
480
480
  ${o}
481
481
  let value = ${h};
482
482
  ${i}::set_field_reactive<DappKey, PermType>(${d}permit, from, target, key_tuple, b"${b}", value, ctx);
483
- }`)}}if(s.transferable){let o=e.objects??{},b=e.scenes??{},p=!!s.fungible,h=!p&&u.length>0,c=h?u[0]:null;for(let[_,v]of Object.entries(o)){if(!(v.accepts??[]).includes(t))continue;let k=I(_),D=`dubhe::dapp_service::ObjectStorage<${r}::${_}::${k}>`,w=_;if(p&&g.length===1){let[,F]=$[0];n.push(`
483
+ }`)}}if(s.transferable){let o=e.objects??{},b=e.scenes??{},p=!!s.fungible,h=!p&&u.length>0,a=h?u[0]:null;for(let[$,x]of Object.entries(o)){if(!(x.accepts??[]).includes(t))continue;let k=I($),T=`dubhe::dapp_service::ObjectStorage<${r}::${$}::${k}>`,w=$;if(p&&g.length===1){let[,F]=_[0];n.push(`
484
484
  // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
485
- public(package) fun transfer_user_to_${_}(
485
+ public(package) fun transfer_user_to_${$}(
486
486
  user: &mut UserStorage,
487
- target: &mut ${D},
487
+ target: &mut ${T},
488
488
  amount: ${F},
489
489
  ctx: &mut TxContext,
490
490
  ) {
@@ -492,149 +492,149 @@ ${v}
492
492
  ${r}::${w}::add_${t}(target, amount);
493
493
  }
494
494
 
495
- public(package) fun transfer_${_}_to_user(
496
- source: &mut ${D},
495
+ public(package) fun transfer_${$}_to_user(
496
+ source: &mut ${T},
497
497
  user: &mut UserStorage,
498
498
  amount: ${F},
499
499
  ctx: &mut TxContext,
500
500
  ) {
501
501
  ${r}::${w}::sub_${t}(source, amount);
502
502
  add(user, amount, ctx);
503
- }`)}else if(h&&c)if(g.length===1){let[,F]=$[0],j=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${c})))`:`to_bytes(&get(user, ${c}))`,E=Object.entries(e.enums??{}).map(([C])=>({type:I(C),module:C})),x=G(r,F,"bcs",E);n.push(`
503
+ }`)}else if(h&&a)if(g.length===1){let[,F]=_[0],O=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,A=Object.entries(e.enums??{}).map(([v])=>({type:I(v),module:v})),D=J(r,F,"bcs",A);n.push(`
504
504
  // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
505
- public(package) fun transfer_user_to_${_}(
505
+ public(package) fun transfer_user_to_${$}(
506
506
  user: &mut UserStorage,
507
- target: &mut ${D},
508
- ${c}: u64,
507
+ target: &mut ${T},
508
+ ${a}: u64,
509
509
  ctx: &TxContext,
510
510
  ) {
511
- ensure_has(user, ${c});
511
+ ensure_has(user, ${a});
512
512
  // Guard before any mutation: abort if target already holds this item.
513
- dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
514
- let raw = ${j};
515
- delete(user, ${c}, ctx);
516
- ${r}::${w}::set_${t}_data(target, ${c}, raw);
513
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
514
+ let raw = ${O};
515
+ delete(user, ${a}, ctx);
516
+ ${r}::${w}::set_${t}_data(target, ${a}, raw);
517
517
  }
518
518
 
519
- public(package) fun transfer_${_}_to_user(
520
- source: &mut ${D},
519
+ public(package) fun transfer_${$}_to_user(
520
+ source: &mut ${T},
521
521
  user: &mut UserStorage,
522
- ${c}: u64,
522
+ ${a}: u64,
523
523
  ctx: &mut TxContext,
524
524
  ) {
525
525
  // Guard before any mutation: abort if user already owns this item.
526
- ensure_has_not(user, ${c});
527
- let raw = ${r}::${w}::remove_${t}_data(source, ${c});
526
+ ensure_has_not(user, ${a});
527
+ let raw = ${r}::${w}::remove_${t}_data(source, ${a});
528
528
  let mut bcs = sui::bcs::new(raw);
529
- let value = ${x};
530
- set(user, ${c}, value, ctx);
529
+ let value = ${D};
530
+ set(user, ${a}, value, ctx);
531
531
  }`)}else n.push(`
532
532
  // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed, multi-field) \u2500\u2500
533
- public(package) fun transfer_user_to_${_}(
533
+ public(package) fun transfer_user_to_${$}(
534
534
  user: &mut UserStorage,
535
- target: &mut ${D},
536
- ${c}: u64,
535
+ target: &mut ${T},
536
+ ${a}: u64,
537
537
  ctx: &TxContext,
538
538
  ) {
539
- ensure_has(user, ${c});
539
+ ensure_has(user, ${a});
540
540
  // Guard before any mutation: abort if target already holds this item.
541
- dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
542
- let data = encode_struct(get_struct(user, ${c}));
543
- delete(user, ${c}, ctx);
541
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
542
+ let data = encode_struct(get_struct(user, ${a}));
543
+ delete(user, ${a}, ctx);
544
544
  let raw: vector<u8> = sui::bcs::to_bytes(&data);
545
- ${r}::${w}::set_${t}_data(target, ${c}, raw);
545
+ ${r}::${w}::set_${t}_data(target, ${a}, raw);
546
546
  }
547
547
 
548
- public(package) fun transfer_${_}_to_user(
549
- source: &mut ${D},
548
+ public(package) fun transfer_${$}_to_user(
549
+ source: &mut ${T},
550
550
  user: &mut UserStorage,
551
- ${c}: u64,
551
+ ${a}: u64,
552
552
  ctx: &mut TxContext,
553
553
  ) {
554
554
  // Guard before any mutation: abort if user already owns this item.
555
- ensure_has_not(user, ${c});
556
- let raw = ${r}::${w}::remove_${t}_data(source, ${c});
555
+ ensure_has_not(user, ${a});
556
+ let raw = ${r}::${w}::remove_${t}_data(source, ${a});
557
557
  let decoded = decode(raw);
558
- set_struct(user, ${c}, decoded, ctx);
559
- }`)}for(let[_,v]of Object.entries(b)){if(!(v.accepts??[]).includes(t))continue;let k=I(_),D=`dubhe::dapp_service::SceneStorage<${r}::${_}::${k}>`,w=_,F=v.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${v.authorization.permit}::${I(v.authorization.permit)}>`:"",j=v.authorization.kind==="permit"?` permit: &${F},
560
- `:"",E=v.authorization.kind==="permit"?"permit, ":"",x=v.authorization.kind==="permit"?", ctx":"";if(p&&g.length===1){let[,C]=$[0];n.push(`
558
+ set_struct(user, ${a}, decoded, ctx);
559
+ }`)}for(let[$,x]of Object.entries(b)){if(!(x.accepts??[]).includes(t))continue;let k=I($),T=`dubhe::dapp_service::SceneStorage<${r}::${$}::${k}>`,w=$,F=x.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${x.authorization.permit}::${I(x.authorization.permit)}>`:"",O=x.authorization.kind==="permit"?` permit: &${F},
560
+ `:"",A=x.authorization.kind==="permit"?"permit, ":"",D=x.authorization.kind==="permit"?"user, ":"",v=x.authorization.kind==="permit"?", ctx":"";if(p&&g.length===1){let[,K]=_[0];n.push(`
561
561
  // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
562
- public(package) fun transfer_user_to_${_}(
563
- ${j} user: &mut UserStorage,
564
- target: &mut ${D},
565
- amount: ${C},
562
+ public(package) fun transfer_user_to_${$}(
563
+ ${O} user: &mut UserStorage,
564
+ target: &mut ${T},
565
+ amount: ${K},
566
566
  ctx: &mut TxContext,
567
567
  ) {
568
568
  sub(user, amount, ctx);
569
- ${r}::${w}::add_${t}(${E}target, amount${x});
569
+ ${r}::${w}::add_${t}(${A}target, ${D}amount${v});
570
570
  }
571
571
 
572
572
  // \u2605 No expiry check on withdraw direction \u2014 prevents asset lock-in expired scenes.
573
- public(package) fun transfer_${_}_to_user(
574
- ${j} source: &mut ${D},
573
+ public(package) fun transfer_${$}_to_user(
574
+ ${O} source: &mut ${T},
575
575
  user: &mut UserStorage,
576
- amount: ${C},
576
+ amount: ${K},
577
577
  ctx: &mut TxContext,
578
578
  ) {
579
- ${r}::${w}::sub_${t}(${E}source, amount${x});
579
+ ${r}::${w}::sub_${t}(${A}source, ${D}amount${v});
580
580
  add(user, amount, ctx);
581
- }`)}else if(h&&c)if(g.length===1){let[,C]=$[0],K=C==="string"||C==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${c})))`:`to_bytes(&get(user, ${c}))`,P=Object.entries(e.enums??{}).map(([y])=>({type:I(y),module:y})),a=G(r,C,"bcs",P);n.push(`
581
+ }`)}else if(h&&a)if(g.length===1){let[,K]=_[0],P=K==="string"||K==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,c=Object.entries(e.enums??{}).map(([S])=>({type:I(S),module:S})),f=J(r,K,"bcs",c);n.push(`
582
582
  // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
583
- public(package) fun transfer_user_to_${_}(
584
- ${j} user: &mut UserStorage,
585
- target: &mut ${D},
586
- ${c}: u64,
583
+ public(package) fun transfer_user_to_${$}(
584
+ ${O} user: &mut UserStorage,
585
+ target: &mut ${T},
586
+ ${a}: u64,
587
587
  ctx: &TxContext,
588
588
  ) {
589
- ensure_has(user, ${c});
589
+ ensure_has(user, ${a});
590
590
  // Guard before any mutation: abort if target already holds this item.
591
- dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
592
- let raw = ${K};
593
- delete(user, ${c}, ctx);
594
- ${r}::${w}::set_${t}_data(${E}target, ${c}, raw${x});
591
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
592
+ let raw = ${P};
593
+ delete(user, ${a}, ctx);
594
+ ${r}::${w}::set_${t}_data(${A}target, ${D}${a}, raw${v});
595
595
  }
596
596
 
597
- public(package) fun transfer_${_}_to_user(
598
- ${j} source: &mut ${D},
597
+ public(package) fun transfer_${$}_to_user(
598
+ ${O} source: &mut ${T},
599
599
  user: &mut UserStorage,
600
- ${c}: u64,
600
+ ${a}: u64,
601
601
  ctx: &mut TxContext,
602
602
  ) {
603
603
  // Guard before any mutation: abort if user already owns this item.
604
- ensure_has_not(user, ${c});
605
- let raw = ${r}::${w}::remove_${t}_data(${E}source, ${c}${x});
604
+ ensure_has_not(user, ${a});
605
+ let raw = ${r}::${w}::remove_${t}_data(${A}source, ${D}${a}${v});
606
606
  let mut bcs = sui::bcs::new(raw);
607
- let value = ${a};
608
- set(user, ${c}, value, ctx);
607
+ let value = ${f};
608
+ set(user, ${a}, value, ctx);
609
609
  }`)}else n.push(`
610
610
  // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed, multi-field) \u2500
611
- public(package) fun transfer_user_to_${_}(
612
- ${j} user: &mut UserStorage,
613
- target: &mut ${D},
614
- ${c}: u64,
611
+ public(package) fun transfer_user_to_${$}(
612
+ ${O} user: &mut UserStorage,
613
+ target: &mut ${T},
614
+ ${a}: u64,
615
615
  ctx: &TxContext,
616
616
  ) {
617
- ensure_has(user, ${c});
617
+ ensure_has(user, ${a});
618
618
  // Guard before any mutation: abort if target already holds this item.
619
- dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
620
- let data = encode_struct(get_struct(user, ${c}));
621
- delete(user, ${c}, ctx);
619
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
620
+ let data = encode_struct(get_struct(user, ${a}));
621
+ delete(user, ${a}, ctx);
622
622
  let raw: vector<u8> = sui::bcs::to_bytes(&data);
623
- ${r}::${w}::set_${t}_data(${E}target, ${c}, raw${x});
623
+ ${r}::${w}::set_${t}_data(${A}target, ${D}${a}, raw${v});
624
624
  }
625
625
 
626
- public(package) fun transfer_${_}_to_user(
627
- ${j} source: &mut ${D},
626
+ public(package) fun transfer_${$}_to_user(
627
+ ${O} source: &mut ${T},
628
628
  user: &mut UserStorage,
629
- ${c}: u64,
629
+ ${a}: u64,
630
630
  ctx: &mut TxContext,
631
631
  ) {
632
632
  // Guard before any mutation: abort if user already owns this item.
633
- ensure_has_not(user, ${c});
634
- let raw = ${r}::${w}::remove_${t}_data(${E}source, ${c}${x});
633
+ ensure_has_not(user, ${a});
634
+ let raw = ${r}::${w}::remove_${t}_data(${A}source, ${D}${a}${v});
635
635
  let decoded = decode(raw);
636
- set_struct(user, ${c}, decoded, ctx);
637
- }`)}}if(s.listable){let o=!!s.fungible,p=!o&&u.length>0,h=p?u[0]:null,c=`b"${t}"`;if(o&&g.length===1)n.push(`
636
+ set_struct(user, ${a}, decoded, ctx);
637
+ }`)}}if(s.listable){let o=!!s.fungible,p=!o&&u.length>0,h=p?u[0]:null,a=`b"${t}"`;if(o&&g.length===1)n.push(`
638
638
  // \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
639
639
  // Package-level helpers: call these from your system functions.
640
640
  // Add pause checks, access control, and custom logic there.
@@ -648,7 +648,7 @@ ${j} source: &mut ${D},
648
648
  dubhe::dapp_system::take_fungible_record<DappKey, CoinType>(
649
649
  dapp_key::new(),
650
650
  user_storage,
651
- ${c},
651
+ ${a},
652
652
  { let mut k = vector::empty(); k.push_back(TABLE_NAME); k },
653
653
  b"${g[0]}",
654
654
  amount,
@@ -689,26 +689,26 @@ ${j} source: &mut ${D},
689
689
  dubhe::dapp_system::expire_fungible_listing<DappKey, CoinType>(
690
690
  dapp_key::new(), listing, user_storage, ctx
691
691
  );
692
- }`);else if(p&&h){let _=u.map(k=>`${k}: ${l[k]}`).join(`,
693
- `),v=u.map(k=>`record_key.push_back(sui::bcs::to_bytes(&${k}));`).join(`
692
+ }`);else if(p&&h){let $=u.map(k=>`${k}: ${l[k]}`).join(`,
693
+ `),x=u.map(k=>`record_key.push_back(sui::bcs::to_bytes(&${k}));`).join(`
694
694
  `);n.push(`
695
695
  // \u2500\u2500\u2500 listable: market protocol (keyed) \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
696
696
  // Package-level helpers: call these from your system functions.
697
697
  // Add pause checks, access control, and custom logic there.
698
698
  public(package) fun list<CoinType>(
699
699
  user_storage: &mut UserStorage,
700
- ${_},
700
+ ${$},
701
701
  price: u64,
702
702
  listed_until: std::option::Option<u64>,
703
703
  ctx: &mut TxContext,
704
704
  ) {
705
705
  let mut record_key = vector::empty();
706
706
  record_key.push_back(TABLE_NAME);
707
- ${v}
707
+ ${x}
708
708
  dubhe::dapp_system::take_record<DappKey, CoinType>(
709
709
  dapp_key::new(),
710
710
  user_storage,
711
- ${c},
711
+ ${a},
712
712
  record_key,
713
713
  vector[${g.map(k=>`b"${k}"`).join(", ")}],
714
714
  price,
@@ -749,7 +749,7 @@ ${j} source: &mut ${D},
749
749
  dapp_key::new(), listing, user_storage, ctx
750
750
  );
751
751
  }`)}}return n.join(`
752
- `)}import it 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 at(e){return e==="string"||e==="String"?"String":e}function N(e){return`dubhe::dapp_service::ObjectStorage<${e}>`}function ct(e,t){let s=W(e),n=N(s),r=[];for(let[i,d]of Object.entries(t.fields)){let l=at(d);r.push(`
752
+ `)}import ct from"node:path";function V(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ut(e){return e==="string"||e==="String"?"String":e}function te(e){return`dubhe::dapp_service::ObjectStorage<${e}>`}function pt(e,t){let s=V(e),n=te(s),r=[];for(let[i,d]of Object.entries(t.fields)){let l=ut(d);r.push(`
753
753
  public fun get_${i}(storage: &${n}): ${l} {
754
754
  dubhe::dapp_system::get_object_field<${s}, ${l}>(storage, b"${i}")
755
755
  }
@@ -759,7 +759,7 @@ ${j} source: &mut ${D},
759
759
  dapp_key::new(), storage, b"${i}", value
760
760
  );
761
761
  }`)}return r.join(`
762
- `)}function ut(e,t){let s=W(e),n=N(s);return`
762
+ `)}function dt(e,t){let s=V(e),n=te(s);return`
763
763
  public fun get_${t}(storage: &${n}): u64 {
764
764
  if (dubhe::dapp_system::has_object_field<${s}, u64>(storage, b"${t}")) {
765
765
  dubhe::dapp_system::get_object_field<${s}, u64>(storage, b"${t}")
@@ -779,7 +779,7 @@ ${j} source: &mut ${D},
779
779
  dubhe::dapp_system::set_object_field<DappKey, ${s}, u64>(
780
780
  dapp_key::new(), storage, b"${t}", current - amount
781
781
  );
782
- }`}function pt(e,t,s){let n=W(e),r=N(n);return`
782
+ }`}function lt(e,t,s){let n=V(e),r=te(n);return`
783
783
  public fun has_${t}(storage: &${r}, ${s}: u64): bool {
784
784
  let key = sui::bcs::to_bytes(&${s});
785
785
  dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key)
@@ -802,48 +802,49 @@ ${j} source: &mut ${D},
802
802
  let key = sui::bcs::to_bytes(&${s});
803
803
  assert!(dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key), EFieldNotFound);
804
804
  dubhe::dapp_system::remove_object_field<DappKey, ${n}, vector<u8>>(dapp_key::new(), storage, key)
805
- }`}function dt(e,t,s,n,r){let i=r.resources??{},d=r.objects??{},l=r.scenes??{},u=W(t),$=N(u),g=[],f=[];for(let o of n){let b=d[o]??l[o];if(!b)continue;let p=b.accepts??[],h=W(o);g.push(` use ${e}::${o};`);let c=p.filter(_=>s.includes(_));for(let _ of c){let v=i[_];if(!v||typeof v=="string")continue;let k=v,D=!!l[o],w=`${e}::${o}::${h}`,F=D?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,j=D?l[o]:void 0,E=j?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${j.authorization.permit}::${W(j.authorization.permit)}>`:"",x=j?.authorization.kind==="permit"?` source_permit: &${E},
806
- `:"",C=j?.authorization.kind==="permit"?"source_permit, ":"",K=j?.authorization.kind==="permit"?` ctx: &TxContext,
807
- `:"",P=j?.authorization.kind==="permit"?", ctx":"";if(!k.fungible&&k.keys?.length){let a=k.keys[0];f.push(`
808
- /// Transfer ${_} (keyed item) from ${o} into this ${t}.
809
- public(package) fun transfer_${o}_to_${t}_${_}(
810
- ${x} from: &mut ${F},
811
- to: &mut ${$},
812
- ${a}: u64,
813
- ${K}
805
+ }`}function gt(e,t,s,n,r){let i=r.resources??{},d=r.objects??{},l=r.scenes??{},u=V(t),_=te(u),g=[],y=[];for(let o of n){let b=d[o]??l[o];if(!b)continue;let p=b.accepts??[],h=V(o);g.push(` use ${e}::${o};`);let a=p.filter($=>s.includes($));for(let $ of a){let x=i[$];if(!x||typeof x=="string")continue;let k=x,T=!!l[o],w=`${e}::${o}::${h}`,F=T?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,O=T?l[o]:void 0,A=O?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${O.authorization.permit}::${V(O.authorization.permit)}>`:"",D=O?.authorization.kind==="permit"?` source_permit: &${A},
806
+ `:"",v=O?.authorization.kind==="permit",K=v?"source_permit, ":"",P=v?` user_storage: &dubhe::dapp_service::UserStorage,
807
+ `:"",c=v?"user_storage, ":"",f=v?` ctx: &TxContext,
808
+ `:"",S=v?", ctx":"";if(!k.fungible&&k.keys?.length){let j=k.keys[0];y.push(`
809
+ /// Transfer ${$} (keyed item) from ${o} into this ${t}.
810
+ public(package) fun transfer_${o}_to_${t}_${$}(
811
+ ${D} from: &mut ${F},
812
+ to: &mut ${_},
813
+ ${P} ${j}: u64,
814
+ ${f}
814
815
  ) {
815
- let data = ${o}::remove_${_}_data(${C}from, ${a}${P});
816
- set_${_}_data(to, ${a}, data);
817
- }`)}else f.push(`
818
- /// Transfer ${_} (fungible) from ${o} into this ${t}.
819
- public(package) fun transfer_${o}_to_${t}_${_}(
820
- ${x} from: &mut ${F},
821
- to: &mut ${$},
822
- amount: u64,
823
- ${K}
816
+ let data = ${o}::remove_${$}_data(${K}from, ${c}${j}${S});
817
+ set_${$}_data(to, ${j}, data);
818
+ }`)}else y.push(`
819
+ /// Transfer ${$} (fungible) from ${o} into this ${t}.
820
+ public(package) fun transfer_${o}_to_${t}_${$}(
821
+ ${D} from: &mut ${F},
822
+ to: &mut ${_},
823
+ ${P} amount: u64,
824
+ ${f}
824
825
  ) {
825
- ${o}::sub_${_}(${C}from, amount${P});
826
- add_${_}(to, amount);
827
- }`)}}return{imports:g,functions:f}}async function Re(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
828
- \u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=W(r),l=`${d}Storage`,u=`b"${r}"`,$=ct(r,i),g=i.accepts??[],f=[];for(let S of g){let T=n[S];if(!T||typeof T=="string")continue;let M=T;!M.fungible&&M.keys?.length?f.push(pt(r,S,M.keys[0])):f.push(ut(r,S))}let{imports:o,functions:b}=dt(s,r,g,i.acceptsFrom??[],e),p=i.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",h=`dubhe::dapp_service::ObjectStorage<${d}>`,c=`
826
+ ${o}::sub_${$}(${K}from, ${c}amount${S});
827
+ add_${$}(to, amount);
828
+ }`)}}return{imports:g,functions:y}}async function Be(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
829
+ \u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=V(r),l=`${d}Storage`,u=`b"${r}"`,_=pt(r,i),g=i.accepts??[],y=[];for(let S of g){let j=n[S];if(!j||typeof j=="string")continue;let M=j;!M.fungible&&M.keys?.length?y.push(lt(r,S,M.keys[0])):y.push(dt(r,S))}let{imports:o,functions:b}=gt(s,r,g,i.acceptsFrom??[],e),p=i.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",h=`dubhe::dapp_service::ObjectStorage<${d}>`,a=`
829
830
  public fun assert_${r}_id(storage: &${h}, expected: vector<u8>) {
830
831
  assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);
831
- }`,_=`
832
+ }`,$=`
832
833
  public fun entity_id(storage: &${h}): vector<u8> {
833
834
  *dubhe::dapp_service::object_storage_entity_id(storage)
834
- }`,D=Object.values(i.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
835
- use std::ascii::String;`:"",w=g.some(S=>{let T=n[S];return!T||typeof T=="string"?!1:!!T.keys?.length&&!T.fungible}),F=g.some(S=>{let T=n[S];return!T||typeof T=="string"?!1:!!T.fungible}),j=w,E=F,x=w,C=!!i.adminOnly,K=[j?` #[error]
836
- const EFieldNotFound: vector<u8> = b"Field not found";`:"",E?` #[error]
837
- const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",x?` #[error]
835
+ }`,T=Object.values(i.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
836
+ use std::ascii::String;`:"",w=g.some(S=>{let j=n[S];return!j||typeof j=="string"?!1:!!j.keys?.length&&!j.fungible}),F=g.some(S=>{let j=n[S];return!j||typeof j=="string"?!1:!!j.fungible}),O=w,A=F,D=w,v=!!i.adminOnly,K=[O?` #[error]
837
+ const EFieldNotFound: vector<u8> = b"Field not found";`:"",A?` #[error]
838
+ const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",D?` #[error]
838
839
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:"",` #[error]
839
- const EWrongEntityId: vector<u8> = b"Wrong entity id";`,C?` #[error]
840
+ const EWrongEntityId: vector<u8> = b"Wrong entity id";`,v?` #[error]
840
841
  const ENoPermission: vector<u8> = b"Caller does not have permission";`:""].filter(Boolean).join(`
841
842
  `),P=o.length>0?`
842
843
  `+o.join(`
843
- `):"",a=`dubhe::dapp_service::ObjectStorage<${d}>`,y=`module ${s}::${r} {
844
+ `):"",c=`dubhe::dapp_service::ObjectStorage<${d}>`,f=`module ${s}::${r} {
844
845
  use dubhe::dapp_service::DappStorage;
845
846
  use ${s}::dapp_key;
846
- use ${s}::dapp_key::DappKey;${D}${P}
847
+ use ${s}::dapp_key::DappKey;${T}${P}
847
848
 
848
849
  // \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
849
850
  ${K}
@@ -857,15 +858,15 @@ ${K}
857
858
  public struct ${d} has copy, drop {}
858
859
 
859
860
  // \u2500\u2500\u2500 ID / entity accessors \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
860
- ${_}
861
+ ${$}
861
862
 
862
- ${c}
863
+ ${a}
863
864
 
864
865
  // \u2500\u2500\u2500 Field accessors (own fields) \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
865
- ${$}
866
+ ${_}
866
867
 
867
868
  // \u2500\u2500\u2500 Bag accessors for accepted resources \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
868
- ${f.join(`
869
+ ${y.join(`
869
870
  `)}
870
871
 
871
872
  // \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
@@ -886,7 +887,7 @@ ${p}
886
887
 
887
888
  public(package) fun destroy_${r}(
888
889
  dapp_storage: &mut DappStorage,
889
- storage: ${a},
890
+ storage: ${c},
890
891
  _ctx: &TxContext,
891
892
  ) {
892
893
  dubhe::dapp_system::destroy_typed_object<DappKey, ${d}>(
@@ -894,8 +895,8 @@ ${p}
894
895
  );
895
896
  }
896
897
  }
897
- `;await A(y,it.join(t,`${r}.move`),"formatAndWriteMove")}}import lt from"node:path";function gt(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function Le(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
898
- \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=gt(n),i=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
898
+ `;await E(f,ct.join(t,`${r}.move`),"formatAndWriteMove")}}import $t from"node:path";function _t(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function ze(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
899
+ \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=_t(n),i=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
899
900
  use dubhe::dapp_service::{Self, DappStorage};
900
901
  use ${s}::dapp_key;
901
902
  use ${s}::dapp_key::DappKey;
@@ -977,26 +978,29 @@ ${p}
977
978
  }
978
979
 
979
980
  public(package) fun accept_${n}(
980
- permit: &mut ${d},
981
- ctx: &TxContext,
981
+ permit: &mut ${d},
982
+ user_storage: &dubhe::dapp_service::UserStorage,
983
+ ctx: &TxContext,
982
984
  ) {
983
985
  dubhe::dapp_system::accept_scene_permit_invitation<DappKey, ${r}>(
984
- dapp_key::new(), permit, ctx
986
+ dapp_key::new(), permit, user_storage, ctx
985
987
  );
986
988
  }
987
989
 
988
990
  public(package) fun join_${n}(
989
- permit: &mut ${d},
990
- ctx: &TxContext,
991
+ permit: &mut ${d},
992
+ user_storage: &dubhe::dapp_service::UserStorage,
993
+ ctx: &TxContext,
991
994
  ) {
992
- dubhe::dapp_system::join_scene_permit<DappKey, ${r}>(dapp_key::new(), permit, ctx);
995
+ dubhe::dapp_system::join_scene_permit<DappKey, ${r}>(dapp_key::new(), permit, user_storage, ctx);
993
996
  }
994
997
 
995
998
  public(package) fun leave_${n}(
996
- permit: &mut ${d},
997
- ctx: &TxContext,
999
+ permit: &mut ${d},
1000
+ user_storage: &dubhe::dapp_service::UserStorage,
1001
+ ctx: &TxContext,
998
1002
  ) {
999
- dubhe::dapp_system::leave_scene_permit<DappKey, ${r}>(dapp_key::new(), permit, ctx);
1003
+ dubhe::dapp_system::leave_scene_permit<DappKey, ${r}>(dapp_key::new(), permit, user_storage, ctx);
1000
1004
  }
1001
1005
 
1002
1006
  public(package) fun expire_${n}(
@@ -1012,19 +1016,20 @@ ${p}
1012
1016
  );
1013
1017
  }
1014
1018
  }
1015
- `;await A(l,lt.join(t,`${n}.move`),"formatAndWriteMove")}}import $t 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 Q(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 X(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${q(e,t)}>`}function mt(e,t,s){let n=Y(t),r=Q(n),i=q(e,s),d=X(e,s),l=[];for(let[u,$]of Object.entries(s.fields)){let g=_t($);s.authorization.kind==="permit"&&i&&d?l.push(`
1019
+ `;await E(l,$t.join(t,`${n}.move`),"formatAndWriteMove")}}import mt from"node:path";function G(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function bt(e){return e==="string"||e==="String"?"String":e}function N(e){return`dubhe::dapp_service::SceneStorage<${e}>`}function Z(e,t){if(t.authorization.kind==="permit")return`${e.name}::${t.authorization.permit}::${G(t.authorization.permit)}`}function Q(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${Z(e,t)}>`}function ft(e,t,s){let n=G(t),r=N(n),i=Z(e,s),d=Q(e,s),l=[];for(let[u,_]of Object.entries(s.fields)){let g=bt(_);s.authorization.kind==="permit"&&i&&d?l.push(`
1016
1020
  public fun get_${u}(storage: &${r}): ${g} {
1017
1021
  dubhe::dapp_system::get_scene_field<${n}, ${g}>(storage, b"${u}")
1018
1022
  }
1019
1023
 
1020
1024
  public(package) fun set_${u}(
1021
- permit: &${d},
1022
- storage: &mut ${r},
1023
- value: ${g},
1024
- ctx: &TxContext,
1025
+ permit: &${d},
1026
+ storage: &mut ${r},
1027
+ user_storage: &dubhe::dapp_service::UserStorage,
1028
+ value: ${g},
1029
+ ctx: &TxContext,
1025
1030
  ) {
1026
1031
  dubhe::dapp_system::set_scene_field<DappKey, ${i}, ${n}, ${g}>(
1027
- dapp_key::new(), permit, storage, b"${u}", value, ctx
1032
+ dapp_key::new(), permit, storage, user_storage, b"${u}", value, ctx
1028
1033
  );
1029
1034
  }
1030
1035
 
@@ -1048,17 +1053,18 @@ ${p}
1048
1053
  dapp_key::new(), storage, b"${u}"
1049
1054
  )
1050
1055
  }`)}return l.join(`
1051
- `)}function ee(e,t){let s=X(e,t);return t.authorization.kind!=="permit"||!s?"":` permit: &${s},
1052
- `}function te(e){return e.authorization.kind==="permit"?` ctx: &TxContext,
1053
- `:""}function le(e,t,s,n,r,i){let d=q(e,t);return t.authorization.kind==="permit"&&d?`dubhe::dapp_system::set_scene_field<DappKey, ${d}, ${s}, ${n}>(
1054
- dapp_key::new(), permit, storage, ${r}, ${i}, ctx
1056
+ `)}function se(e,t){let s=Q(e,t);return t.authorization.kind!=="permit"||!s?"":` permit: &${s},
1057
+ `}function re(e){return e.authorization.kind!=="permit"?"":` user_storage: &dubhe::dapp_service::UserStorage,
1058
+ `}function ne(e){return e.authorization.kind==="permit"?` ctx: &TxContext,
1059
+ `:""}function $e(e,t,s,n,r,i){let d=Z(e,t);return t.authorization.kind==="permit"&&d?`dubhe::dapp_system::set_scene_field<DappKey, ${d}, ${s}, ${n}>(
1060
+ dapp_key::new(), permit, storage, user_storage, ${r}, ${i}, ctx
1055
1061
  );`:`dubhe::dapp_system::set_scene_field_system<DappKey, ${s}, ${n}>(
1056
1062
  dapp_key::new(), storage, ${r}, ${i}
1057
- );`}function bt(e,t,s,n,r){let i=q(e,t);return t.authorization.kind==="permit"&&i?`dubhe::dapp_system::remove_scene_field<DappKey, ${i}, ${s}, ${n}>(
1058
- dapp_key::new(), permit, storage, ${r}, ctx
1063
+ );`}function yt(e,t,s,n,r){let i=Z(e,t);return t.authorization.kind==="permit"&&i?`dubhe::dapp_system::remove_scene_field<DappKey, ${i}, ${s}, ${n}>(
1064
+ dapp_key::new(), permit, storage, user_storage, ${r}, ctx
1059
1065
  )`:`dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${s}, ${n}>(
1060
1066
  dapp_key::new(), storage, ${r}
1061
- )`}function ft(e,t,s,n){let r=Y(t),i=Q(r);return`
1067
+ )`}function ht(e,t,s,n){let r=G(t),i=N(r);return`
1062
1068
  public fun get_${n}(storage: &${i}): u64 {
1063
1069
  if (dubhe::dapp_system::has_scene_field<${r}, u64>(storage, b"${n}")) {
1064
1070
  dubhe::dapp_system::get_scene_field<${r}, u64>(storage, b"${n}")
@@ -1066,21 +1072,21 @@ ${p}
1066
1072
  }
1067
1073
 
1068
1074
  public(package) fun add_${n}(
1069
- ${ee(e,s)} storage: &mut ${i},
1070
- amount: u64,
1071
- ${te(s)} ) {
1075
+ ${se(e,s)} storage: &mut ${i},
1076
+ ${re(s)} amount: u64,
1077
+ ${ne(s)} ) {
1072
1078
  let current = get_${n}(storage);
1073
- ${le(e,s,r,"u64",`b"${n}"`,"current + amount")}
1079
+ ${$e(e,s,r,"u64",`b"${n}"`,"current + amount")}
1074
1080
  }
1075
1081
 
1076
1082
  public(package) fun sub_${n}(
1077
- ${ee(e,s)} storage: &mut ${i},
1078
- amount: u64,
1079
- ${te(s)} ) {
1083
+ ${se(e,s)} storage: &mut ${i},
1084
+ ${re(s)} amount: u64,
1085
+ ${ne(s)} ) {
1080
1086
  let current = get_${n}(storage);
1081
1087
  assert!(current >= amount, EInsufficientAmount);
1082
- ${le(e,s,r,"u64",`b"${n}"`,"current - amount")}
1083
- }`}function yt(e,t,s,n,r){let i=Y(t),d=Q(i);return`
1088
+ ${$e(e,s,r,"u64",`b"${n}"`,"current - amount")}
1089
+ }`}function vt(e,t,s,n,r){let i=G(t),d=N(i);return`
1084
1090
  public fun has_${n}(storage: &${d}, ${r}: u64): bool {
1085
1091
  let key = sui::bcs::to_bytes(&${r});
1086
1092
  dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key)
@@ -1092,59 +1098,60 @@ ${te(s)} ) {
1092
1098
  }
1093
1099
 
1094
1100
  public(package) fun set_${n}_data(
1095
- ${ee(e,s)} storage: &mut ${d},
1096
- ${r}: u64,
1101
+ ${se(e,s)} storage: &mut ${d},
1102
+ ${re(s)} ${r}: u64,
1097
1103
  data: vector<u8>,
1098
- ${te(s)} ) {
1104
+ ${ne(s)} ) {
1099
1105
  let key = sui::bcs::to_bytes(&${r});
1100
1106
  assert!(!dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key), EDuplicateItemId);
1101
- ${le(e,s,i,"vector<u8>","key","data")}
1107
+ ${$e(e,s,i,"vector<u8>","key","data")}
1102
1108
  }
1103
1109
 
1104
1110
  public(package) fun remove_${n}_data(
1105
- ${ee(e,s)} storage: &mut ${d},
1106
- ${r}: u64,
1107
- ${te(s)} ): vector<u8> {
1111
+ ${se(e,s)} storage: &mut ${d},
1112
+ ${re(s)} ${r}: u64,
1113
+ ${ne(s)} ): vector<u8> {
1108
1114
  let key = sui::bcs::to_bytes(&${r});
1109
1115
  assert!(dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key), EFieldNotFound);
1110
- ${bt(e,s,i,"vector<u8>","key")}
1111
- }`}function ht(e,t,s,n,r,i){let d=i.resources??{},l=i.objects??{},u=i.scenes??{},$=Y(t),g=Q($),f=[],o=[],b=X(i,s),p=s.authorization.kind==="permit"&&b?` dest_permit: &${b},
1112
- `:"",h=s.authorization.kind==="permit"?"dest_permit, ":"",c=s.authorization.kind==="permit"?` ctx: &TxContext,
1113
- `:"",_=s.authorization.kind==="permit"?", ctx":"";for(let v of r){let k=l[v]??u[v];if(!k)continue;let D=k.accepts??[],w=Y(v);f.push(` use ${e}::${v};`);let F=!!u[v],j=`${e}::${v}::${w}`,E=F?`dubhe::dapp_service::SceneStorage<${j}>`:`dubhe::dapp_service::ObjectStorage<${j}>`,x=F?k:void 0,C=x?X(i,x):void 0,K=x?.authorization.kind==="permit"&&C?` source_permit: &${C},
1114
- `:"",P=x?.authorization.kind==="permit"?"source_permit, ":"",a=x?.authorization.kind==="permit"?", ctx":"",y=D.filter(S=>n.includes(S));for(let S of y){let T=d[S];if(!T||typeof T=="string")continue;let M=T;if(!M.fungible&&M.keys?.length){let J=M.keys[0];o.push(`
1115
- public(package) fun transfer_${v}_to_${t}_${S}(
1116
- ${K}${p} from: &mut ${E},
1116
+ ${yt(e,s,i,"vector<u8>","key")}
1117
+ }`}function kt(e,t,s,n,r,i){let d=i.resources??{},l=i.objects??{},u=i.scenes??{},_=G(t),g=N(_),y=[],o=[],b=Q(i,s),p=s.authorization.kind==="permit"&&b?` dest_permit: &${b},
1118
+ `:"",h=s.authorization.kind==="permit"?"dest_permit, ":"",a=s.authorization.kind==="permit"?", ctx":"";for(let $ of r){let x=l[$]??u[$];if(!x)continue;let k=x.accepts??[],T=G($);y.push(` use ${e}::${$};`);let w=!!u[$],F=`${e}::${$}::${T}`,O=w?`dubhe::dapp_service::SceneStorage<${F}>`:`dubhe::dapp_service::ObjectStorage<${F}>`,A=w?x:void 0,D=A?Q(i,A):void 0,v=A?.authorization.kind==="permit"&&!!D,K=v?` source_permit: &${D},
1119
+ `:"",P=v?"source_permit, ":"",c=v?"user_storage, ":"",f=v?", ctx":"",S=s.authorization.kind==="permit",j=S?"user_storage, ":"",M=v||S?` user_storage: &dubhe::dapp_service::UserStorage,
1120
+ `:"",ee=v||S?` ctx: &TxContext,
1121
+ `:"",m=k.filter(C=>n.includes(C));for(let C of m){let W=d[C];if(!W||typeof W=="string")continue;let Y=W;if(!Y.fungible&&Y.keys?.length){let ae=Y.keys[0];o.push(`
1122
+ public(package) fun transfer_${$}_to_${t}_${C}(
1123
+ ${K}${p} from: &mut ${O},
1117
1124
  to: &mut ${g},
1118
- ${J}: u64,
1119
- ${c} ) {
1120
- let data = ${v}::remove_${S}_data(${P}from, ${J}${a});
1121
- set_${S}_data(${h}to, ${J}, data${_});
1125
+ ${M} ${ae}: u64,
1126
+ ${ee} ) {
1127
+ let data = ${$}::remove_${C}_data(${P}from, ${c}${ae}${f});
1128
+ set_${C}_data(${h}to, ${j}${ae}, data${a});
1122
1129
  }`)}else o.push(`
1123
- public(package) fun transfer_${v}_to_${t}_${S}(
1124
- ${K}${p} from: &mut ${E},
1130
+ public(package) fun transfer_${$}_to_${t}_${C}(
1131
+ ${K}${p} from: &mut ${O},
1125
1132
  to: &mut ${g},
1126
- amount: u64,
1127
- ${c} ) {
1128
- ${v}::sub_${S}(${P}from, amount${a});
1129
- add_${S}(${h}to, amount${_});
1130
- }`)}}return{imports:f,functions:o}}async function ze(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
1131
- \u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=Y(r),l=`b"${r}"`,u=Q(d),$=mt(e,r,i),g=i.accepts??[],f=[];for(let x of g){let C=n[x];if(!C||typeof C=="string")continue;let K=C;!K.fungible&&K.keys?.length?f.push(yt(e,r,i,x,K.keys[0])):f.push(ft(e,r,i,x))}let{imports:o,functions:b}=ht(s,r,i,g,i.acceptsFrom??[],e),c=Object.values(i.fields).some(x=>x==="string"||x==="String"||x==="vector<String>")?`
1132
- use std::ascii::String;`:"",_=g.some(x=>{let C=n[x];return!C||typeof C=="string"?!1:!!C.keys?.length&&!C.fungible}),v=g.some(x=>{let C=n[x];return!C||typeof C=="string"?!1:!!C.fungible}),k=[_?` #[error]
1133
- const EFieldNotFound: vector<u8> = b"Field not found";`:"",v?` #[error]
1134
- const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",_?` #[error]
1133
+ ${M} amount: u64,
1134
+ ${ee} ) {
1135
+ ${$}::sub_${C}(${P}from, ${c}amount${f});
1136
+ add_${C}(${h}to, ${j}amount${a});
1137
+ }`)}}return{imports:y,functions:o}}async function He(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
1138
+ \u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=G(r),l=`b"${r}"`,u=N(d),_=ft(e,r,i),g=i.accepts??[],y=[];for(let D of g){let v=n[D];if(!v||typeof v=="string")continue;let K=v;!K.fungible&&K.keys?.length?y.push(vt(e,r,i,D,K.keys[0])):y.push(ht(e,r,i,D))}let{imports:o,functions:b}=kt(s,r,i,g,i.acceptsFrom??[],e),a=Object.values(i.fields).some(D=>D==="string"||D==="String"||D==="vector<String>")?`
1139
+ use std::ascii::String;`:"",$=g.some(D=>{let v=n[D];return!v||typeof v=="string"?!1:!!v.keys?.length&&!v.fungible}),x=g.some(D=>{let v=n[D];return!v||typeof v=="string"?!1:!!v.fungible}),k=[$?` #[error]
1140
+ const EFieldNotFound: vector<u8> = b"Field not found";`:"",x?` #[error]
1141
+ const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",$?` #[error]
1135
1142
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:""].filter(Boolean).join(`
1136
- `),D=k.length>0?`
1143
+ `),T=k.length>0?`
1137
1144
  // \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
1138
1145
  ${k}
1139
1146
  `:"",w=o.length>0?`
1140
1147
  `+o.join(`
1141
- `):"",F=X(e,i),j=i.authorization.kind==="permit"&&F?`
1148
+ `):"",F=Q(e,i),O=i.authorization.kind==="permit"&&F?`
1142
1149
  public(package) fun new_${r}_with_permit(
1143
1150
  dapp_storage: &DappStorage,
1144
1151
  permit: &${F},
1145
1152
  ctx: &mut TxContext,
1146
1153
  ): ${u} {
1147
- dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${q(e,i)}, ${d}>(
1154
+ dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${Z(e,i)}, ${d}>(
1148
1155
  dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
1149
1156
  )
1150
1157
  }
@@ -1154,7 +1161,7 @@ ${k}
1154
1161
  permit: &${F},
1155
1162
  ctx: &mut TxContext,
1156
1163
  ) {
1157
- dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${q(e,i)}, ${d}>(
1164
+ dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${Z(e,i)}, ${d}>(
1158
1165
  dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
1159
1166
  );
1160
1167
  }`:`
@@ -1174,21 +1181,21 @@ ${k}
1174
1181
  dubhe::dapp_system::create_and_share_typed_scene_system<DappKey, ${d}>(
1175
1182
  dapp_key::new(), dapp_storage, SCENE_TYPE, ctx
1176
1183
  );
1177
- }`,E=`module ${s}::${r} {
1184
+ }`,A=`module ${s}::${r} {
1178
1185
  use dubhe::dapp_service::DappStorage;
1179
1186
  use ${s}::dapp_key;
1180
- use ${s}::dapp_key::DappKey;${c}${w}
1181
- ${D}
1187
+ use ${s}::dapp_key::DappKey;${a}${w}
1188
+ ${T}
1182
1189
  const SCENE_TYPE: vector<u8> = ${l};
1183
1190
 
1184
1191
  /// Phantom type that distinguishes this scene storage at compile time.
1185
1192
  public struct ${d} has copy, drop {}
1186
1193
 
1187
1194
  // \u2500\u2500\u2500 Field accessors (own fields) \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
1188
- ${$}
1195
+ ${_}
1189
1196
 
1190
1197
  // \u2500\u2500\u2500 Bag accessors for accepted resources \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
1191
- ${f.join(`
1198
+ ${y.join(`
1192
1199
  `)}
1193
1200
 
1194
1201
  // \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
@@ -1196,7 +1203,7 @@ ${b.join(`
1196
1203
  `)}
1197
1204
 
1198
1205
  // \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
1199
- ${j}
1206
+ ${O}
1200
1207
 
1201
1208
  public(package) fun share_${r}(storage: ${u}) {
1202
1209
  dubhe::dapp_system::share_scene_storage<DappKey, ${d}>(
@@ -1210,7 +1217,7 @@ ${j}
1210
1217
  );
1211
1218
  }
1212
1219
  }
1213
- `;await A(E,$t.join(t,`${r}.move`),"formatAndWriteMove")}}async function Be(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
1220
+ `;await E(A,mt.join(t,`${r}.move`),"formatAndWriteMove")}}async function We(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
1214
1221
  use dubhe::dapp_service::{DappHub, DappStorage};
1215
1222
  use dubhe::dapp_system;
1216
1223
  use ${e.name}::dapp_key;
@@ -1231,7 +1238,7 @@ ${j}
1231
1238
  dapp_system::create_user_storage(dapp_key::new(), dapp_hub, dapp_storage, ctx);
1232
1239
  }
1233
1240
  }
1234
- `;await A(s,t,"formatAndWriteMove")}import He from"chalk";import{existsSync as vt,readFileSync as kt,writeFileSync as We}from"fs";import St from"node:path";function xt(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 Ye(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function Ct(e){let t={};for(let[r,i]of Object.entries(e.resources??{}))t[r]=xt(i);let s={};for(let[r,i]of Object.entries(e.objects??{}))s[r]=Ye(i);let n={};for(let[r,i]of Object.entries(e.scenes??{}))n[r]=Ye(i);return{version:1,resources:t,objects:s,scenes:n}}function ge(e,t,s){for(let[n,r]of Object.entries(s)){let i=t[n];if(i)for(let[d,l]of Object.entries(i)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
1241
+ `;await E(s,t,"formatAndWriteMove")}import Ye from"chalk";import{existsSync as St,readFileSync as xt,writeFileSync as Ve}from"fs";import Ct from"node:path";function wt(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 Ge(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function Dt(e){let t={};for(let[r,i]of Object.entries(e.resources??{}))t[r]=wt(i);let s={};for(let[r,i]of Object.entries(e.objects??{}))s[r]=Ge(i);let n={};for(let[r,i]of Object.entries(e.scenes??{}))n[r]=Ge(i);return{version:1,resources:t,objects:s,scenes:n}}function _e(e,t,s){for(let[n,r]of Object.entries(s)){let i=t[n];if(i)for(let[d,l]of Object.entries(i)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
1235
1242
  Field "${d}" was removed.
1236
1243
 
1237
1244
  Resources, objects, and scenes are stored as raw bytes on-chain.
@@ -1239,10 +1246,10 @@ Removing fields corrupts existing data. Use a new name (e.g. "${n}_v2") for brea
1239
1246
  Field "${d}" type changed from "${l}" to "${r[d]}".
1240
1247
 
1241
1248
  Resources, objects, and scenes are stored as raw bytes on-chain.
1242
- Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function Ve(e,t){let s=St.join(e,`${t.name}.lock.json`),n=Ct(t);if(vt(s)){let r;try{r=JSON.parse(kt(s,"utf-8"))}catch{console.warn(He.yellow("[dubhe]")+` Could not parse ${He.bold(s)}, skipping break-check.`),We(s,JSON.stringify(n,null,2)+`
1243
- `,"utf-8");return}ge("resources",r.resources??{},n.resources),ge("objects",r.objects??{},n.objects),ge("scenes",r.scenes??{},n.scenes)}We(s,JSON.stringify(n,null,2)+`
1244
- `,"utf-8")}import U from"chalk";var se=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function Ge(e){$e(e,!1)}function $e(e,t=!0){let s=e.resources??{},n=e.objects??{},r=e.permits??{},i=e.scenes??{},d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),$=new Set(Object.keys(i)),g=new Set;for(let o of d)(l.has(o)||u.has(o)||$.has(o))&&g.add(o);for(let o of l)(u.has(o)||$.has(o))&&g.add(o);for(let o of u)$.has(o)&&g.add(o);if(g.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[...g].sort().join(", ")}`);let f=new Set;for(let[o,b]of Object.entries(n)){for(let p of b.accepts??[]){f.add(p);let h=s[p];if(!h)throw new Error(`objects.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`objects.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],c=!!i[p];if(!h&&!c)throw new Error(`objects.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(i)){if(!b.authorization)throw new Error(`scenes.${o} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(b.authorization.kind==="permit"){if(!r[b.authorization.permit])throw new Error(`scenes.${o}.authorization references permit '${b.authorization.permit}', but permits.${b.authorization.permit} is not defined`)}else if(b.authorization.kind!=="system")throw new Error(`scenes.${o}.authorization.kind must be 'system' or 'permit'`);for(let p of b.accepts??[]){f.add(p);let h=s[p];if(!h)throw new Error(`scenes.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`scenes.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],c=!!i[p];if(!h&&!c)throw new Error(`scenes.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(s)){if(typeof b=="string")continue;let p=b;if(p.offchain){if(p.listable)throw new Error(`resources.${o} 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(p.transferable)throw new Error(`resources.${o} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if(p.reactive)throw new Error(`resources.${o} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);p.fungible&&t&&se(`resources.${U.bold(o)} 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(p.reactive&&p.fungible&&t&&se(`resources.${U.bold(o)} 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.`),p.global){if(p.reactive)throw new Error(`resources.${o} 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(p.listable)throw new Error(`resources.${o} 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(p.transferable)throw new Error(`resources.${o} 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.`)}p.fungible&&p.listable&&t&&se(`resources.${U.bold(o)} has both ${U.cyan("fungible: true")} and ${U.cyan("listable: true")}. The generated ${U.green(`list_${o}`)} entry function will include an ${U.cyan("amount")} parameter for partial listings.`),p.transferable&&!f.has(o)&&t&&se(`resources.${U.bold(o)} 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 L from"node:path";async function wt(e,t,s,n=1){console.log(`
1245
- \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"}`),$e(t),Ve(e,t),console.log(e);let r=L.join(e,"src",t.name);V(`${r}`)&&ce(`${r}/sources/codegen`),V(`${r}/Move.toml`)||await ve(t,e);let i=L.join(r,"sources","codegen","genesis.move");V(i)||await Ee(t,i,n);let d=L.join(r,"sources","codegen","init_test.move");V(d)||await Ae(t,d);let l=L.join(r,"sources","codegen","dapp_key.move");V(l)||await Ce(t,l);let u=L.join(r,"sources","scripts","deploy_hook.move");V(u)||await Se(t,u,n);let $=L.join(r,"sources","codegen","resources");await Pe(t,$);let g=L.join(r,"sources","codegen","objects");await Re(t,g);let f=L.join(r,"sources","codegen","permits");await Le(t,f);let o=L.join(r,"sources","codegen","scenes");await ze(t,o);let b=L.join(r,"sources","codegen","enums");V(b)||await Fe(t,b),t.errors&&await Te(t.name,t.errors,e);let p=L.join(r,"sources","codegen","user_storage_init.move");await Be(t,p),await je(t,e),await xe(t,e),console.log(`
1249
+ Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function qe(e,t){let s=Ct.join(e,`${t.name}.lock.json`),n=Dt(t);if(St(s)){let r;try{r=JSON.parse(xt(s,"utf-8"))}catch{console.warn(Ye.yellow("[dubhe]")+` Could not parse ${Ye.bold(s)}, skipping break-check.`),Ve(s,JSON.stringify(n,null,2)+`
1250
+ `,"utf-8");return}_e("resources",r.resources??{},n.resources),_e("objects",r.objects??{},n.objects),_e("scenes",r.scenes??{},n.scenes)}Ve(s,JSON.stringify(n,null,2)+`
1251
+ `,"utf-8")}import U from"chalk";var oe=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function Je(e){me(e,!1)}function me(e,t=!0){let s=e.resources??{},n=e.objects??{},r=e.permits??{},i=e.scenes??{},d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),_=new Set(Object.keys(i)),g=new Set;for(let o of d)(l.has(o)||u.has(o)||_.has(o))&&g.add(o);for(let o of l)(u.has(o)||_.has(o))&&g.add(o);for(let o of u)_.has(o)&&g.add(o);if(g.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[...g].sort().join(", ")}`);let y=new Set;for(let[o,b]of Object.entries(n)){for(let p of b.accepts??[]){y.add(p);let h=s[p];if(!h)throw new Error(`objects.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`objects.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],a=!!i[p];if(!h&&!a)throw new Error(`objects.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(i)){if(!b.authorization)throw new Error(`scenes.${o} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(b.authorization.kind==="permit"){if(!r[b.authorization.permit])throw new Error(`scenes.${o}.authorization references permit '${b.authorization.permit}', but permits.${b.authorization.permit} is not defined`)}else if(b.authorization.kind!=="system")throw new Error(`scenes.${o}.authorization.kind must be 'system' or 'permit'`);for(let p of b.accepts??[]){y.add(p);let h=s[p];if(!h)throw new Error(`scenes.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`scenes.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],a=!!i[p];if(!h&&!a)throw new Error(`scenes.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(s)){if(typeof b=="string")continue;let p=b;if(p.offchain){if(p.listable)throw new Error(`resources.${o} 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(p.transferable)throw new Error(`resources.${o} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if(p.reactive)throw new Error(`resources.${o} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);p.fungible&&t&&oe(`resources.${U.bold(o)} 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(p.reactive&&p.fungible&&t&&oe(`resources.${U.bold(o)} 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.`),p.global){if(p.reactive)throw new Error(`resources.${o} 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(p.listable)throw new Error(`resources.${o} 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(p.transferable)throw new Error(`resources.${o} 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.`)}p.fungible&&p.listable&&t&&oe(`resources.${U.bold(o)} has both ${U.cyan("fungible: true")} and ${U.cyan("listable: true")}. The generated ${U.green(`list_${o}`)} entry function will include an ${U.cyan("amount")} parameter for partial listings.`),p.transferable&&!y.has(o)&&t&&oe(`resources.${U.bold(o)} 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 L from"node:path";async function jt(e,t,s,n=1){console.log(`
1252
+ \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"}`),me(t),qe(e,t),console.log(e);let r=L.join(e,"src",t.name);q(`${r}`)&&pe(`${r}/sources/codegen`),q(`${r}/Move.toml`)||await Se(t,e);let i=L.join(r,"sources","codegen","genesis.move");q(i)||await Fe(t,i,n);let d=L.join(r,"sources","codegen","init_test.move");q(d)||await Oe(t,d);let l=L.join(r,"sources","codegen","dapp_key.move");q(l)||await De(t,l);let u=L.join(r,"sources","scripts","deploy_hook.move");q(u)||await Ce(t,u,n);let _=L.join(r,"sources","codegen","resources");await Le(t,_);let g=L.join(r,"sources","codegen","objects");await Be(t,g);let y=L.join(r,"sources","codegen","permits");await ze(t,y);let o=L.join(r,"sources","codegen","scenes");await He(t,o);let b=L.join(r,"sources","codegen","enums");q(b)||await Ie(t,b),t.errors&&await Ee(t.name,t.errors,e);let p=L.join(r,"sources","codegen","user_storage_init.move");await We(t,p),await Ae(t,e),await we(t,e),console.log(`
1246
1253
  \u2705 Code Generation Complete!
1247
- `)}var Qs=wt;var tr=e=>(Ge(e),e);import{findUp as Dt}from"find-up";import _e from"path";import jt from"esbuild";var re=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as Tt}from"fs";import{pathToFileURL as At}from"url";import Et from"os";var Ot=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],me="dubhe.config.example.mjs";async function dr(e){e=await qe(e);try{return await jt.build({entryPoints:[e],format:"esm",outfile:me,platform:"node",bundle:!0,packages:"external"}),e=await qe(me,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Tt(me,{force:!0})}}async function qe(e,t){return e===void 0?e=await Ft():_e.isAbsolute(e)||(e=_e.join(process.cwd(),e),e=_e.normalize(e)),t&&Et.platform()==="win32"?At(e).href:e}async function Ft(){let e=await Dt(Ot);if(e===void 0)throw new re;return e}var Kt=(s=>(s.Event="event",s.Schema="schema",s))(Kt||{});export{Kt as SubscriptionKind,Ve as checkAndUpdateLock,wt as codegen,tr as defineConfig,A as formatAndWriteMove,Ut as formatMove,Re as generateObjects,ze as generateScenes,dr as loadConfig,Qs as schemaGen};
1254
+ `)}var er=jt;var rr=e=>(Je(e),e);import{findUp as Tt}from"find-up";import be from"path";import At from"esbuild";var ie=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as Et}from"fs";import{pathToFileURL as Ot}from"url";import Ft from"os";var Kt=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],fe="dubhe.config.example.mjs";async function gr(e){e=await Ze(e);try{return await At.build({entryPoints:[e],format:"esm",outfile:fe,platform:"node",bundle:!0,packages:"external"}),e=await Ze(fe,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Et(fe,{force:!0})}}async function Ze(e,t){return e===void 0?e=await It():be.isAbsolute(e)||(e=be.join(process.cwd(),e),e=be.normalize(e)),t&&Ft.platform()==="win32"?Ot(e).href:e}async function It(){let e=await Tt(Kt);if(e===void 0)throw new ie;return e}var Ut=(s=>(s.Event="event",s.Schema="schema",s))(Ut||{});export{Ut as SubscriptionKind,qe as checkAndUpdateLock,jt as codegen,rr as defineConfig,E as formatAndWriteMove,Rt as formatMove,Be as generateObjects,He as generateScenes,gr as loadConfig,er as schemaGen};
1248
1255
  //# sourceMappingURL=index.js.map