@0xobelisk/sui-common 1.2.0-pre.121 → 1.2.0-pre.123

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 me from"prettier";import Ge from"prettier-plugin-move-js";async function It(e,t){let s;t&&(s=await me.resolveConfig(t));try{return me.format(e,{plugins:[Ge],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(n){let r;return n instanceof Error?r=n.message:r=n,console.log(`Error during output formatting: ${r}`),e}}import fe from"node:fs/promises";import Je from"node:path";import be from"debug";var ie=be("dubhe:common"),qe=be("dubhe:common");ie.log=console.debug.bind(console);qe.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 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.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  /* Autogenerated file. Do not edit manually. */
5
5
 
6
- `,o=`#[test_only]
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=o+n:t.includes("genesis")&&(d=l+n),await fe.mkdir(Je.dirname(t),{recursive:!0}),await fe.writeFile(t,d),ae(`${s}: ${t}`)}import{existsSync as V}from"fs";import J from"fs";function ce(e){J.existsSync(e)&&(J.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;J.lstatSync(s).isDirectory()?ce(s):J.unlinkSync(s)}),J.rmdirSync(e))}var ye={name:"@0xobelisk/sui-common",version:"1.2.0-pre.121",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 he(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 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.123",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(`
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${ye.version}" }
16
+ Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "framework/src/dubhe", rev = "v${he.version}" }
17
17
 
18
18
  [addresses]
19
19
  sui = "0x2"
20
20
  ${e.name} = "0x0"
21
21
  `;await A(s,`${t}/src/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
22
- `)}import{existsSync as ve}from"fs";async function ke(e,t,s=1){if(!ve(t)){let n=s===1?`// Settlement mode: USER_PAYS \u2014 users pay transaction fees at settlement time.
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.
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 Se(e,t){if(!ve(`${t}/src/${e.name}/sources/scripts/migrate.move`)){let s=`module ${e.name}::migrate {
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 {
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 xe(e,t){let s=`module ${e.name}::dapp_key {
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 {
40
40
  use std::type_name;
41
41
  use sui::address;
42
42
  use std::ascii::String;
@@ -62,14 +62,14 @@ ${e.name} = "0x0"
62
62
  type_name::with_defining_ids<DappKey1>() == type_name::with_defining_ids<DappKey2>()
63
63
  }
64
64
  }
65
- `;await A(s,t,"formatAndWriteMove")}import{existsSync as Ce}from"fs";import we from"node:fs/promises";async function De(e,t){Ce(`${t}/src/${e.name}/sources/systems`)||await we.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),Ce(`${t}/src/${e.name}/sources/tests`)||await we.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}function Xe(e){return"E"+e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Qe(e){return typeof e=="string"?e:e.message}async function je(e,t,s){console.log(`
66
- \u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([o,d])=>{let l=Xe(o),u=Qe(d);return console.log(` \u2514\u2500 ${o}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${o}(condition: bool) { assert!(condition, ${l}) }`].join(`
65
+ `;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(`
66
+ \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(`
67
67
  `)}).join(`
68
68
 
69
69
  `),r=`module ${e}::error {
70
70
  ${n}
71
71
  }
72
- `;await A(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function Te(e,t){let n=e.name==="dubhe"?"":`
72
+ `;await A(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function Ae(e,t){let n=e.name==="dubhe"?"":`
73
73
  /// Create a DappStorage for this DApp without sharing it.
74
74
  /// Suitable for unit tests that exercise global-resource functions.
75
75
  public fun create_dapp_storage_for_testing(ctx: &mut TxContext): dubhe::dapp_service::DappStorage {
@@ -91,7 +91,7 @@ module ${e.name}::init_test {
91
91
  }
92
92
  ${n}
93
93
  }
94
- `;await A(r,t,"formatAndWriteMove")}async function Ae(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
94
+ `;await A(r,t,"formatAndWriteMove")}async function Ee(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
95
95
  use dubhe::dapp_service::DappHub;
96
96
 
97
97
  // The framework genesis initialises the DappHub state via deploy_hook.
@@ -141,8 +141,8 @@ ${n}
141
141
  // ==========================================
142
142
  }
143
143
  }
144
- `;await A(r,t,"formatAndWriteMove")}function Ee(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Oe(e,t){if(console.log(`
145
- \u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,n]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`);let r=[...n].sort((d,l)=>d.localeCompare(l)),o=Ne(e.name,s,r);await A(o,`${t}/${Ee(s)}.move`,"formatAndWriteMove")}}function Ne(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Ee(t)} {
144
+ `;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(`
145
+ \u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,n]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`);let r=[...n].sort((d,l)=>d.localeCompare(l)),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)} {
146
146
  use sui::bcs::{BCS, to_bytes, peel_enum_tag};
147
147
 
148
148
  public enum ${t} has copy, drop, store {
@@ -161,316 +161,315 @@ ${s.map(r=>` public fun new_${r.toLowerCase()}(): ${t} {
161
161
 
162
162
  public fun decode(bytes: &mut BCS): ${t} {
163
163
  match(peel_enum_tag(bytes)) {
164
- ${s.map((r,o)=>` ${o} => ${t}::${r.charAt(0).toUpperCase()+r.slice(1)},`).join(`
164
+ ${s.map((r,i)=>` ${i} => ${t}::${r.charAt(0).toUpperCase()+r.slice(1)},`).join(`
165
165
  `)}
166
166
  _ => abort,
167
167
  }
168
168
  }
169
- }`}function Ke(e){return e==="dubhe"?"dapp_service":"dapp_system"}function L(e){return e!=="dubhe"?"dapp_key::new(), ":""}function B(e,t){return""}function H(e,t){return""}function Ie(e){return e?"DappStorage":"UserStorage"}function Me(e){return e?"dapp_storage":"user_storage"}function pe(e,t){let s=Ke(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 Ue(e,t){if(console.log(`
170
- \u{1F4E6} Starting Resources Generation...`),!!e.resources)for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=et(e.name,s,n,"Onchain");await A(l,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let r=tt(e.name,s,n),o=rt(e,s,n),d=o?r.replace(/^}$/m,`
171
- ${o}
172
- }`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function et(e,t,s,n="Onchain"){let r=!z(s),o=r?`${ue(s)}`:"",d=n==="Offchain",l=!1,u=Ie(l),_=Me(l),$=pe(e,l),p=d?"":`
173
- public fun has(${_}: &${u}): bool {
169
+ }`}function Ie(e){return e==="dubhe"?"dapp_service":"dapp_system"}function L(e){return e!=="dubhe"?"dapp_key::new(), ":""}function B(e,t){return""}function H(e,t){return""}function 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(`
170
+ \u{1F4E6} Starting Resources Generation...`),!!e.resources)for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=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,`
171
+ ${i}
172
+ }`):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),g=Ue(l),$=pe(e,l),f=d?"":`
173
+ public fun has(${g}: &${u}): bool {
174
174
  let mut key_tuple = vector::empty();
175
175
  key_tuple.push_back(TABLE_NAME);
176
- ${$.has_record}<DappKey>(${_}, key_tuple)
176
+ ${$.has_record}<DappKey>(${g}, key_tuple)
177
177
  }
178
178
 
179
- public fun ensure_has(${_}: &${u}) {
179
+ public fun ensure_has(${g}: &${u}) {
180
180
  let mut key_tuple = vector::empty();
181
181
  key_tuple.push_back(TABLE_NAME);
182
- ${$.ensure_has}<DappKey>(${_}, key_tuple)
182
+ ${$.ensure_has}<DappKey>(${g}, key_tuple)
183
183
  }
184
184
 
185
- public fun ensure_has_not(${_}: &${u}) {
185
+ public fun ensure_has_not(${g}: &${u}) {
186
186
  let mut key_tuple = vector::empty();
187
187
  key_tuple.push_back(TABLE_NAME);
188
- ${$.ensure_has_not}<DappKey>(${_}, key_tuple)
188
+ ${$.ensure_has_not}<DappKey>(${g}, key_tuple)
189
189
  }
190
190
 
191
- public(package) fun delete(${_}: &mut ${u}, ctx: &TxContext) {
191
+ public(package) fun delete(${g}: &mut ${u}, ctx: &TxContext) {
192
192
  let mut key_tuple = vector::empty();
193
193
  key_tuple.push_back(TABLE_NAME);
194
- ${$.delete_record}<DappKey>(${L(e)}${_}, key_tuple, vector[b"value"], ctx);
194
+ ${$.delete_record}<DappKey>(${L(e)}${g}, key_tuple, vector[b"value"], ctx);
195
195
  }
196
196
 
197
- public fun get(${_}: &${u}): (${s==="string"||s==="String"?"String":s}) {
197
+ public fun get(${g}: &${u}): (${s==="string"||s==="String"?"String":s}) {
198
198
  let mut key_tuple = vector::empty();
199
199
  key_tuple.push_back(TABLE_NAME);
200
- let value_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"value");
200
+ let value_raw = ${$.get_field}<DappKey>(${g}, key_tuple, b"value");
201
201
  let mut value_bcs = sui::bcs::new(value_raw);
202
- let value = ${G(e,s,"value_bcs",r?[{type:s,module:o}]:[])};
202
+ let value = ${G(e,s,"value_bcs",r?[{type:s,module:i}]:[])};
203
203
  (value)
204
204
  }
205
- `,c=l?"use dubhe::dapp_service::DappStorage;":"use dubhe::dapp_service::UserStorage;",g=r&&s!=="string"&&s!=="String";return`module ${e}::${t} {${!g?`
205
+ `,o=l?"use dubhe::dapp_service::DappStorage;":"use dubhe::dapp_service::UserStorage;",b=r&&s!=="string"&&s!=="String";return`module ${e}::${t} {${!b?`
206
206
  use sui::bcs::{to_bytes};`:""}${s==="string"||s==="String"?`
207
207
  use std::ascii::{String, into_bytes};`:s==="vector<String>"?`
208
208
  use std::ascii::String;`:""}
209
- ${c}
209
+ ${o}
210
210
  use dubhe::dapp_system;
211
211
  use ${e}::dapp_key;
212
212
  use ${e}::dapp_key::DappKey;
213
- ${g?` use ${e}::${o}::{${s}};`:""}
213
+ ${b?` use ${e}::${i}::{${s}};`:""}
214
214
 
215
215
  const TABLE_NAME: vector<u8> = b"${t}";
216
216
  const OFFCHAIN: bool = ${n==="Offchain"};
217
217
 
218
- ${p}
219
- public(package) fun set(${H(e,l)}${_}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
218
+ ${f}
219
+ public(package) fun set(${H(e,l)}${g}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
220
220
  let mut key_tuple = vector::empty();
221
221
  key_tuple.push_back(TABLE_NAME);
222
222
  let field_names = vector[b"value"];
223
223
  let value_tuple = encode(value);
224
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
224
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
225
225
  }
226
226
 
227
227
  public fun encode(value: ${s==="string"||s==="String"?"String":s}): vector<vector<u8>> {
228
228
  let mut value_tuple = vector::empty();
229
- value_tuple.push_back(${s==="string"||s==="String"?"to_bytes(&into_bytes(value))":s==="vector<String>"?"to_bytes(&value)":r?`${e}::${o}::encode(value)`:"to_bytes(&value)"});
229
+ 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)"});
230
230
  value_tuple
231
231
  }
232
- }`}function ue(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function tt(e,t,s){let n=s.fields,r=s.keys||[],o=s.offchain||!1,d=s.global||!1,l=o?"Offchain":"Onchain",u=d,_=Ie(u),$=Me(u),p=pe(e,u),c=Object.keys(n).every(b=>r.includes(b)),g=Object.entries(n).filter(([b])=>!r.includes(b)),f=g.map(([b])=>b),C=f.length===1,a=g.filter(([b,O])=>!z(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ue(O)}`})).filter((b,O,ne)=>ne.findIndex(oe=>oe.type===b.type)===O),m=Object.entries(n).filter(([b,O])=>!z(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ue(O)}`})).filter((b,O,ne)=>ne.findIndex(oe=>oe.type===b.type)===O),h=st(e,t,n,r,!c&&!C,a,l,u,_,$,p),v=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",j=Object.values(n),D=f.filter(b=>{let O=n[b];return z(O)||O==="string"||O==="String"}).length>0||r.length>0?`
233
- use sui::bcs::{to_bytes};`:"",E=j.some(b=>b==="string"||b==="String"),S=j.some(b=>b==="vector<String>"),x=f.some(b=>{let O=n[b];return O==="string"||O==="String"}),I=x?`
234
- use std::ascii::{String, into_bytes};`:E||S?`
235
- use std::ascii::String;`:"",P=x?`
236
- use std::ascii::{string, String, into_bytes};`:E||S?`
237
- use std::ascii::String;`:"";if(c||C)return`module ${e}::${t} {${D}${I}
238
- ${v}
232
+ }`}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,g=Me(u),$=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?`
233
+ 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?`
234
+ 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?`
235
+ use std::ascii::{String, into_bytes};`:x||C?`
236
+ use std::ascii::String;`:"",a=K?`
237
+ use std::ascii::{string, String, into_bytes};`:x||C?`
238
+ use std::ascii::String;`:"";if(o||h)return`module ${e}::${t} {${E}${P}
239
+ ${k}${D}
239
240
  use dubhe::dapp_system;
240
241
  use ${e}::dapp_key;
241
242
  use ${e}::dapp_key::DappKey;
242
- ${m.length>0?m.map(b=>` use ${e}::${b.module}::{${b.type}};`).join(`
243
+ ${_.length>0?_.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
243
244
  `):""}
244
245
 
245
246
  const TABLE_NAME: vector<u8> = b"${t}";
246
- const OFFCHAIN: bool = ${o};
247
+ const OFFCHAIN: bool = ${i};
247
248
 
248
- ${h}
249
- }`;let i=f.map(b=>` ${b}: ${n[b]==="string"||n[b]==="String"?"String":n[b]==="vector<String>"?"vector<String>":n[b]},`).join(`
250
- `),y=f.map(b=>`${b}: ${n[b]==="string"||n[b]==="String"?"String":n[b]==="vector<String>"?"vector<String>":n[b]}`).join(", "),k=f.map(b=>` ${b},`).join(`
251
- `),T=f.map(b=>` public fun ${b}(self: &${K(t)}): ${n[b]==="string"||n[b]==="String"?"String":n[b]==="vector<String>"?"vector<String>":n[b]} {
252
- self.${b}
249
+ ${v}
250
+ }`;let y=p.map(m=>` ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]},`).join(`
251
+ `),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(`
252
+ `),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]} {
253
+ self.${m}
253
254
  }`).join(`
254
255
 
255
- `),M=f.map(b=>` public fun update_${b}(self: &mut ${K(t)}, ${b}: ${n[b]==="string"||n[b]==="String"?"String":n[b]==="vector<String>"?"vector<String>":n[b]}) {
256
- self.${b} = ${b}
256
+ `),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]}) {
257
+ self.${m} = ${m}
257
258
  }`).join(`
258
259
 
259
- `);return`module ${e}::${t} {${D}${P}
260
- ${v}
260
+ `);return`module ${e}::${t} {${E}${a}
261
+ ${k}${D}
261
262
  use dubhe::dapp_system;
262
263
  use ${e}::dapp_key;
263
264
  use ${e}::dapp_key::DappKey;
264
- ${m.length>0?m.map(b=>` use ${e}::${b.module}::{${b.type}};`).join(`
265
+ ${_.length>0?_.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
265
266
  `):""}
266
267
 
267
268
  const TABLE_NAME: vector<u8> = b"${t}";
268
- const OFFCHAIN: bool = ${o};
269
+ const OFFCHAIN: bool = ${i};
269
270
 
270
- public struct ${K(t)} has copy, drop, store {
271
- ${i}
271
+ public struct ${I(t)} has copy, drop, store {
272
+ ${y}
272
273
  }
273
274
 
274
- public fun new(${y}): ${K(t)} {
275
- ${K(t)} {
276
- ${k}
275
+ public fun new(${S}): ${I(t)} {
276
+ ${I(t)} {
277
+ ${T}
277
278
  }
278
279
  }
279
280
 
280
- ${T}
281
-
282
281
  ${M}
283
282
 
284
- ${h}
285
- }`}function z(e){return["address","bool","u8","u16","u32","u64","u128","u256","string","String","vector<address>","vector<bool>","vector<u8>","vector<u16>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>","vector<String>"].includes(e)}function G(e,t,s,n){let r=!z(t),o=r?n.find(d=>d.type===t):null;return t==="string"||t==="String"?`dubhe::bcs::peel_string(&mut ${s})`:t==="vector<String>"?`dubhe::bcs::peel_vec_string(&mut ${s})`:r&&o?`${e}::${o.module}::decode(&mut ${s})`:`sui::bcs::peel_${de(t)}(&mut ${s})`}function Fe(e,t,s,n,r,o,d){let l=`${n}_raw`,u=`${n}_bcs`;return[`let ${l} = ${t.get_field}<DappKey>(${s}, key_tuple, b"${n}");`,`let mut ${u} = sui::bcs::new(${l});`,`let ${n} = ${G(e,r,u,d)};`].join(`
286
- `)}function st(e,t,s,n,r=!0,o=[],d="Onchain",l=!1,u="UserStorage",_="user_storage",$=pe("dubhe",!1)){let p=Object.entries(s).filter(([i])=>!n.includes(i)).reduce((i,[y,k])=>({...i,[y]:k}),{}),c=Object.keys(p),g=Object.keys(s).every(i=>n.includes(i)),f=c.length===1,C=d==="Offchain",a=n.length>0?n.map(i=>`${i}: ${s[i]}`).join(", "):"",m=n.length>0?`let mut key_tuple = vector::empty();
283
+ ${J}
284
+
285
+ ${v}
286
+ }`}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(`
287
+ `)}function nt(e,t,s,n,r=!0,i=[],d="Onchain",l=!1,u="UserStorage",g="user_storage",$=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();
287
288
  key_tuple.push_back(TABLE_NAME);
288
- ${n.map(i=>`key_tuple.push_back(to_bytes(&${i}));`).join(`
289
+ ${n.map(a=>`key_tuple.push_back(to_bytes(&${a}));`).join(`
289
290
  `)}`:`let mut key_tuple = vector::empty();
290
- key_tuple.push_back(TABLE_NAME);`,h=l?"":", ctx: &mut TxContext",v=l?"":", ctx",j=C?"":` public fun has(${_}: &${u}${a?", ":""}${a}): bool {
291
- ${m}
292
- ${$.has_record}<DappKey>(${_}, key_tuple)
291
+ key_tuple.push_back(TABLE_NAME);`,v=l?"":", ctx: &mut TxContext",k=l?"":", ctx",D=h?"":` public fun has(${g}: &${u}${c?", ":""}${c}): bool {
292
+ ${_}
293
+ ${$.has_record}<DappKey>(${g}, key_tuple)
293
294
  }
294
295
 
295
- public fun ensure_has(${_}: &${u}${a?", ":""}${a}) {
296
- ${m}
297
- ${$.ensure_has}<DappKey>(${_}, key_tuple)
296
+ public fun ensure_has(${g}: &${u}${c?", ":""}${c}) {
297
+ ${_}
298
+ ${$.ensure_has}<DappKey>(${g}, key_tuple)
298
299
  }
299
300
 
300
- public fun ensure_has_not(${_}: &${u}${a?", ":""}${a}) {
301
- ${m}
302
- ${$.ensure_has_not}<DappKey>(${_}, key_tuple)
301
+ public fun ensure_has_not(${g}: &${u}${c?", ":""}${c}) {
302
+ ${_}
303
+ ${$.ensure_has_not}<DappKey>(${g}, key_tuple)
303
304
  }
304
- `,w=`vector[${c.map(i=>`b"${i}"`).join(", ")}]`,F=C?"":` public(package) fun delete(${_}: &mut ${u}${a?", ":""}${a}${l?"":", ctx: &TxContext"}) {
305
- ${m}
306
- ${$.delete_record}<DappKey>(${L(e)}${_}, key_tuple, ${w}${l?"":", ctx"});
307
- }`,D=!f&&!C?c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return` public fun get_${i}(${_}: &${u}${a?", ":""}${a}): ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y} {
308
- ${m}
309
- let ${i}_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"${i}");
310
- let mut ${i}_bcs = sui::bcs::new(${i}_raw);
311
- let ${i} = ${G(e,y,`${i}_bcs`,o)};
312
- ${i}
305
+ `,w=`vector[${o.map(a=>`b"${a}"`).join(", ")}]`,F=h?"":` public(package) fun delete(${g}: &mut ${u}${c?", ":""}${c}${l?"":", ctx: &TxContext"}) {
306
+ ${_}
307
+ ${$.delete_record}<DappKey>(${L(e)}${g}, key_tuple, ${w}${l?"":", ctx"});
308
+ }`,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}(${g}: &${u}${c?", ":""}${c}): ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y} {
309
+ ${_}
310
+ let ${a}_raw = ${$.get_field}<DappKey>(${g}, key_tuple, b"${a}");
311
+ let mut ${a}_bcs = sui::bcs::new(${a}_raw);
312
+ let ${a} = ${G(e,y,`${a}_bcs`,i)};
313
+ ${a}
313
314
  }
314
315
 
315
- public(package) fun set_${i}(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${i}: ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y}${h}) {
316
- ${m}
317
- let value = ${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`};
318
- ${$.set_field}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, b"${i}", value${v});
316
+ public(package) fun set_${a}(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${a}: ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y}${v}) {
317
+ ${_}
318
+ 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})`};
319
+ ${$.set_field}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, b"${a}", value${k});
319
320
  }`}).join(`
320
321
 
321
- `):"",E=`vector[${c.map(i=>`b"${i}"`).join(", ")}]`,S=g?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}${h}) {
322
- ${m}
322
+ `):"",E=`vector[${o.map(a=>`b"${a}"`).join(", ")}]`,x=b?` public(package) fun set(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}${v}) {
323
+ ${_}
323
324
  let field_names: vector<vector<u8>> = vector[];
324
325
  let value_tuple: vector<vector<u8>> = vector[];
325
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
326
- }`:f?C?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}${h}) {
327
- ${m}
328
- let field_names = vector[b"${c[0]}"];
326
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
327
+ }`:p?h?` public(package) fun set(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}${v}) {
328
+ ${_}
329
+ let field_names = vector[b"${o[0]}"];
329
330
  let value_tuple = encode(value);
330
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
331
- }`:` public fun get(${_}: &${u}${a?", ":""}${a}): ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]} {
332
- ${m}
333
- let ${c[0]}_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"${c[0]}");
334
- let mut ${c[0]}_bcs = sui::bcs::new(${c[0]}_raw);
335
- let value = ${G(e,Object.values(p)[0],`${c[0]}_bcs`,o)};
331
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
332
+ }`:` public fun get(${g}: &${u}${c?", ":""}${c}): ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]} {
333
+ ${_}
334
+ let ${o[0]}_raw = ${$.get_field}<DappKey>(${g}, key_tuple, b"${o[0]}");
335
+ let mut ${o[0]}_bcs = sui::bcs::new(${o[0]}_raw);
336
+ let value = ${G(e,Object.values(f)[0],`${o[0]}_bcs`,i)};
336
337
  value
337
338
  }
338
339
 
339
- public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}${h}) {
340
- ${m}
341
- let field_names = vector[b"${c[0]}"];
340
+ public(package) fun set(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}${v}) {
341
+ ${_}
342
+ let field_names = vector[b"${o[0]}"];
342
343
  let value_tuple = encode(value);
343
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
344
- }`:C?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}${h}) {
345
- ${m}
344
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
345
+ }`:h?` public(package) fun set(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}${v}) {
346
+ ${_}
346
347
  let field_names = ${E};
347
- let value_tuple = encode(${c.join(", ")});
348
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
349
- }`:` public fun get(${_}: &${u}${a?", ":""}${a}): (${Object.values(p).map(i=>i==="string"||i==="String"?"String":i).join(", ")}) {
350
- ${m}
351
- ${c.map((i,y)=>Fe(e,$,_,i,s[i],y,o)).join(`
348
+ let value_tuple = encode(${o.join(", ")});
349
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
350
+ }`:` public fun get(${g}: &${u}${c?", ":""}${c}): (${Object.values(f).map(a=>a==="string"||a==="String"?"String":a).join(", ")}) {
351
+ ${_}
352
+ ${o.map((a,y)=>Ke(e,$,g,a,s[a],y,i)).join(`
352
353
  `)}
353
- (${c.join(", ")})
354
+ (${o.join(", ")})
354
355
  }
355
356
 
356
- public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}${h}) {
357
- ${m}
357
+ public(package) fun set(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}${v}) {
358
+ ${_}
358
359
  let field_names = ${E};
359
- let value_tuple = encode(${c.join(", ")});
360
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
361
- }`,x=r?C?` public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${K(t)}${h}) {
362
- ${m}
360
+ let value_tuple = encode(${o.join(", ")});
361
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
362
+ }`,C=r?h?` public(package) fun set_struct(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
363
+ ${_}
363
364
  let field_names = ${E};
364
365
  let value_tuple = encode_struct(${t});
365
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
366
- }`:` public fun get_struct(${_}: &${u}${a?", ":""}${a}): ${K(t)} {
367
- ${m}
368
- ${c.map((i,y)=>Fe(e,$,_,i,s[i],y,o)).join(`
366
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
367
+ }`:` public fun get_struct(${g}: &${u}${c?", ":""}${c}): ${I(t)} {
368
+ ${_}
369
+ ${o.map((a,y)=>Ke(e,$,g,a,s[a],y,i)).join(`
369
370
  `)}
370
- ${K(t)} { ${c.join(", ")} }
371
+ ${I(t)} { ${o.join(", ")} }
371
372
  }
372
373
 
373
- public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${K(t)}${h}) {
374
- ${m}
374
+ public(package) fun set_struct(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
375
+ ${_}
375
376
  let field_names = ${E};
376
377
  let value_tuple = encode_struct(${t});
377
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
378
- }`:"",I=f?` public fun encode(value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}): vector<vector<u8>> {
378
+ ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
379
+ }`:"",K=p?` public fun encode(value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}): vector<vector<u8>> {
379
380
  let mut value_tuple = vector::empty();
380
- value_tuple.push_back(${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(p)[0]==="vector<String>"||z(Object.values(p)[0])?"to_bytes(&value)":`${e}::${o.find(i=>i.type===Object.values(p)[0])?.module}::encode(value)`});
381
+ 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)`});
381
382
  value_tuple
382
- }`:r?C?` public fun encode(${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}): vector<vector<u8>> {
383
+ }`:r?h?` public fun encode(${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}): vector<vector<u8>> {
383
384
  let mut value_tuple = vector::empty();
384
- ${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`});`}).join(`
385
+ ${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(`
385
386
  `)}
386
387
  value_tuple
387
388
  }
388
389
 
389
- public fun encode_struct(${t}: ${K(t)}): vector<vector<u8>> {
390
- encode(${c.map(i=>`${t}.${i}`).join(", ")})
391
- }`:` public fun encode(${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}): vector<vector<u8>> {
390
+ public fun encode_struct(${t}: ${I(t)}): vector<vector<u8>> {
391
+ encode(${o.map(a=>`${t}.${a}`).join(", ")})
392
+ }`:` public fun encode(${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}): vector<vector<u8>> {
392
393
  let mut value_tuple = vector::empty();
393
- ${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`});`}).join(`
394
+ ${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(`
394
395
  `)}
395
396
  value_tuple
396
397
  }
397
398
 
398
- public fun encode_struct(${t}: ${K(t)}): vector<vector<u8>> {
399
- encode(${c.map(i=>`${t}.${i}`).join(", ")})
399
+ public fun encode_struct(${t}: ${I(t)}): vector<vector<u8>> {
400
+ encode(${o.map(a=>`${t}.${a}`).join(", ")})
400
401
  }
401
402
 
402
- public fun decode(data: vector<u8>): ${K(t)} {
403
+ public fun decode(data: vector<u8>): ${I(t)} {
403
404
  let mut bcs_type = sui::bcs::new(data);
404
- ${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`let ${i} = ${y==="string"||y==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":y==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":k?`${e}::${T?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${de(y)}(&mut bcs_type)`};`}).join(`
405
+ ${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(`
405
406
  `)}
406
- ${K(t)} {
407
- ${c.map(i=>`${i},`).join(`
407
+ ${I(t)} {
408
+ ${o.map(a=>`${a},`).join(`
408
409
  `)}
409
410
  }
410
- }`:"";return[j,F,D,S,x,I].filter(i=>i.trim().length>0).join(`
411
+ }`:"";return[D,F,j,x,C,K].filter(a=>a.trim().length>0).join(`
411
412
 
412
- `)}function K(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 rt(e,t,s){let n=[],r=e.name,o=Ke(r),d=L(r),l=s.fields,u=s.keys??[],_=Object.entries(l).filter(([c])=>!u.includes(c)),$=_.map(([c])=>c),p=u.length>0?u.map(c=>`${c}: ${l[c]}`).join(", "):"";if(s.fungible&&$.length===1){let[c,g]=_[0];n.push(`
413
+ `)}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=L(r),l=s.fields,u=s.keys??[],g=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&&$.length===1){let[o,b]=g[0];n.push(`
413
414
  // \u2500\u2500\u2500 fungible add / sub \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
414
415
  #[error]
415
416
  const EInsufficientAmount: vector<u8> = b"Insufficient amount";
416
417
 
417
- public(package) fun add(user_storage: &mut UserStorage, amount: ${g}, ctx: &mut TxContext) {
418
+ public(package) fun add(user_storage: &mut UserStorage, amount: ${b}, ctx: &mut TxContext) {
418
419
  let current = if (has(user_storage)) { get(user_storage) } else { 0 };
419
420
  set(user_storage, current + amount, ctx);
420
421
  }
421
422
 
422
- public(package) fun sub(user_storage: &mut UserStorage, amount: ${g}, ctx: &mut TxContext) {
423
+ public(package) fun sub(user_storage: &mut UserStorage, amount: ${b}, ctx: &mut TxContext) {
423
424
  let current = get(user_storage);
424
425
  assert!(current >= amount, EInsufficientAmount);
425
426
  set(user_storage, current - amount, ctx);
426
- }`)}if(u.length>0&&!s.offchain&&!s.global){let c=u.map(m=>`${m}: ${l[m]}`).join(", "),g=$.map(m=>`${m}: ${l[m]}`).join(", "),f=[c,g].filter(Boolean).join(", "),C=u.join(", "),a=[...u,...$].join(", ");n.push(`
427
+ }`)}if(u.length>0&&!s.offchain&&!s.global){let o=u.map(_=>`${_}: ${l[_]}`).join(", "),b=$.map(_=>`${_}: ${l[_]}`).join(", "),p=[o,b].filter(Boolean).join(", "),h=u.join(", "),c=[...u,...$].join(", ");n.push(`
427
428
  // \u2500\u2500\u2500 keys: mint (developer provides keys; framework ensures no duplicate) \u2500
428
429
  // Choosing the ID strategy (fresh address, counter, coordinate pack, etc.)
429
430
  // is intentionally left to the caller.
430
431
  public(package) fun mint(
431
432
  user_storage: &mut UserStorage,
432
- ${f},
433
+ ${p},
433
434
  ctx: &mut TxContext,
434
435
  ) {
435
- ensure_has_not(user_storage, ${C});
436
- set(user_storage, ${a}, ctx);
437
- }`)}if(s.reactive){let c=u.length>0?`let mut key_tuple = vector::empty();
436
+ ensure_has_not(user_storage, ${h});
437
+ set(user_storage, ${c}, ctx);
438
+ }`)}if(s.reactive){let o=u.length>0?`let mut key_tuple = vector::empty();
438
439
  key_tuple.push_back(TABLE_NAME);
439
- ${u.map(g=>`key_tuple.push_back(sui::bcs::to_bytes(&${g}));`).join(`
440
+ ${u.map(b=>`key_tuple.push_back(sui::bcs::to_bytes(&${b}));`).join(`
440
441
  `)}`:`let mut key_tuple = vector::empty();
441
- key_tuple.push_back(TABLE_NAME);`;if($.length>1){let g=$.map(f=>`${f}: ${l[f]}`).join(", ");n.push(`
442
+ key_tuple.push_back(TABLE_NAME);`;if($.length>1){let b=$.map(p=>`${p}: ${l[p]}`).join(", ");n.push(`
442
443
  // \u2500\u2500\u2500 reactive: cross-user write variants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
443
444
  // Package-level helpers: add pause checks and access control in your system
444
445
  // functions before calling these.
445
- public(package) fun set_reactive(
446
- scene_id: &sui::object::UID,
447
- meta: &dubhe::dapp_service::PermitMetadata,
446
+ public(package) fun set_reactive<PermType>(
447
+ permit: &ScenePermit<PermType>,
448
448
  from: &mut UserStorage,
449
449
  target: &mut UserStorage,
450
- ${p?p+", ":""}${g},
450
+ ${f?f+", ":""}${b},
451
451
  ctx: &mut TxContext,
452
452
  ) {
453
- ${c}
454
- let field_names = vector[${$.map(f=>`b"${f}"`).join(", ")}];
453
+ ${o}
454
+ let field_names = vector[${$.map(p=>`b"${p}"`).join(", ")}];
455
455
  let value_tuple = encode(${$.join(", ")});
456
- ${o}::set_record_reactive<DappKey>(${d}scene_id, meta, from, target, key_tuple, field_names, value_tuple, ctx);
457
- }`)}for(let[g,f]of _){let C=f==="string"||f==="String"?`sui::bcs::to_bytes(&std::ascii::into_bytes(${g}))`:`sui::bcs::to_bytes(&${g})`;n.push(`
458
- public(package) fun set_${g}_reactive(
459
- scene_id: &sui::object::UID,
460
- meta: &dubhe::dapp_service::PermitMetadata,
456
+ ${i}::set_record_reactive<DappKey, PermType>(${d}permit, from, target, key_tuple, field_names, value_tuple, ctx);
457
+ }`)}for(let[b,p]of g){let h=p==="string"||p==="String"?`sui::bcs::to_bytes(&std::ascii::into_bytes(${b}))`:`sui::bcs::to_bytes(&${b})`;n.push(`
458
+ public(package) fun set_${b}_reactive<PermType>(
459
+ permit: &ScenePermit<PermType>,
461
460
  from: &mut UserStorage,
462
461
  target: &mut UserStorage,
463
- ${p?p+", ":""}${g}: ${f==="string"||f==="String"?"String":f},
462
+ ${f?f+", ":""}${b}: ${p==="string"||p==="String"?"String":p},
464
463
  ctx: &mut TxContext,
465
464
  ) {
466
- ${c}
467
- let value = ${C};
468
- ${o}::set_field_reactive<DappKey>(${d}scene_id, meta, from, target, key_tuple, b"${g}", value, ctx);
469
- }`)}}if(s.transferable){let c=e.objects??{},g=e.scenes??{},f=!!s.fungible,C=!f&&u.length>0,a=C?u[0]:null;for(let[m,h]of Object.entries(c)){if(!(h.accepts??[]).includes(t))continue;let v=K(m),j=`dubhe::dapp_service::ObjectStorage<${r}::${m}::${v}>`,w=m;if(f&&$.length===1){let[,F]=_[0];n.push(`
470
- // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
471
- public(package) fun transfer_user_to_${m}(
465
+ ${o}
466
+ let value = ${h};
467
+ ${i}::set_field_reactive<DappKey, PermType>(${d}permit, from, target, key_tuple, b"${b}", value, ctx);
468
+ }`)}}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&&$.length===1){let[,F]=g[0];n.push(`
469
+ // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
470
+ public(package) fun transfer_user_to_${_}(
472
471
  user: &mut UserStorage,
473
- target: &mut ${j},
472
+ target: &mut ${D},
474
473
  amount: ${F},
475
474
  ctx: &mut TxContext,
476
475
  ) {
@@ -478,149 +477,149 @@ ${h}
478
477
  ${r}::${w}::add_${t}(target, amount);
479
478
  }
480
479
 
481
- public(package) fun transfer_${m}_to_user(
482
- source: &mut ${j},
480
+ public(package) fun transfer_${_}_to_user(
481
+ source: &mut ${D},
483
482
  user: &mut UserStorage,
484
483
  amount: ${F},
485
484
  ctx: &mut TxContext,
486
485
  ) {
487
486
  ${r}::${w}::sub_${t}(source, amount);
488
487
  add(user, amount, ctx);
489
- }`)}else if(C&&a)if($.length===1){let[,F]=_[0],D=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,E=Object.entries(e.enums??{}).map(([x])=>({type:K(x),module:x})),S=G(r,F,"bcs",E);n.push(`
490
- // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
491
- public(package) fun transfer_user_to_${m}(
488
+ }`)}else if(h&&c)if($.length===1){let[,F]=g[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(`
489
+ // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
490
+ public(package) fun transfer_user_to_${_}(
492
491
  user: &mut UserStorage,
493
- target: &mut ${j},
494
- ${a}: u64,
492
+ target: &mut ${D},
493
+ ${c}: u64,
495
494
  ctx: &TxContext,
496
495
  ) {
497
- ensure_has(user, ${a});
496
+ ensure_has(user, ${c});
498
497
  // Guard before any mutation: abort if target already holds this item.
499
- dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
500
- let raw = ${D};
501
- delete(user, ${a}, ctx);
502
- ${r}::${w}::set_${t}_data(target, ${a}, raw);
498
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
499
+ let raw = ${j};
500
+ delete(user, ${c}, ctx);
501
+ ${r}::${w}::set_${t}_data(target, ${c}, raw);
503
502
  }
504
503
 
505
- public(package) fun transfer_${m}_to_user(
506
- source: &mut ${j},
504
+ public(package) fun transfer_${_}_to_user(
505
+ source: &mut ${D},
507
506
  user: &mut UserStorage,
508
- ${a}: u64,
507
+ ${c}: u64,
509
508
  ctx: &mut TxContext,
510
509
  ) {
511
510
  // Guard before any mutation: abort if user already owns this item.
512
- ensure_has_not(user, ${a});
513
- let raw = ${r}::${w}::remove_${t}_data(source, ${a});
511
+ ensure_has_not(user, ${c});
512
+ let raw = ${r}::${w}::remove_${t}_data(source, ${c});
514
513
  let mut bcs = sui::bcs::new(raw);
515
- let value = ${S};
516
- set(user, ${a}, value, ctx);
514
+ let value = ${x};
515
+ set(user, ${c}, value, ctx);
517
516
  }`)}else n.push(`
518
- // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (keyed, multi-field) \u2500\u2500
519
- public(package) fun transfer_user_to_${m}(
517
+ // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed, multi-field) \u2500\u2500
518
+ public(package) fun transfer_user_to_${_}(
520
519
  user: &mut UserStorage,
521
- target: &mut ${j},
522
- ${a}: u64,
520
+ target: &mut ${D},
521
+ ${c}: u64,
523
522
  ctx: &TxContext,
524
523
  ) {
525
- ensure_has(user, ${a});
524
+ ensure_has(user, ${c});
526
525
  // Guard before any mutation: abort if target already holds this item.
527
- dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
528
- let data = encode_struct(get_struct(user, ${a}));
529
- delete(user, ${a}, ctx);
526
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
527
+ let data = encode_struct(get_struct(user, ${c}));
528
+ delete(user, ${c}, ctx);
530
529
  let raw: vector<u8> = sui::bcs::to_bytes(&data);
531
- ${r}::${w}::set_${t}_data(target, ${a}, raw);
530
+ ${r}::${w}::set_${t}_data(target, ${c}, raw);
532
531
  }
533
532
 
534
- public(package) fun transfer_${m}_to_user(
535
- source: &mut ${j},
533
+ public(package) fun transfer_${_}_to_user(
534
+ source: &mut ${D},
536
535
  user: &mut UserStorage,
537
- ${a}: u64,
536
+ ${c}: u64,
538
537
  ctx: &mut TxContext,
539
538
  ) {
540
539
  // Guard before any mutation: abort if user already owns this item.
541
- ensure_has_not(user, ${a});
542
- let raw = ${r}::${w}::remove_${t}_data(source, ${a});
540
+ ensure_has_not(user, ${c});
541
+ let raw = ${r}::${w}::remove_${t}_data(source, ${c});
543
542
  let decoded = decode(raw);
544
- set_struct(user, ${a}, decoded, ctx);
545
- }`)}for(let[m,h]of Object.entries(g)){if(!(h.accepts??[]).includes(t))continue;let v=K(m),j=`dubhe::dapp_service::SceneStorage<${r}::${m}::${v}>`,w=m,F=h.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${h.authorization.permit}::${K(h.authorization.permit)}>`:"",D=h.authorization.kind==="permit"?` permit: &${F},
546
- `:"",E=h.authorization.kind==="permit"?"permit, ":"",S=h.authorization.kind==="permit"?", ctx":"";if(f&&$.length===1){let[,x]=_[0];n.push(`
547
- // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
548
- public(package) fun transfer_user_to_${m}(
549
- ${D} user: &mut UserStorage,
550
- target: &mut ${j},
551
- amount: ${x},
543
+ set_struct(user, ${c}, decoded, ctx);
544
+ }`)}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},
545
+ `:"",E=v.authorization.kind==="permit"?"permit, ":"",x=v.authorization.kind==="permit"?", ctx":"";if(p&&$.length===1){let[,C]=g[0];n.push(`
546
+ // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
547
+ public(package) fun transfer_user_to_${_}(
548
+ ${j} user: &mut UserStorage,
549
+ target: &mut ${D},
550
+ amount: ${C},
552
551
  ctx: &mut TxContext,
553
552
  ) {
554
553
  sub(user, amount, ctx);
555
- ${r}::${w}::add_${t}(${E}target, amount${S});
554
+ ${r}::${w}::add_${t}(${E}target, amount${x});
556
555
  }
557
556
 
558
557
  // \u2605 No expiry check on withdraw direction \u2014 prevents asset lock-in expired scenes.
559
- public(package) fun transfer_${m}_to_user(
560
- ${D} source: &mut ${j},
558
+ public(package) fun transfer_${_}_to_user(
559
+ ${j} source: &mut ${D},
561
560
  user: &mut UserStorage,
562
- amount: ${x},
561
+ amount: ${C},
563
562
  ctx: &mut TxContext,
564
563
  ) {
565
- ${r}::${w}::sub_${t}(${E}source, amount${S});
564
+ ${r}::${w}::sub_${t}(${E}source, amount${x});
566
565
  add(user, amount, ctx);
567
- }`)}else if(C&&a)if($.length===1){let[,x]=_[0],I=x==="string"||x==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,P=Object.entries(e.enums??{}).map(([y])=>({type:K(y),module:y})),i=G(r,x,"bcs",P);n.push(`
568
- // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
569
- public(package) fun transfer_user_to_${m}(
570
- ${D} user: &mut UserStorage,
571
- target: &mut ${j},
572
- ${a}: u64,
566
+ }`)}else if(h&&c)if($.length===1){let[,C]=g[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(`
567
+ // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
568
+ public(package) fun transfer_user_to_${_}(
569
+ ${j} user: &mut UserStorage,
570
+ target: &mut ${D},
571
+ ${c}: u64,
573
572
  ctx: &TxContext,
574
573
  ) {
575
- ensure_has(user, ${a});
574
+ ensure_has(user, ${c});
576
575
  // Guard before any mutation: abort if target already holds this item.
577
- dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
578
- let raw = ${I};
579
- delete(user, ${a}, ctx);
580
- ${r}::${w}::set_${t}_data(${E}target, ${a}, raw${S});
576
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
577
+ let raw = ${K};
578
+ delete(user, ${c}, ctx);
579
+ ${r}::${w}::set_${t}_data(${E}target, ${c}, raw${x});
581
580
  }
582
581
 
583
- public(package) fun transfer_${m}_to_user(
584
- ${D} source: &mut ${j},
582
+ public(package) fun transfer_${_}_to_user(
583
+ ${j} source: &mut ${D},
585
584
  user: &mut UserStorage,
586
- ${a}: u64,
585
+ ${c}: u64,
587
586
  ctx: &mut TxContext,
588
587
  ) {
589
588
  // Guard before any mutation: abort if user already owns this item.
590
- ensure_has_not(user, ${a});
591
- let raw = ${r}::${w}::remove_${t}_data(${E}source, ${a}${S});
589
+ ensure_has_not(user, ${c});
590
+ let raw = ${r}::${w}::remove_${t}_data(${E}source, ${c}${x});
592
591
  let mut bcs = sui::bcs::new(raw);
593
- let value = ${i};
594
- set(user, ${a}, value, ctx);
592
+ let value = ${a};
593
+ set(user, ${c}, value, ctx);
595
594
  }`)}else n.push(`
596
- // \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (keyed, multi-field) \u2500
597
- public(package) fun transfer_user_to_${m}(
598
- ${D} user: &mut UserStorage,
599
- target: &mut ${j},
600
- ${a}: u64,
595
+ // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed, multi-field) \u2500
596
+ public(package) fun transfer_user_to_${_}(
597
+ ${j} user: &mut UserStorage,
598
+ target: &mut ${D},
599
+ ${c}: u64,
601
600
  ctx: &TxContext,
602
601
  ) {
603
- ensure_has(user, ${a});
602
+ ensure_has(user, ${c});
604
603
  // Guard before any mutation: abort if target already holds this item.
605
- dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
606
- let data = encode_struct(get_struct(user, ${a}));
607
- delete(user, ${a}, ctx);
604
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
605
+ let data = encode_struct(get_struct(user, ${c}));
606
+ delete(user, ${c}, ctx);
608
607
  let raw: vector<u8> = sui::bcs::to_bytes(&data);
609
- ${r}::${w}::set_${t}_data(${E}target, ${a}, raw${S});
608
+ ${r}::${w}::set_${t}_data(${E}target, ${c}, raw${x});
610
609
  }
611
610
 
612
- public(package) fun transfer_${m}_to_user(
613
- ${D} source: &mut ${j},
611
+ public(package) fun transfer_${_}_to_user(
612
+ ${j} source: &mut ${D},
614
613
  user: &mut UserStorage,
615
- ${a}: u64,
614
+ ${c}: u64,
616
615
  ctx: &mut TxContext,
617
616
  ) {
618
617
  // Guard before any mutation: abort if user already owns this item.
619
- ensure_has_not(user, ${a});
620
- let raw = ${r}::${w}::remove_${t}_data(${E}source, ${a}${S});
618
+ ensure_has_not(user, ${c});
619
+ let raw = ${r}::${w}::remove_${t}_data(${E}source, ${c}${x});
621
620
  let decoded = decode(raw);
622
- set_struct(user, ${a}, decoded, ctx);
623
- }`)}}if(s.listable){let c=!!s.fungible,f=!c&&u.length>0,C=f?u[0]:null,a=`b"${t}"`;if(c&&$.length===1)n.push(`
621
+ set_struct(user, ${c}, decoded, ctx);
622
+ }`)}}if(s.listable){let o=!!s.fungible,p=!o&&u.length>0,h=p?u[0]:null,c=`b"${t}"`;if(o&&$.length===1)n.push(`
624
623
  // \u2500\u2500\u2500 listable: market protocol (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
625
624
  // Package-level helpers: call these from your system functions.
626
625
  // Add pause checks, access control, and custom logic there.
@@ -634,7 +633,7 @@ ${D} source: &mut ${j},
634
633
  dubhe::dapp_system::take_fungible_record<DappKey, CoinType>(
635
634
  dapp_key::new(),
636
635
  user_storage,
637
- ${a},
636
+ ${c},
638
637
  { let mut k = vector::empty(); k.push_back(TABLE_NAME); k },
639
638
  b"${$[0]}",
640
639
  amount,
@@ -675,28 +674,28 @@ ${D} source: &mut ${j},
675
674
  dubhe::dapp_system::expire_fungible_listing<DappKey, CoinType>(
676
675
  dapp_key::new(), listing, user_storage, ctx
677
676
  );
678
- }`);else if(f&&C){let m=u.map(v=>`${v}: ${l[v]}`).join(`,
679
- `),h=u.map(v=>`record_key.push_back(sui::bcs::to_bytes(&${v}));`).join(`
677
+ }`);else if(p&&h){let _=u.map(k=>`${k}: ${l[k]}`).join(`,
678
+ `),v=u.map(k=>`record_key.push_back(sui::bcs::to_bytes(&${k}));`).join(`
680
679
  `);n.push(`
681
680
  // \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
682
681
  // Package-level helpers: call these from your system functions.
683
682
  // Add pause checks, access control, and custom logic there.
684
683
  public(package) fun list<CoinType>(
685
684
  user_storage: &mut UserStorage,
686
- ${m},
685
+ ${_},
687
686
  price: u64,
688
687
  listed_until: std::option::Option<u64>,
689
688
  ctx: &mut TxContext,
690
689
  ) {
691
690
  let mut record_key = vector::empty();
692
691
  record_key.push_back(TABLE_NAME);
693
- ${h}
692
+ ${v}
694
693
  dubhe::dapp_system::take_record<DappKey, CoinType>(
695
694
  dapp_key::new(),
696
695
  user_storage,
697
- ${a},
696
+ ${c},
698
697
  record_key,
699
- vector[${$.map(v=>`b"${v}"`).join(", ")}],
698
+ vector[${$.map(k=>`b"${k}"`).join(", ")}],
700
699
  price,
701
700
  listed_until,
702
701
  ctx,
@@ -735,17 +734,17 @@ ${D} source: &mut ${j},
735
734
  dapp_key::new(), listing, user_storage, ctx
736
735
  );
737
736
  }`)}}return n.join(`
738
- `)}import nt from"node:path";function W(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ot(e){return e==="string"||e==="String"?"String":e}function Q(e){return`dubhe::dapp_service::ObjectStorage<${e}>`}function it(e,t){let s=W(e),n=Q(s),r=[];for(let[o,d]of Object.entries(t.fields)){let l=ot(d);r.push(`
739
- public fun get_${o}(storage: &${n}): ${l} {
740
- dubhe::dapp_system::get_object_field<${s}, ${l}>(storage, b"${o}")
737
+ `)}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(`
738
+ public fun get_${i}(storage: &${n}): ${l} {
739
+ dubhe::dapp_system::get_object_field<${s}, ${l}>(storage, b"${i}")
741
740
  }
742
741
 
743
- public(package) fun set_${o}(storage: &mut ${n}, value: ${l}) {
742
+ public(package) fun set_${i}(storage: &mut ${n}, value: ${l}) {
744
743
  dubhe::dapp_system::set_object_field<DappKey, ${s}, ${l}>(
745
- dapp_key::new(), storage, b"${o}", value
744
+ dapp_key::new(), storage, b"${i}", value
746
745
  );
747
746
  }`)}return r.join(`
748
- `)}function at(e,t){let s=W(e),n=Q(s);return`
747
+ `)}function ut(e,t){let s=W(e),n=N(s);return`
749
748
  public fun get_${t}(storage: &${n}): u64 {
750
749
  if (dubhe::dapp_system::has_object_field<${s}, u64>(storage, b"${t}")) {
751
750
  dubhe::dapp_system::get_object_field<${s}, u64>(storage, b"${t}")
@@ -765,7 +764,7 @@ ${D} source: &mut ${j},
765
764
  dubhe::dapp_system::set_object_field<DappKey, ${s}, u64>(
766
765
  dapp_key::new(), storage, b"${t}", current - amount
767
766
  );
768
- }`}function ct(e,t,s){let n=W(e),r=Q(n);return`
767
+ }`}function pt(e,t,s){let n=W(e),r=N(n);return`
769
768
  public fun has_${t}(storage: &${r}, ${s}: u64): bool {
770
769
  let key = sui::bcs::to_bytes(&${s});
771
770
  dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key)
@@ -788,51 +787,51 @@ ${D} source: &mut ${j},
788
787
  let key = sui::bcs::to_bytes(&${s});
789
788
  assert!(dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key), EFieldNotFound);
790
789
  dubhe::dapp_system::remove_object_field<DappKey, ${n}, vector<u8>>(dapp_key::new(), storage, key)
791
- }`}function ut(e,t,s,n,r){let o=r.resources??{},d=r.objects??{},l=r.scenes??{},u=W(t),_=Q(u),$=[],p=[];for(let c of n){let g=d[c]??l[c];if(!g)continue;let f=g.accepts??[],C=W(c);$.push(` use ${e}::${c};`);let a=f.filter(m=>s.includes(m));for(let m of a){let h=o[m];if(!h||typeof h=="string")continue;let v=h,j=!!l[c],w=`${e}::${c}::${C}`,F=j?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,D=j?l[c]:void 0,E=D?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${D.authorization.permit}::${W(D.authorization.permit)}>`:"",S=D?.authorization.kind==="permit"?` source_permit: &${E},
792
- `:"",x=D?.authorization.kind==="permit"?"source_permit, ":"",I=D?.authorization.kind==="permit"?` ctx: &TxContext,
793
- `:"",P=D?.authorization.kind==="permit"?", ctx":"";if(!v.fungible&&v.keys?.length){let i=v.keys[0];p.push(`
794
- /// Transfer ${m} (keyed item) from ${c} into this ${t}.
795
- public(package) fun transfer_${c}_to_${t}_${m}(
796
- ${S} from: &mut ${F},
797
- to: &mut ${_},
798
- ${i}: u64,
799
- ${I}
790
+ }`}function dt(e,t,s,n,r){let i=r.resources??{},d=r.objects??{},l=r.scenes??{},u=W(t),g=N(u),$=[],f=[];for(let o of n){let b=d[o]??l[o];if(!b)continue;let p=b.accepts??[],h=W(o);$.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},
791
+ `:"",C=j?.authorization.kind==="permit"?"source_permit, ":"",K=j?.authorization.kind==="permit"?` ctx: &TxContext,
792
+ `:"",P=j?.authorization.kind==="permit"?", ctx":"";if(!k.fungible&&k.keys?.length){let a=k.keys[0];f.push(`
793
+ /// Transfer ${_} (keyed item) from ${o} into this ${t}.
794
+ public(package) fun transfer_${o}_to_${t}_${_}(
795
+ ${x} from: &mut ${F},
796
+ to: &mut ${g},
797
+ ${a}: u64,
798
+ ${K}
800
799
  ) {
801
- let data = ${c}::remove_${m}_data(${x}from, ${i}${P});
802
- set_${m}_data(to, ${i}, data);
803
- }`)}else p.push(`
804
- /// Transfer ${m} (fungible) from ${c} into this ${t}.
805
- public(package) fun transfer_${c}_to_${t}_${m}(
806
- ${S} from: &mut ${F},
807
- to: &mut ${_},
800
+ let data = ${o}::remove_${_}_data(${C}from, ${a}${P});
801
+ set_${_}_data(to, ${a}, data);
802
+ }`)}else f.push(`
803
+ /// Transfer ${_} (fungible) from ${o} into this ${t}.
804
+ public(package) fun transfer_${o}_to_${t}_${_}(
805
+ ${x} from: &mut ${F},
806
+ to: &mut ${g},
808
807
  amount: u64,
809
- ${I}
808
+ ${K}
810
809
  ) {
811
- ${c}::sub_${m}(${x}from, amount${P});
812
- add_${m}(to, amount);
813
- }`)}}return{imports:$,functions:p}}async function Pe(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
814
- \u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=W(r),l=`${d}Storage`,u=`b"${r}"`,_=it(r,o),$=o.accepts??[],p=[];for(let k of $){let T=n[k];if(!T||typeof T=="string")continue;let M=T;!M.fungible&&M.keys?.length?p.push(ct(r,k,M.keys[0])):p.push(at(r,k))}let{imports:c,functions:g}=ut(s,r,$,o.acceptsFrom??[],e),f=o.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",C=`dubhe::dapp_service::ObjectStorage<${d}>`,a=`
815
- public fun assert_${r}_id(storage: &${C}, expected: vector<u8>) {
810
+ ${o}::sub_${_}(${C}from, amount${P});
811
+ add_${_}(to, amount);
812
+ }`)}}return{imports:$,functions:f}}async function Le(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
813
+ \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}"`,g=ct(r,i),$=i.accepts??[],f=[];for(let S of $){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,$,i.acceptsFrom??[],e),p=i.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",h=`dubhe::dapp_service::ObjectStorage<${d}>`,c=`
814
+ public fun assert_${r}_id(storage: &${h}, expected: vector<u8>) {
816
815
  assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);
817
- }`,m=`
818
- public fun entity_id(storage: &${C}): vector<u8> {
816
+ }`,_=`
817
+ public fun entity_id(storage: &${h}): vector<u8> {
819
818
  *dubhe::dapp_service::object_storage_entity_id(storage)
820
- }`,j=Object.values(o.fields).some(k=>k==="string"||k==="String"||k==="vector<String>")?`
821
- use std::ascii::String;`:"",w=$.some(k=>{let T=n[k];return!T||typeof T=="string"?!1:!!T.keys?.length&&!T.fungible}),F=$.some(k=>{let T=n[k];return!T||typeof T=="string"?!1:!!T.fungible}),D=w,E=F,S=w,x=!!o.adminOnly,I=[D?` #[error]
819
+ }`,D=Object.values(i.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
820
+ use std::ascii::String;`:"",w=$.some(S=>{let T=n[S];return!T||typeof T=="string"?!1:!!T.keys?.length&&!T.fungible}),F=$.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]
822
821
  const EFieldNotFound: vector<u8> = b"Field not found";`:"",E?` #[error]
823
- const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",S?` #[error]
822
+ const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",x?` #[error]
824
823
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:"",` #[error]
825
- const EWrongEntityId: vector<u8> = b"Wrong entity id";`,x?` #[error]
824
+ const EWrongEntityId: vector<u8> = b"Wrong entity id";`,C?` #[error]
826
825
  const ENoPermission: vector<u8> = b"Caller does not have permission";`:""].filter(Boolean).join(`
827
- `),P=c.length>0?`
828
- `+c.join(`
829
- `):"",i=`dubhe::dapp_service::ObjectStorage<${d}>`,y=`module ${s}::${r} {
826
+ `),P=o.length>0?`
827
+ `+o.join(`
828
+ `):"",a=`dubhe::dapp_service::ObjectStorage<${d}>`,y=`module ${s}::${r} {
830
829
  use dubhe::dapp_service::DappStorage;
831
830
  use ${s}::dapp_key;
832
- use ${s}::dapp_key::DappKey;${j}${P}
831
+ use ${s}::dapp_key::DappKey;${D}${P}
833
832
 
834
833
  // \u2500\u2500\u2500 Error constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
835
- ${I}
834
+ ${K}
836
835
 
837
836
  const TYPE_TAG: vector<u8> = ${u};
838
837
 
@@ -843,36 +842,36 @@ ${I}
843
842
  public struct ${d} has copy, drop {}
844
843
 
845
844
  // \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
846
- ${m}
845
+ ${_}
847
846
 
848
- ${a}
847
+ ${c}
849
848
 
850
849
  // \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
851
- ${_}
850
+ ${g}
852
851
 
853
852
  // \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
854
- ${p.join(`
853
+ ${f.join(`
855
854
  `)}
856
855
 
857
856
  // \u2500\u2500\u2500 acceptsFrom: cross-storage transfer functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
858
- ${g.join(`
857
+ ${b.join(`
859
858
  `)}
860
859
 
861
860
  // \u2500\u2500\u2500 Lifecycle entry functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
862
- public fun create_${r}(
861
+ public(package) fun create_${r}(
863
862
  dapp_storage: &mut DappStorage,
864
863
  entity_id: vector<u8>,
865
864
  ctx: &mut TxContext,
866
865
  ) {
867
- ${f}
866
+ ${p}
868
867
  dubhe::dapp_system::create_and_share_typed_object<DappKey, ${d}>(
869
868
  dapp_key::new(), dapp_storage, TYPE_TAG, entity_id, ctx
870
869
  );
871
870
  }
872
871
 
873
- public fun destroy_${r}(
872
+ public(package) fun destroy_${r}(
874
873
  dapp_storage: &mut DappStorage,
875
- storage: ${i},
874
+ storage: ${a},
876
875
  _ctx: &TxContext,
877
876
  ) {
878
877
  dubhe::dapp_system::destroy_typed_object<DappKey, ${d}>(
@@ -880,13 +879,13 @@ ${f}
880
879
  );
881
880
  }
882
881
  }
883
- `;await A(y,nt.join(t,`${r}.move`),"formatAndWriteMove")}}import pt from"node:path";function dt(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function Le(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
884
- \u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=dt(n),o=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
882
+ `;await A(y,it.join(t,`${r}.move`),"formatAndWriteMove")}}import lt 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 Re(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
883
+ \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} {
885
884
  use dubhe::dapp_service::{Self, DappStorage};
886
885
  use ${s}::dapp_key;
887
886
  use ${s}::dapp_key::DappKey;
888
887
 
889
- const PERMIT_TYPE: vector<u8> = ${o};
888
+ const PERMIT_TYPE: vector<u8> = ${i};
890
889
 
891
890
  #[error]
892
891
  const EPermitNotExpiredYet: vector<u8> = b"Scene permit is still active";
@@ -998,7 +997,7 @@ ${f}
998
997
  );
999
998
  }
1000
999
  }
1001
- `;await A(l,pt.join(t,`${n}.move`),"formatAndWriteMove")}}import lt from"node:path";function Y(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function $t(e){return e==="string"||e==="String"?"String":e}function X(e){return`dubhe::dapp_service::SceneStorage<${e}>`}function q(e,t){if(t.authorization.kind==="permit")return`${e.name}::${t.authorization.permit}::${Y(t.authorization.permit)}`}function Z(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${q(e,t)}>`}function gt(e,t,s){let n=Y(t),r=X(n),o=q(e,s),d=Z(e,s),l=[];for(let[u,_]of Object.entries(s.fields)){let $=$t(_);s.authorization.kind==="permit"&&o&&d?l.push(`
1000
+ `;await A(l,lt.join(t,`${n}.move`),"formatAndWriteMove")}}import gt 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,g]of Object.entries(s.fields)){let $=_t(g);s.authorization.kind==="permit"&&i&&d?l.push(`
1002
1001
  public fun get_${u}(storage: &${r}): ${$} {
1003
1002
  dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
1004
1003
  }
@@ -1009,7 +1008,7 @@ ${f}
1009
1008
  value: ${$},
1010
1009
  ctx: &TxContext,
1011
1010
  ) {
1012
- dubhe::dapp_system::set_scene_field<DappKey, ${o}, ${n}, ${$}>(
1011
+ dubhe::dapp_system::set_scene_field<DappKey, ${i}, ${n}, ${$}>(
1013
1012
  dapp_key::new(), permit, storage, b"${u}", value, ctx
1014
1013
  );
1015
1014
  }
@@ -1034,103 +1033,103 @@ ${f}
1034
1033
  dapp_key::new(), storage, b"${u}"
1035
1034
  )
1036
1035
  }`)}return l.join(`
1037
- `)}function N(e,t){let s=Z(e,t);return t.authorization.kind!=="permit"||!s?"":` permit: &${s},
1038
- `}function ee(e){return e.authorization.kind==="permit"?` ctx: &TxContext,
1039
- `:""}function le(e,t,s,n,r,o){let d=q(e,t);return t.authorization.kind==="permit"&&d?`dubhe::dapp_system::set_scene_field<DappKey, ${d}, ${s}, ${n}>(
1040
- dapp_key::new(), permit, storage, ${r}, ${o}, ctx
1036
+ `)}function ee(e,t){let s=X(e,t);return t.authorization.kind!=="permit"||!s?"":` permit: &${s},
1037
+ `}function te(e){return e.authorization.kind==="permit"?` ctx: &TxContext,
1038
+ `:""}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}>(
1039
+ dapp_key::new(), permit, storage, ${r}, ${i}, ctx
1041
1040
  );`:`dubhe::dapp_system::set_scene_field_system<DappKey, ${s}, ${n}>(
1042
- dapp_key::new(), storage, ${r}, ${o}
1043
- );`}function _t(e,t,s,n,r){let o=q(e,t);return t.authorization.kind==="permit"&&o?`dubhe::dapp_system::remove_scene_field<DappKey, ${o}, ${s}, ${n}>(
1041
+ dapp_key::new(), storage, ${r}, ${i}
1042
+ );`}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}>(
1044
1043
  dapp_key::new(), permit, storage, ${r}, ctx
1045
1044
  )`:`dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${s}, ${n}>(
1046
1045
  dapp_key::new(), storage, ${r}
1047
- )`}function mt(e,t,s,n){let r=Y(t),o=X(r);return`
1048
- public fun get_${n}(storage: &${o}): u64 {
1046
+ )`}function ft(e,t,s,n){let r=Y(t),i=Q(r);return`
1047
+ public fun get_${n}(storage: &${i}): u64 {
1049
1048
  if (dubhe::dapp_system::has_scene_field<${r}, u64>(storage, b"${n}")) {
1050
1049
  dubhe::dapp_system::get_scene_field<${r}, u64>(storage, b"${n}")
1051
1050
  } else { 0 }
1052
1051
  }
1053
1052
 
1054
1053
  public(package) fun add_${n}(
1055
- ${N(e,s)} storage: &mut ${o},
1054
+ ${ee(e,s)} storage: &mut ${i},
1056
1055
  amount: u64,
1057
- ${ee(s)} ) {
1056
+ ${te(s)} ) {
1058
1057
  let current = get_${n}(storage);
1059
1058
  ${le(e,s,r,"u64",`b"${n}"`,"current + amount")}
1060
1059
  }
1061
1060
 
1062
1061
  public(package) fun sub_${n}(
1063
- ${N(e,s)} storage: &mut ${o},
1062
+ ${ee(e,s)} storage: &mut ${i},
1064
1063
  amount: u64,
1065
- ${ee(s)} ) {
1064
+ ${te(s)} ) {
1066
1065
  let current = get_${n}(storage);
1067
1066
  assert!(current >= amount, EInsufficientAmount);
1068
1067
  ${le(e,s,r,"u64",`b"${n}"`,"current - amount")}
1069
- }`}function bt(e,t,s,n,r){let o=Y(t),d=X(o);return`
1068
+ }`}function yt(e,t,s,n,r){let i=Y(t),d=Q(i);return`
1070
1069
  public fun has_${n}(storage: &${d}, ${r}: u64): bool {
1071
1070
  let key = sui::bcs::to_bytes(&${r});
1072
- dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key)
1071
+ dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key)
1073
1072
  }
1074
1073
 
1075
1074
  public fun get_${n}_data(storage: &${d}, ${r}: u64): vector<u8> {
1076
1075
  let key = sui::bcs::to_bytes(&${r});
1077
- dubhe::dapp_system::get_scene_field<${o}, vector<u8>>(storage, key)
1076
+ dubhe::dapp_system::get_scene_field<${i}, vector<u8>>(storage, key)
1078
1077
  }
1079
1078
 
1080
1079
  public(package) fun set_${n}_data(
1081
- ${N(e,s)} storage: &mut ${d},
1080
+ ${ee(e,s)} storage: &mut ${d},
1082
1081
  ${r}: u64,
1083
1082
  data: vector<u8>,
1084
- ${ee(s)} ) {
1083
+ ${te(s)} ) {
1085
1084
  let key = sui::bcs::to_bytes(&${r});
1086
- assert!(!dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key), EDuplicateItemId);
1087
- ${le(e,s,o,"vector<u8>","key","data")}
1085
+ assert!(!dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key), EDuplicateItemId);
1086
+ ${le(e,s,i,"vector<u8>","key","data")}
1088
1087
  }
1089
1088
 
1090
1089
  public(package) fun remove_${n}_data(
1091
- ${N(e,s)} storage: &mut ${d},
1090
+ ${ee(e,s)} storage: &mut ${d},
1092
1091
  ${r}: u64,
1093
- ${ee(s)} ): vector<u8> {
1092
+ ${te(s)} ): vector<u8> {
1094
1093
  let key = sui::bcs::to_bytes(&${r});
1095
- assert!(dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key), EFieldNotFound);
1096
- ${_t(e,s,o,"vector<u8>","key")}
1097
- }`}function ft(e,t,s,n,r,o){let d=o.resources??{},l=o.objects??{},u=o.scenes??{},_=Y(t),$=X(_),p=[],c=[],g=Z(o,s),f=s.authorization.kind==="permit"&&g?` dest_permit: &${g},
1098
- `:"",C=s.authorization.kind==="permit"?"dest_permit, ":"",a=s.authorization.kind==="permit"?` ctx: &TxContext,
1099
- `:"",m=s.authorization.kind==="permit"?", ctx":"";for(let h of r){let v=l[h]??u[h];if(!v)continue;let j=v.accepts??[],w=Y(h);p.push(` use ${e}::${h};`);let F=!!u[h],D=`${e}::${h}::${w}`,E=F?`dubhe::dapp_service::SceneStorage<${D}>`:`dubhe::dapp_service::ObjectStorage<${D}>`,S=F?v:void 0,x=S?Z(o,S):void 0,I=S?.authorization.kind==="permit"&&x?` source_permit: &${x},
1100
- `:"",P=S?.authorization.kind==="permit"?"source_permit, ":"",i=S?.authorization.kind==="permit"?", ctx":"",y=j.filter(k=>n.includes(k));for(let k of y){let T=d[k];if(!T||typeof T=="string")continue;let M=T;if(!M.fungible&&M.keys?.length){let b=M.keys[0];c.push(`
1101
- public(package) fun transfer_${h}_to_${t}_${k}(
1102
- ${I}${f} from: &mut ${E},
1094
+ assert!(dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key), EFieldNotFound);
1095
+ ${bt(e,s,i,"vector<u8>","key")}
1096
+ }`}function ht(e,t,s,n,r,i){let d=i.resources??{},l=i.objects??{},u=i.scenes??{},g=Y(t),$=Q(g),f=[],o=[],b=X(i,s),p=s.authorization.kind==="permit"&&b?` dest_permit: &${b},
1097
+ `:"",h=s.authorization.kind==="permit"?"dest_permit, ":"",c=s.authorization.kind==="permit"?` ctx: &TxContext,
1098
+ `:"",_=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},
1099
+ `:"",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(`
1100
+ public(package) fun transfer_${v}_to_${t}_${S}(
1101
+ ${K}${p} from: &mut ${E},
1103
1102
  to: &mut ${$},
1104
- ${b}: u64,
1105
- ${a} ) {
1106
- let data = ${h}::remove_${k}_data(${P}from, ${b}${i});
1107
- set_${k}_data(${C}to, ${b}, data${m});
1108
- }`)}else c.push(`
1109
- public(package) fun transfer_${h}_to_${t}_${k}(
1110
- ${I}${f} from: &mut ${E},
1103
+ ${J}: u64,
1104
+ ${c} ) {
1105
+ let data = ${v}::remove_${S}_data(${P}from, ${J}${a});
1106
+ set_${S}_data(${h}to, ${J}, data${_});
1107
+ }`)}else o.push(`
1108
+ public(package) fun transfer_${v}_to_${t}_${S}(
1109
+ ${K}${p} from: &mut ${E},
1111
1110
  to: &mut ${$},
1112
1111
  amount: u64,
1113
- ${a} ) {
1114
- ${h}::sub_${k}(${P}from, amount${i});
1115
- add_${k}(${C}to, amount${m});
1116
- }`)}}return{imports:p,functions:c}}async function Re(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
1117
- \u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=Y(r),l=`b"${r}"`,u=X(d),_=gt(e,r,o),$=o.accepts??[],p=[];for(let S of $){let x=n[S];if(!x||typeof x=="string")continue;let I=x;!I.fungible&&I.keys?.length?p.push(bt(e,r,o,S,I.keys[0])):p.push(mt(e,r,o,S))}let{imports:c,functions:g}=ft(s,r,o,$,o.acceptsFrom??[],e),a=Object.values(o.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
1118
- use std::ascii::String;`:"",m=$.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.keys?.length&&!x.fungible}),h=$.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.fungible}),v=[m?` #[error]
1119
- const EFieldNotFound: vector<u8> = b"Field not found";`:"",h?` #[error]
1120
- const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",m?` #[error]
1112
+ ${c} ) {
1113
+ ${v}::sub_${S}(${P}from, amount${a});
1114
+ add_${S}(${h}to, amount${_});
1115
+ }`)}}return{imports:f,functions:o}}async function ze(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
1116
+ \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),g=mt(e,r,i),$=i.accepts??[],f=[];for(let x of $){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,$,i.acceptsFrom??[],e),c=Object.values(i.fields).some(x=>x==="string"||x==="String"||x==="vector<String>")?`
1117
+ use std::ascii::String;`:"",_=$.some(x=>{let C=n[x];return!C||typeof C=="string"?!1:!!C.keys?.length&&!C.fungible}),v=$.some(x=>{let C=n[x];return!C||typeof C=="string"?!1:!!C.fungible}),k=[_?` #[error]
1118
+ const EFieldNotFound: vector<u8> = b"Field not found";`:"",v?` #[error]
1119
+ const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",_?` #[error]
1121
1120
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:""].filter(Boolean).join(`
1122
- `),j=v.length>0?`
1121
+ `),D=k.length>0?`
1123
1122
  // \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
1124
- ${v}
1125
- `:"",w=c.length>0?`
1126
- `+c.join(`
1127
- `):"",F=Z(e,o),D=o.authorization.kind==="permit"&&F?`
1123
+ ${k}
1124
+ `:"",w=o.length>0?`
1125
+ `+o.join(`
1126
+ `):"",F=X(e,i),j=i.authorization.kind==="permit"&&F?`
1128
1127
  public(package) fun new_${r}_with_permit(
1129
1128
  dapp_storage: &DappStorage,
1130
1129
  permit: &${F},
1131
1130
  ctx: &mut TxContext,
1132
1131
  ): ${u} {
1133
- dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${q(e,o)}, ${d}>(
1132
+ dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${q(e,i)}, ${d}>(
1134
1133
  dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
1135
1134
  )
1136
1135
  }
@@ -1140,7 +1139,7 @@ ${v}
1140
1139
  permit: &${F},
1141
1140
  ctx: &mut TxContext,
1142
1141
  ) {
1143
- dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${q(e,o)}, ${d}>(
1142
+ dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${q(e,i)}, ${d}>(
1144
1143
  dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
1145
1144
  );
1146
1145
  }`:`
@@ -1163,26 +1162,26 @@ ${v}
1163
1162
  }`,E=`module ${s}::${r} {
1164
1163
  use dubhe::dapp_service::DappStorage;
1165
1164
  use ${s}::dapp_key;
1166
- use ${s}::dapp_key::DappKey;${a}${w}
1167
- ${j}
1165
+ use ${s}::dapp_key::DappKey;${c}${w}
1166
+ ${D}
1168
1167
  const SCENE_TYPE: vector<u8> = ${l};
1169
1168
 
1170
1169
  /// Phantom type that distinguishes this scene storage at compile time.
1171
1170
  public struct ${d} has copy, drop {}
1172
1171
 
1173
1172
  // \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
1174
- ${_}
1173
+ ${g}
1175
1174
 
1176
1175
  // \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
1177
- ${p.join(`
1176
+ ${f.join(`
1178
1177
  `)}
1179
1178
 
1180
1179
  // \u2500\u2500\u2500 acceptsFrom: cross-storage transfer functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1181
- ${g.join(`
1180
+ ${b.join(`
1182
1181
  `)}
1183
1182
 
1184
1183
  // \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
1185
- ${D}
1184
+ ${j}
1186
1185
 
1187
1186
  public(package) fun share_${r}(storage: ${u}) {
1188
1187
  dubhe::dapp_system::share_scene_storage<DappKey, ${d}>(
@@ -1196,7 +1195,7 @@ ${D}
1196
1195
  );
1197
1196
  }
1198
1197
  }
1199
- `;await A(E,lt.join(t,`${r}.move`),"formatAndWriteMove")}}async function ze(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
1198
+ `;await A(E,gt.join(t,`${r}.move`),"formatAndWriteMove")}}async function Be(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
1200
1199
  use dubhe::dapp_service::{DappHub, DappStorage};
1201
1200
  use dubhe::dapp_system;
1202
1201
  use ${e.name}::dapp_key::DappKey;
@@ -1213,7 +1212,7 @@ ${D}
1213
1212
  dapp_system::create_user_storage<DappKey>(dapp_hub, dapp_storage, ctx);
1214
1213
  }
1215
1214
  }
1216
- `;await A(s,t,"formatAndWriteMove")}import Be from"chalk";import{existsSync as yt,readFileSync as ht,writeFileSync as He}from"fs";import vt from"node:path";function kt(e){if(typeof e=="string")return{value:e};let t={};for(let[s,n]of Object.entries(e.fields??{}))t[s]=n;return t}function We(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function St(e){let t={};for(let[r,o]of Object.entries(e.resources??{}))t[r]=kt(o);let s={};for(let[r,o]of Object.entries(e.objects??{}))s[r]=We(o);let n={};for(let[r,o]of Object.entries(e.scenes??{}))n[r]=We(o);return{version:1,resources:t,objects:s,scenes:n}}function $e(e,t,s){for(let[n,r]of Object.entries(s)){let o=t[n];if(o)for(let[d,l]of Object.entries(o)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
1215
+ `;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 $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}:
1217
1216
  Field "${d}" was removed.
1218
1217
 
1219
1218
  Resources, objects, and scenes are stored as raw bytes on-chain.
@@ -1221,10 +1220,10 @@ Removing fields corrupts existing data. Use a new name (e.g. "${n}_v2") for brea
1221
1220
  Field "${d}" type changed from "${l}" to "${r[d]}".
1222
1221
 
1223
1222
  Resources, objects, and scenes are stored as raw bytes on-chain.
1224
- Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function Ye(e,t){let s=vt.join(e,`${t.name}.lock.json`),n=St(t);if(yt(s)){let r;try{r=JSON.parse(ht(s,"utf-8"))}catch{console.warn(Be.yellow("[dubhe]")+` Could not parse ${Be.bold(s)}, skipping break-check.`),He(s,JSON.stringify(n,null,2)+`
1225
- `,"utf-8");return}$e("resources",r.resources??{},n.resources),$e("objects",r.objects??{},n.objects),$e("scenes",r.scenes??{},n.scenes)}He(s,JSON.stringify(n,null,2)+`
1226
- `,"utf-8")}import U from"chalk";var te=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function se(e){let t=e.resources??{},s=e.objects??{},n=e.permits??{},r=e.scenes??{},o=new Set(Object.keys(t)),d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),_=new Set;for(let p of o)(d.has(p)||l.has(p)||u.has(p))&&_.add(p);for(let p of d)(l.has(p)||u.has(p))&&_.add(p);for(let p of l)u.has(p)&&_.add(p);if(_.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[..._].sort().join(", ")}`);let $=new Set;for(let[p,c]of Object.entries(s)){for(let g of c.accepts??[]){$.add(g);let f=t[g];if(!f)throw new Error(`objects.${p}.accepts references '${g}' which is not defined in resources`);if(typeof f!="string"&&!f.transferable)throw new Error(`objects.${p}.accepts includes '${g}', but resources.${g} is missing transferable: true. Add transferable: true to resources.${g} to enable cross-storage transfers.`)}for(let g of c.acceptsFrom??[]){let f=!!s[g],C=!!r[g];if(!f&&!C)throw new Error(`objects.${p}.acceptsFrom references '${g}' which is not defined in objects or scenes`)}}for(let[p,c]of Object.entries(r)){if(!c.authorization)throw new Error(`scenes.${p} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(c.authorization.kind==="permit"){if(!n[c.authorization.permit])throw new Error(`scenes.${p}.authorization references permit '${c.authorization.permit}', but permits.${c.authorization.permit} is not defined`)}else if(c.authorization.kind!=="system")throw new Error(`scenes.${p}.authorization.kind must be 'system' or 'permit'`);for(let g of c.accepts??[]){$.add(g);let f=t[g];if(!f)throw new Error(`scenes.${p}.accepts references '${g}' which is not defined in resources`);if(typeof f!="string"&&!f.transferable)throw new Error(`scenes.${p}.accepts includes '${g}', but resources.${g} is missing transferable: true. Add transferable: true to resources.${g} to enable cross-storage transfers.`)}for(let g of c.acceptsFrom??[]){let f=!!s[g],C=!!r[g];if(!f&&!C)throw new Error(`scenes.${p}.acceptsFrom references '${g}' which is not defined in objects or scenes`)}}for(let[p,c]of Object.entries(t)){if(typeof c=="string")continue;let g=c;if(g.offchain){if(g.listable)throw new Error(`resources.${p} has both offchain: true and listable: true. offchain resources emit events but store no on-chain state, so there is nothing to take out and place into a Listing.`);if(g.transferable)throw new Error(`resources.${p} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if(g.reactive)throw new Error(`resources.${p} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);g.fungible&&te(`resources.${U.bold(p)} has both ${U.cyan("offchain: true")} and ${U.cyan("fungible: true")}. offchain fungible events are emitted only; no on-chain balance is maintained and no add/sub functions are generated. This is unusual \u2014 verify your intent.`)}if(g.reactive&&g.fungible&&te(`resources.${U.bold(p)} has both ${U.cyan("reactive: true")} and ${U.cyan("fungible: true")}. Fungible quantity changes (add/sub) do not suit reactive cross-user writes. Consider using a transfer function instead.`),g.global){if(g.reactive)throw new Error(`resources.${p} has both global: true and reactive: true. global resources live in DappStorage (shared), not in UserStorage. Reactive writes operate between two UserStorage objects and are incompatible with global resources.`);if(g.listable)throw new Error(`resources.${p} has both global: true and listable: true. global resources live in DappStorage and cannot be individually listed for sale. listable requires per-user ownership in UserStorage.`);if(g.transferable)throw new Error(`resources.${p} has both global: true and transferable: true. global resources live in DappStorage and are not owned by individual users. transferable requires per-user state in UserStorage or ObjectStorage.`)}g.fungible&&g.listable&&te(`resources.${U.bold(p)} has both ${U.cyan("fungible: true")} and ${U.cyan("listable: true")}. The generated ${U.green(`list_${p}`)} entry function will include an ${U.cyan("amount")} parameter for partial listings.`),g.transferable&&!$.has(p)&&te(`resources.${U.bold(p)} has ${U.cyan("transferable: true")} but is not referenced in any ${U.cyan("objects.accepts")} or ${U.cyan("scenes.accepts")}. The cross-layer transfer functions will not be generated.`)}}import R from"node:path";async function xt(e,t,s,n=1){console.log(`
1227
- \u{1F680} Starting Code Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(` \u2514\u2500 Settlement Mode: ${n===1?"USER_PAYS":"DAPP_SUBSIDIZES"}`),se(t),Ye(e,t),console.log(e);let r=R.join(e,"src",t.name);V(`${r}`)&&ce(`${r}/sources/codegen`),V(`${r}/Move.toml`)||await he(t,e);let o=R.join(r,"sources","codegen","genesis.move");V(o)||await Ae(t,o,n);let d=R.join(r,"sources","codegen","init_test.move");V(d)||await Te(t,d);let l=R.join(r,"sources","codegen","dapp_key.move");V(l)||await xe(t,l);let u=R.join(r,"sources","scripts","deploy_hook.move");V(u)||await ke(t,u,n);let _=R.join(r,"sources","codegen","resources");await Ue(t,_);let $=R.join(r,"sources","codegen","objects");await Pe(t,$);let p=R.join(r,"sources","codegen","permits");await Le(t,p);let c=R.join(r,"sources","codegen","scenes");await Re(t,c);let g=R.join(r,"sources","codegen","enums");V(g)||await Oe(t,g),t.errors&&await je(t.name,t.errors,e);let f=R.join(r,"sources","codegen","user_storage_init.move");await ze(t,f),await De(t,e),await Se(t,e),console.log(`
1223
+ 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)+`
1224
+ `,"utf-8");return}$e("resources",r.resources??{},n.resources),$e("objects",r.objects??{},n.objects),$e("scenes",r.scenes??{},n.scenes)}We(s,JSON.stringify(n,null,2)+`
1225
+ `,"utf-8")}import U from"chalk";var se=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function Ge(e){ge(e,!1)}function ge(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)),g=new Set(Object.keys(i)),$=new Set;for(let o of d)(l.has(o)||u.has(o)||g.has(o))&&$.add(o);for(let o of l)(u.has(o)||g.has(o))&&$.add(o);for(let o of u)g.has(o)&&$.add(o);if($.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[...$].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 R from"node:path";async function wt(e,t,s,n=1){console.log(`
1226
+ \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"}`),ge(t),Ve(e,t),console.log(e);let r=R.join(e,"src",t.name);V(`${r}`)&&ce(`${r}/sources/codegen`),V(`${r}/Move.toml`)||await ve(t,e);let i=R.join(r,"sources","codegen","genesis.move");V(i)||await Ee(t,i,n);let d=R.join(r,"sources","codegen","init_test.move");V(d)||await Ae(t,d);let l=R.join(r,"sources","codegen","dapp_key.move");V(l)||await Ce(t,l);let u=R.join(r,"sources","scripts","deploy_hook.move");V(u)||await Se(t,u,n);let g=R.join(r,"sources","codegen","resources");await Pe(t,g);let $=R.join(r,"sources","codegen","objects");await Le(t,$);let f=R.join(r,"sources","codegen","permits");await Re(t,f);let o=R.join(r,"sources","codegen","scenes");await ze(t,o);let b=R.join(r,"sources","codegen","enums");V(b)||await Fe(t,b),t.errors&&await Te(t.name,t.errors,e);let p=R.join(r,"sources","codegen","user_storage_init.move");await Be(t,p),await je(t,e),await xe(t,e),console.log(`
1228
1227
  \u2705 Code Generation Complete!
1229
- `)}var Zs=xt;var Ns=e=>(se(e),e);import{findUp as Ct}from"find-up";import ge from"path";import wt from"esbuild";var re=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as Dt}from"fs";import{pathToFileURL as jt}from"url";import Tt from"os";var At=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],_e="dubhe.config.example.mjs";async function ur(e){e=await Ve(e);try{return await wt.build({entryPoints:[e],format:"esm",outfile:_e,platform:"node",bundle:!0,packages:"external"}),e=await Ve(_e,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Dt(_e,{force:!0})}}async function Ve(e,t){return e===void 0?e=await Et():ge.isAbsolute(e)||(e=ge.join(process.cwd(),e),e=ge.normalize(e)),t&&Tt.platform()==="win32"?jt(e).href:e}async function Et(){let e=await Ct(At);if(e===void 0)throw new re;return e}var Ot=(s=>(s.Event="event",s.Schema="schema",s))(Ot||{});export{Ot as SubscriptionKind,Ye as checkAndUpdateLock,xt as codegen,Ns as defineConfig,A as formatAndWriteMove,It as formatMove,Pe as generateObjects,Re as generateScenes,ur as loadConfig,Zs as schemaGen};
1228
+ `)}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,Le as generateObjects,ze as generateScenes,dr as loadConfig,Qs as schemaGen};
1230
1229
  //# sourceMappingURL=index.js.map