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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- import be from"prettier";import Je from"prettier-plugin-move-js";async function Ut(e,t){let s;t&&(s=await be.resolveConfig(t));try{return be.format(e,{plugins:[Je],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(n){let r;return n instanceof Error?r=n.message:r=n,console.log(`Error during output formatting: ${r}`),e}}import ye from"node:fs/promises";import Xe from"node:path";import fe from"debug";var ie=fe("dubhe:common"),Ze=fe("dubhe:common");ie.log=console.debug.bind(console);Ze.log=console.error.bind(console);var ae=ie.extend("codegen");ae.log=console.debug.bind(console);async function A(e,t,s){let n=e,r=`// Copyright (c) Obelisk Labs, Inc.
1
+ import ye from"prettier";import Xe from"prettier-plugin-move-js";async function Rt(e,t){let s;t&&(s=await ye.resolveConfig(t));try{return ye.format(e,{plugins:[Xe],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(n){let r;return n instanceof Error?r=n.message:r=n,console.log(`Error during output formatting: ${r}`),e}}import ve from"node:fs/promises";import Ne from"node:path";import he from"debug";var ce=he("dubhe:common"),Qe=he("dubhe:common");ce.log=console.debug.bind(console);Qe.log=console.error.bind(console);var ue=ce.extend("codegen");ue.log=console.debug.bind(console);async function E(e,t,s){let n=e,r=`// Copyright (c) Obelisk Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  /* Autogenerated file. Do not edit manually. */
5
5
 
6
6
  `,i=`#[test_only]
7
7
  `,d=r+n,l=`#[allow(lint(share_owned))]
8
- `;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=i+n:t.includes("genesis")&&(d=l+n),await ye.mkdir(Xe.dirname(t),{recursive:!0}),await ye.writeFile(t,d),ae(`${s}: ${t}`)}import{existsSync as V}from"fs";import Z from"fs";function ce(e){Z.existsSync(e)&&(Z.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;Z.lstatSync(s).isDirectory()?ce(s):Z.unlinkSync(s)}),Z.rmdirSync(e))}var he={name:"@0xobelisk/sui-common",version:"1.2.0-pre.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(`
8
+ `;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=i+n:t.includes("genesis")&&(d=l+n),await ve.mkdir(Ne.dirname(t),{recursive:!0}),await ve.writeFile(t,d),ue(`${s}: ${t}`)}import{existsSync as q}from"fs";import X from"fs";function pe(e){X.existsSync(e)&&(X.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;X.lstatSync(s).isDirectory()?pe(s):X.unlinkSync(s)}),X.rmdirSync(e))}var ke={name:"@0xobelisk/sui-common",version:"1.2.0-pre.125",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",author:"team@obelisk.build",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},types:"./dist/index.d.ts",typesVersions:{"*":{index:["./src/index.ts"]}},scripts:{build:"pnpm run type-check && pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",format:"prettier --write .","format:check":"prettier --check .",lint:"eslint . --ext .ts",test:"vitest","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^10.5.0",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5",typescript:"^5.8.3",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^22.16.0","@types/yargs":"^17.0.10",eslint:"^9.0.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3"},engines:{node:">=22.0.0"},publishConfig:{access:"public"}};async function Se(e,t){console.log(`
9
9
  \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/src/${e.name}/Move.toml`);let s=`[package]
10
10
  name = "${e.name}"
11
11
  version = "1.0.0"
@@ -13,13 +13,13 @@ edition = "2024"
13
13
 
14
14
  [dependencies]
15
15
  Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.46.3" }
16
- Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "framework/src/dubhe", rev = "v${he.version}" }
16
+ Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "framework/src/dubhe", rev = "v${ke.version}" }
17
17
 
18
18
  [addresses]
19
19
  sui = "0x2"
20
20
  ${e.name} = "0x0"
21
- `;await A(s,`${t}/src/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
22
- `)}import{existsSync as ke}from"fs";async function Se(e,t,s=1){if(!ke(t)){let n=s===1?`// Settlement mode: USER_PAYS \u2014 users pay transaction fees at settlement time.
21
+ `;await E(s,`${t}/src/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
22
+ `)}import{existsSync as xe}from"fs";async function Ce(e,t,s=1){if(!xe(t)){let n=s===1?`// Settlement mode: USER_PAYS \u2014 users pay transaction fees at settlement time.
23
23
  // The framework admin sets the revenue share via set_dapp_revenue_share.
24
24
  // Initialise any DappStorage-level defaults here (e.g. resource starting values).`:`// Settlement mode: DAPP_SUBSIDIZES \u2014 the DApp pays for user operations.
25
25
  // Recharge the credit pool via dapp_system::recharge_credit before users can write.
@@ -29,22 +29,37 @@ ${e.name} = "0x0"
29
29
  public(package) fun run(_dapp_storage: &mut DappStorage, _ctx: &mut TxContext) {
30
30
  ${n}
31
31
  }
32
- }`;await A(r,t,"formatAndWriteMove")}}async function xe(e,t){if(!ke(`${t}/src/${e.name}/sources/scripts/migrate.move`)){let s=`module ${e.name}::migrate {
32
+ }`;await E(r,t,"formatAndWriteMove")}}async function we(e,t){if(!xe(`${t}/src/${e.name}/sources/scripts/migrate.move`)){let s=`module ${e.name}::migrate {
33
33
  const ON_CHAIN_VERSION: u32 = 1;
34
34
 
35
35
  public fun on_chain_version(): u32 {
36
36
  ON_CHAIN_VERSION
37
37
  }
38
38
  }
39
- `;await A(s,`${t}/src/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function Ce(e,t){let s=`module ${e.name}::dapp_key {
39
+ `;await E(s,`${t}/src/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function De(e,t){let s=`module ${e.name}::dapp_key {
40
40
  use std::type_name;
41
41
  use sui::address;
42
42
  use std::ascii::String;
43
43
 
44
- /// Authorization token for the app.
44
+ /// DappKey \u2014 package-level authorization token for this DApp.
45
+ ///
46
+ /// SECURITY: \`new()\` is intentionally \`public(package)\`.
47
+ /// Only code compiled into this package can construct a DappKey instance.
48
+ /// All framework write functions (\`set_record\`, \`set_field\`,
49
+ /// \`take_record\`, \`create_user_storage\`, \u2026) require \`_auth: DappKey\`
50
+ /// as proof that the call originated from inside this package \u2014 an
51
+ /// external PTB cannot fabricate that proof.
52
+ ///
53
+ /// NEVER change \`new()\` to \`public\`, and never accept a DappKey
54
+ /// value as a parameter from an external caller. Either mistake removes
55
+ /// every package-level access guard, allowing any PTB to write arbitrary
56
+ /// user data or register UserStorages without going through the DApp's
57
+ /// own entry functions.
45
58
 
46
59
  public struct DappKey has copy, drop {}
47
60
 
61
+ /// Constructs an authorization token. Callable only from within this package.
62
+ /// Pass the result as \`_auth\` to any framework function that requires it.
48
63
  public(package) fun new(): DappKey {
49
64
  DappKey {}
50
65
  }
@@ -62,14 +77,14 @@ ${e.name} = "0x0"
62
77
  type_name::with_defining_ids<DappKey1>() == type_name::with_defining_ids<DappKey2>()
63
78
  }
64
79
  }
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(`
80
+ `;await E(s,t,"formatAndWriteMove")}import{existsSync as je}from"fs";import Te from"node:fs/promises";async function Ae(e,t){je(`${t}/src/${e.name}/sources/systems`)||await Te.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),je(`${t}/src/${e.name}/sources/tests`)||await Te.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}function tt(e){return"E"+e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function st(e){return typeof e=="string"?e:e.message}async function Ee(e,t,s){console.log(`
81
+ \u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([i,d])=>{let l=tt(i),u=st(d);return console.log(` \u2514\u2500 ${i}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${i}(condition: bool) { assert!(condition, ${l}) }`].join(`
67
82
  `)}).join(`
68
83
 
69
84
  `),r=`module ${e}::error {
70
85
  ${n}
71
86
  }
72
- `;await A(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function Ae(e,t){let n=e.name==="dubhe"?"":`
87
+ `;await E(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function Oe(e,t){let n=e.name==="dubhe"?"":`
73
88
  /// Create a DappStorage for this DApp without sharing it.
74
89
  /// Suitable for unit tests that exercise global-resource functions.
75
90
  public fun create_dapp_storage_for_testing(ctx: &mut TxContext): dubhe::dapp_service::DappStorage {
@@ -91,7 +106,7 @@ module ${e.name}::init_test {
91
106
  }
92
107
  ${n}
93
108
  }
94
- `;await A(r,t,"formatAndWriteMove")}async function Ee(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
109
+ `;await E(r,t,"formatAndWriteMove")}async function Fe(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
95
110
  use dubhe::dapp_service::DappHub;
96
111
 
97
112
  // The framework genesis initialises the DappHub state via deploy_hook.
@@ -141,8 +156,8 @@ ${n}
141
156
  // ==========================================
142
157
  }
143
158
  }
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)} {
159
+ `;await E(r,t,"formatAndWriteMove")}function Ke(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Ie(e,t){if(console.log(`
160
+ \u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,n]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`);let r=[...n].sort((d,l)=>d.localeCompare(l)),i=rt(e.name,s,r);await E(i,`${t}/${Ke(s)}.move`,"formatAndWriteMove")}}function rt(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Ke(t)} {
146
161
  use sui::bcs::{BCS, to_bytes, peel_enum_tag};
147
162
 
148
163
  public enum ${t} has copy, drop, store {
@@ -166,40 +181,40 @@ ${s.map((r,i)=>` ${i} => ${t}::${r.charAt(0).toUpperCase()+r.slice(1)
166
181
  _ => abort,
167
182
  }
168
183
  }
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,`
184
+ }`}function Me(e){return e==="dubhe"?"dapp_service":"dapp_system"}function R(e){return e!=="dubhe"?"dapp_key::new(), ":""}function z(e,t){return""}function H(e,t){return""}function Pe(e){return e?"DappStorage":"UserStorage"}function Re(e){return e?"dapp_storage":"user_storage"}function le(e,t){let s=Me(e);return t?{set_record:`${s}::set_global_record`,set_field:`${s}::set_global_field`,get_field:`${s}::get_global_field`,has_record:`${s}::has_global_record`,ensure_has:`${s}::ensure_has_global_record`,ensure_has_not:`${s}::ensure_has_not_global_record`,delete_record:`${s}::delete_global_record`,delete_field:`${s}::delete_global_field`}:{set_record:`${s}::set_record`,set_field:`${s}::set_field`,get_field:`${s}::get_field`,has_record:`${s}::has_record`,ensure_has:`${s}::ensure_has_record`,ensure_has_not:`${s}::ensure_has_not_record`,delete_record:`${s}::delete_record`,delete_field:`${s}::delete_field`}}async function Le(e,t){if(console.log(`
185
+ \u{1F4E6} Starting Resources Generation...`),!!e.resources)for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=nt(e.name,s,n,"Onchain");await E(l,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let r=ot(e.name,s,n),i=at(e,s,n),d=i?r.replace(/^}$/m,`
171
186
  ${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 {
187
+ }`):r;await E(d,`${t}/${s}.move`,"formatAndWriteMove")}}function nt(e,t,s,n="Onchain"){let r=!B(s),i=r?`${de(s)}`:"",d=n==="Offchain",l=!1,u=Pe(l),_=Re(l),g=le(e,l),y=d?"":`
188
+ public fun has(${_}: &${u}): bool {
174
189
  let mut key_tuple = vector::empty();
175
190
  key_tuple.push_back(TABLE_NAME);
176
- ${$.has_record}<DappKey>(${g}, key_tuple)
191
+ ${g.has_record}<DappKey>(${_}, key_tuple)
177
192
  }
178
193
 
179
- public fun ensure_has(${g}: &${u}) {
194
+ public fun ensure_has(${_}: &${u}) {
180
195
  let mut key_tuple = vector::empty();
181
196
  key_tuple.push_back(TABLE_NAME);
182
- ${$.ensure_has}<DappKey>(${g}, key_tuple)
197
+ ${g.ensure_has}<DappKey>(${_}, key_tuple)
183
198
  }
184
199
 
185
- public fun ensure_has_not(${g}: &${u}) {
200
+ public fun ensure_has_not(${_}: &${u}) {
186
201
  let mut key_tuple = vector::empty();
187
202
  key_tuple.push_back(TABLE_NAME);
188
- ${$.ensure_has_not}<DappKey>(${g}, key_tuple)
203
+ ${g.ensure_has_not}<DappKey>(${_}, key_tuple)
189
204
  }
190
205
 
191
- public(package) fun delete(${g}: &mut ${u}, ctx: &TxContext) {
206
+ public(package) fun delete(${_}: &mut ${u}, ctx: &TxContext) {
192
207
  let mut key_tuple = vector::empty();
193
208
  key_tuple.push_back(TABLE_NAME);
194
- ${$.delete_record}<DappKey>(${L(e)}${g}, key_tuple, vector[b"value"], ctx);
209
+ ${g.delete_record}<DappKey>(${R(e)}${_}, key_tuple, vector[b"value"], ctx);
195
210
  }
196
211
 
197
- public fun get(${g}: &${u}): (${s==="string"||s==="String"?"String":s}) {
212
+ public fun get(${_}: &${u}): (${s==="string"||s==="String"?"String":s}) {
198
213
  let mut key_tuple = vector::empty();
199
214
  key_tuple.push_back(TABLE_NAME);
200
- let value_raw = ${$.get_field}<DappKey>(${g}, key_tuple, b"value");
215
+ let value_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"value");
201
216
  let mut value_bcs = sui::bcs::new(value_raw);
202
- let value = ${G(e,s,"value_bcs",r?[{type:s,module:i}]:[])};
217
+ let value = ${J(e,s,"value_bcs",r?[{type:s,module:i}]:[])};
203
218
  (value)
204
219
  }
205
220
  `,o=l?"use dubhe::dapp_service::DappStorage;":"use dubhe::dapp_service::UserStorage;",b=r&&s!=="string"&&s!=="String";return`module ${e}::${t} {${!b?`
@@ -215,13 +230,13 @@ ${b?` use ${e}::${i}::{${s}};`:""}
215
230
  const TABLE_NAME: vector<u8> = b"${t}";
216
231
  const OFFCHAIN: bool = ${n==="Offchain"};
217
232
 
218
- ${f}
219
- public(package) fun set(${H(e,l)}${g}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
233
+ ${y}
234
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
220
235
  let mut key_tuple = vector::empty();
221
236
  key_tuple.push_back(TABLE_NAME);
222
237
  let field_names = vector[b"value"];
223
238
  let value_tuple = encode(value);
224
- ${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
239
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
225
240
  }
226
241
 
227
242
  public fun encode(value: ${s==="string"||s==="String"?"String":s}): vector<vector<u8>> {
@@ -229,188 +244,188 @@ ${f}
229
244
  value_tuple.push_back(${s==="string"||s==="String"?"to_bytes(&into_bytes(value))":s==="vector<String>"?"to_bytes(&value)":r?`${e}::${i}::encode(value)`:"to_bytes(&value)"});
230
245
  value_tuple
231
246
  }
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}
247
+ }`}function de(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function ot(e,t,s){let n=s.fields,r=s.keys||[],i=s.offchain||!1,d=s.global||!1,l=i?"Offchain":"Onchain",u=d,_=Pe(u),g=Re(u),y=le(e,u),o=Object.keys(n).every(m=>r.includes(m)),b=Object.entries(n).filter(([m])=>!r.includes(m)),p=b.map(([m])=>m),h=p.length===1,a=b.filter(([m,C])=>!B(C)&&C!=="string"&&C!=="String").map(([m,C])=>({type:C,module:`${de(C)}`})).filter((m,C,W)=>W.findIndex(Y=>Y.type===m.type)===C),$=Object.entries(n).filter(([m,C])=>!B(C)&&C!=="string"&&C!=="String").map(([m,C])=>({type:C,module:`${de(C)}`})).filter((m,C,W)=>W.findIndex(Y=>Y.type===m.type)===C),x=it(e,t,n,r,!o&&!h,a,l,u,_,g,y),k=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",T=s.reactive?`
248
+ use dubhe::dapp_service::ScenePermit;`:"",w=Object.values(n),A=p.filter(m=>{let C=n[m];return B(C)||C==="string"||C==="String"}).length>0||r.length>0?`
249
+ use sui::bcs::{to_bytes};`:"",D=w.some(m=>m==="string"||m==="String"),v=w.some(m=>m==="vector<String>"),K=p.some(m=>{let C=n[m];return C==="string"||C==="String"}),P=K?`
250
+ use std::ascii::{String, into_bytes};`:D||v?`
251
+ use std::ascii::String;`:"",c=K?`
252
+ use std::ascii::{string, String, into_bytes};`:D||v?`
253
+ use std::ascii::String;`:"";if(o||h)return`module ${e}::${t} {${A}${P}
254
+ ${k}${T}
240
255
  use dubhe::dapp_system;
241
256
  use ${e}::dapp_key;
242
257
  use ${e}::dapp_key::DappKey;
243
- ${_.length>0?_.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
258
+ ${$.length>0?$.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
244
259
  `):""}
245
260
 
246
261
  const TABLE_NAME: vector<u8> = b"${t}";
247
262
  const OFFCHAIN: bool = ${i};
248
263
 
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(`
264
+ ${x}
265
+ }`;let f=p.map(m=>` ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]},`).join(`
266
+ `),S=p.map(m=>`${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]}`).join(", "),j=p.map(m=>` ${m},`).join(`
252
267
  `),M=p.map(m=>` public fun ${m}(self: &${I(t)}): ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]} {
253
268
  self.${m}
254
269
  }`).join(`
255
270
 
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]}) {
271
+ `),ee=p.map(m=>` public fun update_${m}(self: &mut ${I(t)}, ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]}) {
257
272
  self.${m} = ${m}
258
273
  }`).join(`
259
274
 
260
- `);return`module ${e}::${t} {${E}${a}
261
- ${k}${D}
275
+ `);return`module ${e}::${t} {${A}${c}
276
+ ${k}${T}
262
277
  use dubhe::dapp_system;
263
278
  use ${e}::dapp_key;
264
279
  use ${e}::dapp_key::DappKey;
265
- ${_.length>0?_.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
280
+ ${$.length>0?$.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
266
281
  `):""}
267
282
 
268
283
  const TABLE_NAME: vector<u8> = b"${t}";
269
284
  const OFFCHAIN: bool = ${i};
270
285
 
271
286
  public struct ${I(t)} has copy, drop, store {
272
- ${y}
287
+ ${f}
273
288
  }
274
289
 
275
290
  public fun new(${S}): ${I(t)} {
276
291
  ${I(t)} {
277
- ${T}
292
+ ${j}
278
293
  }
279
294
  }
280
295
 
281
296
  ${M}
282
297
 
283
- ${J}
298
+ ${ee}
284
299
 
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();
300
+ ${x}
301
+ }`}function B(e){return["address","bool","u8","u16","u32","u64","u128","u256","string","String","vector<address>","vector<bool>","vector<u8>","vector<u16>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>","vector<String>"].includes(e)}function J(e,t,s,n){let r=!B(t),i=r?n.find(d=>d.type===t):null;return t==="string"||t==="String"?`dubhe::bcs::peel_string(&mut ${s})`:t==="vector<String>"?`dubhe::bcs::peel_vec_string(&mut ${s})`:r&&i?`${e}::${i.module}::decode(&mut ${s})`:`sui::bcs::peel_${ge(t)}(&mut ${s})`}function Ue(e,t,s,n,r,i,d){let l=`${n}_raw`,u=`${n}_bcs`;return[`let ${l} = ${t.get_field}<DappKey>(${s}, key_tuple, b"${n}");`,`let mut ${u} = sui::bcs::new(${l});`,`let ${n} = ${J(e,r,u,d)};`].join(`
302
+ `)}function it(e,t,s,n,r=!0,i=[],d="Onchain",l=!1,u="UserStorage",_="user_storage",g=le("dubhe",!1)){let y=Object.entries(s).filter(([c])=>!n.includes(c)).reduce((c,[f,S])=>({...c,[f]:S}),{}),o=Object.keys(y),b=Object.keys(s).every(c=>n.includes(c)),p=o.length===1,h=d==="Offchain",a=n.length>0?n.map(c=>`${c}: ${s[c]}`).join(", "):"",$=n.length>0?`let mut key_tuple = vector::empty();
288
303
  key_tuple.push_back(TABLE_NAME);
289
- ${n.map(a=>`key_tuple.push_back(to_bytes(&${a}));`).join(`
304
+ ${n.map(c=>`key_tuple.push_back(to_bytes(&${c}));`).join(`
290
305
  `)}`:`let mut key_tuple = vector::empty();
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)
306
+ key_tuple.push_back(TABLE_NAME);`,x=l?"":", ctx: &mut TxContext",k=l?"":", ctx",T=h?"":` public fun has(${_}: &${u}${a?", ":""}${a}): bool {
307
+ ${$}
308
+ ${g.has_record}<DappKey>(${_}, key_tuple)
294
309
  }
295
310
 
296
- public fun ensure_has(${g}: &${u}${c?", ":""}${c}) {
297
- ${_}
298
- ${$.ensure_has}<DappKey>(${g}, key_tuple)
311
+ public fun ensure_has(${_}: &${u}${a?", ":""}${a}) {
312
+ ${$}
313
+ ${g.ensure_has}<DappKey>(${_}, key_tuple)
299
314
  }
300
315
 
301
- public fun ensure_has_not(${g}: &${u}${c?", ":""}${c}) {
302
- ${_}
303
- ${$.ensure_has_not}<DappKey>(${g}, key_tuple)
316
+ public fun ensure_has_not(${_}: &${u}${a?", ":""}${a}) {
317
+ ${$}
318
+ ${g.ensure_has_not}<DappKey>(${_}, key_tuple)
304
319
  }
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}
320
+ `,w=`vector[${o.map(c=>`b"${c}"`).join(", ")}]`,F=h?"":` public(package) fun delete(${_}: &mut ${u}${a?", ":""}${a}${l?"":", ctx: &TxContext"}) {
321
+ ${$}
322
+ ${g.delete_record}<DappKey>(${R(e)}${_}, key_tuple, ${w}${l?"":", ctx"});
323
+ }`,O=!p&&!h?o.map(c=>{let f=s[c],S=!B(f),j=S?i.find(M=>M.type===f):null;return` public fun get_${c}(${_}: &${u}${a?", ":""}${a}): ${f==="string"||f==="String"?"String":f==="vector<String>"?"vector<String>":f} {
324
+ ${$}
325
+ let ${c}_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"${c}");
326
+ let mut ${c}_bcs = sui::bcs::new(${c}_raw);
327
+ let ${c} = ${J(e,f,`${c}_bcs`,i)};
328
+ ${c}
314
329
  }
315
330
 
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});
331
+ public(package) fun set_${c}(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c}: ${f==="string"||f==="String"?"String":f==="vector<String>"?"vector<String>":f}${x}) {
332
+ ${$}
333
+ let value = ${f==="string"||f==="String"?`to_bytes(&into_bytes(${c}))`:f==="vector<String>"?`to_bytes(&${c})`:S?`${e}::${j?.module}::encode(${c})`:`to_bytes(&${c})`};
334
+ ${g.set_field}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, b"${c}", value${k});
320
335
  }`}).join(`
321
336
 
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
- ${_}
337
+ `):"",A=`vector[${o.map(c=>`b"${c}"`).join(", ")}]`,D=b?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}${x}) {
338
+ ${$}
324
339
  let field_names: vector<vector<u8>> = vector[];
325
340
  let value_tuple: vector<vector<u8>> = vector[];
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
- ${_}
341
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
342
+ }`:p?h?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"String":Object.values(y)[0]}${x}) {
343
+ ${$}
329
344
  let field_names = vector[b"${o[0]}"];
330
345
  let value_tuple = encode(value);
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]}");
346
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
347
+ }`:` public fun get(${_}: &${u}${a?", ":""}${a}): ${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"String":Object.values(y)[0]} {
348
+ ${$}
349
+ let ${o[0]}_raw = ${g.get_field}<DappKey>(${_}, key_tuple, b"${o[0]}");
335
350
  let mut ${o[0]}_bcs = sui::bcs::new(${o[0]}_raw);
336
- let value = ${G(e,Object.values(f)[0],`${o[0]}_bcs`,i)};
351
+ let value = ${J(e,Object.values(y)[0],`${o[0]}_bcs`,i)};
337
352
  value
338
353
  }
339
354
 
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
- ${_}
355
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"String":Object.values(y)[0]}${x}) {
356
+ ${$}
342
357
  let field_names = vector[b"${o[0]}"];
343
358
  let value_tuple = encode(value);
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
- ${_}
347
- let field_names = ${E};
359
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
360
+ }`:h?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${o.map(c=>`${c}: ${s[c]==="string"||s[c]==="String"?"String":s[c]}`).join(", ")}${x}) {
361
+ ${$}
362
+ let field_names = ${A};
348
363
  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(`
364
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
365
+ }`:` public fun get(${_}: &${u}${a?", ":""}${a}): (${Object.values(y).map(c=>c==="string"||c==="String"?"String":c).join(", ")}) {
366
+ ${$}
367
+ ${o.map((c,f)=>Ue(e,g,_,c,s[c],f,i)).join(`
353
368
  `)}
354
369
  (${o.join(", ")})
355
370
  }
356
371
 
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
- ${_}
359
- let field_names = ${E};
372
+ public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${o.map(c=>`${c}: ${s[c]==="string"||s[c]==="String"?"String":s[c]}`).join(", ")}${x}) {
373
+ ${$}
374
+ let field_names = ${A};
360
375
  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
- ${_}
364
- let field_names = ${E};
376
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
377
+ }`,v=r?h?` public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${I(t)}${x}) {
378
+ ${$}
379
+ let field_names = ${A};
365
380
  let value_tuple = encode_struct(${t});
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(`
381
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
382
+ }`:` public fun get_struct(${_}: &${u}${a?", ":""}${a}): ${I(t)} {
383
+ ${$}
384
+ ${o.map((c,f)=>Ue(e,g,_,c,s[c],f,i)).join(`
370
385
  `)}
371
386
  ${I(t)} { ${o.join(", ")} }
372
387
  }
373
388
 
374
- public(package) fun set_struct(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
375
- ${_}
376
- let field_names = ${E};
389
+ public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${I(t)}${x}) {
390
+ ${$}
391
+ let field_names = ${A};
377
392
  let value_tuple = encode_struct(${t});
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>> {
393
+ ${g.set_record}<DappKey>(${R(e)}${z(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
394
+ }`:"",K=p?` public fun encode(value: ${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"String":Object.values(y)[0]}): vector<vector<u8>> {
380
395
  let mut value_tuple = vector::empty();
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)`});
396
+ value_tuple.push_back(${Object.values(y)[0]==="string"||Object.values(y)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(y)[0]==="vector<String>"||B(Object.values(y)[0])?"to_bytes(&value)":`${e}::${i.find(c=>c.type===Object.values(y)[0])?.module}::encode(value)`});
382
397
  value_tuple
383
- }`:r?h?` public fun encode(${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}): vector<vector<u8>> {
398
+ }`:r?h?` public fun encode(${o.map(c=>`${c}: ${s[c]==="string"||s[c]==="String"?"String":s[c]}`).join(", ")}): vector<vector<u8>> {
384
399
  let mut value_tuple = vector::empty();
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(`
400
+ ${o.map(c=>{let f=s[c],S=!B(f),j=S?i.find(M=>M.type===f):null;return`value_tuple.push_back(${f==="string"||f==="String"?`to_bytes(&into_bytes(${c}))`:f==="vector<String>"?`to_bytes(&${c})`:S?`${e}::${j?.module}::encode(${c})`:`to_bytes(&${c})`});`}).join(`
386
401
  `)}
387
402
  value_tuple
388
403
  }
389
404
 
390
405
  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>> {
406
+ encode(${o.map(c=>`${t}.${c}`).join(", ")})
407
+ }`:` public fun encode(${o.map(c=>`${c}: ${s[c]==="string"||s[c]==="String"?"String":s[c]}`).join(", ")}): vector<vector<u8>> {
393
408
  let mut value_tuple = vector::empty();
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(`
409
+ ${o.map(c=>{let f=s[c],S=!B(f),j=S?i.find(M=>M.type===f):null;return`value_tuple.push_back(${f==="string"||f==="String"?`to_bytes(&into_bytes(${c}))`:f==="vector<String>"?`to_bytes(&${c})`:S?`${e}::${j?.module}::encode(${c})`:`to_bytes(&${c})`});`}).join(`
395
410
  `)}
396
411
  value_tuple
397
412
  }
398
413
 
399
414
  public fun encode_struct(${t}: ${I(t)}): vector<vector<u8>> {
400
- encode(${o.map(a=>`${t}.${a}`).join(", ")})
415
+ encode(${o.map(c=>`${t}.${c}`).join(", ")})
401
416
  }
402
417
 
403
418
  public fun decode(data: vector<u8>): ${I(t)} {
404
419
  let mut bcs_type = sui::bcs::new(data);
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(`
420
+ ${o.map(c=>{let f=s[c],S=!B(f),j=S?i.find(M=>M.type===f):null;return`let ${c} = ${f==="string"||f==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":f==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":S?`${e}::${j?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${ge(f)}(&mut bcs_type)`};`}).join(`
406
421
  `)}
407
422
  ${I(t)} {
408
- ${o.map(a=>`${a},`).join(`
423
+ ${o.map(c=>`${c},`).join(`
409
424
  `)}
410
425
  }
411
- }`:"";return[D,F,j,x,C,K].filter(a=>a.trim().length>0).join(`
426
+ }`:"";return[T,F,O,D,v,K].filter(c=>c.trim().length>0).join(`
412
427
 
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(`
428
+ `)}function I(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ge(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${ge(t)}`}switch(e){case"u8":return"u8";case"u16":return"u16";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"bool":return"bool";case"address":return"address";case"String":return"string";default:return e}}function at(e,t,s){let n=[],r=e.name,i=Me(r),d=R(r),l=s.fields,u=s.keys??[],_=Object.entries(l).filter(([o])=>!u.includes(o)),g=_.map(([o])=>o),y=u.length>0?u.map(o=>`${o}: ${l[o]}`).join(", "):"";if(s.fungible&&g.length===1){let[o,b]=_[0];n.push(`
414
429
  // \u2500\u2500\u2500 fungible add / sub \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
415
430
  #[error]
416
431
  const EInsufficientAmount: vector<u8> = b"Insufficient amount";
@@ -424,7 +439,7 @@ ${v}
424
439
  let current = get(user_storage);
425
440
  assert!(current >= amount, EInsufficientAmount);
426
441
  set(user_storage, current - amount, ctx);
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(`
442
+ }`)}if(u.length>0&&!s.offchain&&!s.global){let o=u.map($=>`${$}: ${l[$]}`).join(", "),b=g.map($=>`${$}: ${l[$]}`).join(", "),p=[o,b].filter(Boolean).join(", "),h=u.join(", "),a=[...u,...g].join(", ");n.push(`
428
443
  // \u2500\u2500\u2500 keys: mint (developer provides keys; framework ensures no duplicate) \u2500
429
444
  // Choosing the ID strategy (fresh address, counter, coordinate pack, etc.)
430
445
  // is intentionally left to the caller.
@@ -434,12 +449,12 @@ ${v}
434
449
  ctx: &mut TxContext,
435
450
  ) {
436
451
  ensure_has_not(user_storage, ${h});
437
- set(user_storage, ${c}, ctx);
452
+ set(user_storage, ${a}, ctx);
438
453
  }`)}if(s.reactive){let o=u.length>0?`let mut key_tuple = vector::empty();
439
454
  key_tuple.push_back(TABLE_NAME);
440
455
  ${u.map(b=>`key_tuple.push_back(sui::bcs::to_bytes(&${b}));`).join(`
441
456
  `)}`:`let mut key_tuple = vector::empty();
442
- key_tuple.push_back(TABLE_NAME);`;if($.length>1){let b=$.map(p=>`${p}: ${l[p]}`).join(", ");n.push(`
457
+ key_tuple.push_back(TABLE_NAME);`;if(g.length>1){let b=g.map(p=>`${p}: ${l[p]}`).join(", ");n.push(`
443
458
  // \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
444
459
  // Package-level helpers: add pause checks and access control in your system
445
460
  // functions before calling these.
@@ -447,29 +462,29 @@ ${v}
447
462
  permit: &ScenePermit<PermType>,
448
463
  from: &mut UserStorage,
449
464
  target: &mut UserStorage,
450
- ${f?f+", ":""}${b},
465
+ ${y?y+", ":""}${b},
451
466
  ctx: &mut TxContext,
452
467
  ) {
453
468
  ${o}
454
- let field_names = vector[${$.map(p=>`b"${p}"`).join(", ")}];
455
- let value_tuple = encode(${$.join(", ")});
469
+ let field_names = vector[${g.map(p=>`b"${p}"`).join(", ")}];
470
+ let value_tuple = encode(${g.join(", ")});
456
471
  ${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(`
472
+ }`)}for(let[b,p]of _){let h=p==="string"||p==="String"?`sui::bcs::to_bytes(&std::ascii::into_bytes(${b}))`:`sui::bcs::to_bytes(&${b})`;n.push(`
458
473
  public(package) fun set_${b}_reactive<PermType>(
459
474
  permit: &ScenePermit<PermType>,
460
475
  from: &mut UserStorage,
461
476
  target: &mut UserStorage,
462
- ${f?f+", ":""}${b}: ${p==="string"||p==="String"?"String":p},
477
+ ${y?y+", ":""}${b}: ${p==="string"||p==="String"?"String":p},
463
478
  ctx: &mut TxContext,
464
479
  ) {
465
480
  ${o}
466
481
  let value = ${h};
467
482
  ${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(`
483
+ }`)}}if(s.transferable){let o=e.objects??{},b=e.scenes??{},p=!!s.fungible,h=!p&&u.length>0,a=h?u[0]:null;for(let[$,x]of Object.entries(o)){if(!(x.accepts??[]).includes(t))continue;let k=I($),T=`dubhe::dapp_service::ObjectStorage<${r}::${$}::${k}>`,w=$;if(p&&g.length===1){let[,F]=_[0];n.push(`
469
484
  // \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_${_}(
485
+ public(package) fun transfer_user_to_${$}(
471
486
  user: &mut UserStorage,
472
- target: &mut ${D},
487
+ target: &mut ${T},
473
488
  amount: ${F},
474
489
  ctx: &mut TxContext,
475
490
  ) {
@@ -477,149 +492,149 @@ ${v}
477
492
  ${r}::${w}::add_${t}(target, amount);
478
493
  }
479
494
 
480
- public(package) fun transfer_${_}_to_user(
481
- source: &mut ${D},
495
+ public(package) fun transfer_${$}_to_user(
496
+ source: &mut ${T},
482
497
  user: &mut UserStorage,
483
498
  amount: ${F},
484
499
  ctx: &mut TxContext,
485
500
  ) {
486
501
  ${r}::${w}::sub_${t}(source, amount);
487
502
  add(user, amount, ctx);
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(`
503
+ }`)}else if(h&&a)if(g.length===1){let[,F]=_[0],O=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,A=Object.entries(e.enums??{}).map(([v])=>({type:I(v),module:v})),D=J(r,F,"bcs",A);n.push(`
489
504
  // \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_${_}(
505
+ public(package) fun transfer_user_to_${$}(
491
506
  user: &mut UserStorage,
492
- target: &mut ${D},
493
- ${c}: u64,
507
+ target: &mut ${T},
508
+ ${a}: u64,
494
509
  ctx: &TxContext,
495
510
  ) {
496
- ensure_has(user, ${c});
511
+ ensure_has(user, ${a});
497
512
  // Guard before any mutation: abort if target already holds this item.
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);
513
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
514
+ let raw = ${O};
515
+ delete(user, ${a}, ctx);
516
+ ${r}::${w}::set_${t}_data(target, ${a}, raw);
502
517
  }
503
518
 
504
- public(package) fun transfer_${_}_to_user(
505
- source: &mut ${D},
519
+ public(package) fun transfer_${$}_to_user(
520
+ source: &mut ${T},
506
521
  user: &mut UserStorage,
507
- ${c}: u64,
522
+ ${a}: u64,
508
523
  ctx: &mut TxContext,
509
524
  ) {
510
525
  // Guard before any mutation: abort if user already owns this item.
511
- ensure_has_not(user, ${c});
512
- let raw = ${r}::${w}::remove_${t}_data(source, ${c});
526
+ ensure_has_not(user, ${a});
527
+ let raw = ${r}::${w}::remove_${t}_data(source, ${a});
513
528
  let mut bcs = sui::bcs::new(raw);
514
- let value = ${x};
515
- set(user, ${c}, value, ctx);
529
+ let value = ${D};
530
+ set(user, ${a}, value, ctx);
516
531
  }`)}else n.push(`
517
532
  // \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed, multi-field) \u2500\u2500
518
- public(package) fun transfer_user_to_${_}(
533
+ public(package) fun transfer_user_to_${$}(
519
534
  user: &mut UserStorage,
520
- target: &mut ${D},
521
- ${c}: u64,
535
+ target: &mut ${T},
536
+ ${a}: u64,
522
537
  ctx: &TxContext,
523
538
  ) {
524
- ensure_has(user, ${c});
539
+ ensure_has(user, ${a});
525
540
  // Guard before any mutation: abort if target already holds this item.
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);
541
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
542
+ let data = encode_struct(get_struct(user, ${a}));
543
+ delete(user, ${a}, ctx);
529
544
  let raw: vector<u8> = sui::bcs::to_bytes(&data);
530
- ${r}::${w}::set_${t}_data(target, ${c}, raw);
545
+ ${r}::${w}::set_${t}_data(target, ${a}, raw);
531
546
  }
532
547
 
533
- public(package) fun transfer_${_}_to_user(
534
- source: &mut ${D},
548
+ public(package) fun transfer_${$}_to_user(
549
+ source: &mut ${T},
535
550
  user: &mut UserStorage,
536
- ${c}: u64,
551
+ ${a}: u64,
537
552
  ctx: &mut TxContext,
538
553
  ) {
539
554
  // Guard before any mutation: abort if user already owns this item.
540
- ensure_has_not(user, ${c});
541
- let raw = ${r}::${w}::remove_${t}_data(source, ${c});
555
+ ensure_has_not(user, ${a});
556
+ let raw = ${r}::${w}::remove_${t}_data(source, ${a});
542
557
  let decoded = decode(raw);
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(`
558
+ set_struct(user, ${a}, decoded, ctx);
559
+ }`)}for(let[$,x]of Object.entries(b)){if(!(x.accepts??[]).includes(t))continue;let k=I($),T=`dubhe::dapp_service::SceneStorage<${r}::${$}::${k}>`,w=$,F=x.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${x.authorization.permit}::${I(x.authorization.permit)}>`:"",O=x.authorization.kind==="permit"?` permit: &${F},
560
+ `:"",A=x.authorization.kind==="permit"?"permit, ":"",D=x.authorization.kind==="permit"?"user, ":"",v=x.authorization.kind==="permit"?", ctx":"";if(p&&g.length===1){let[,K]=_[0];n.push(`
546
561
  // \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},
562
+ public(package) fun transfer_user_to_${$}(
563
+ ${O} user: &mut UserStorage,
564
+ target: &mut ${T},
565
+ amount: ${K},
551
566
  ctx: &mut TxContext,
552
567
  ) {
553
568
  sub(user, amount, ctx);
554
- ${r}::${w}::add_${t}(${E}target, amount${x});
569
+ ${r}::${w}::add_${t}(${A}target, ${D}amount${v});
555
570
  }
556
571
 
557
572
  // \u2605 No expiry check on withdraw direction \u2014 prevents asset lock-in expired scenes.
558
- public(package) fun transfer_${_}_to_user(
559
- ${j} source: &mut ${D},
573
+ public(package) fun transfer_${$}_to_user(
574
+ ${O} source: &mut ${T},
560
575
  user: &mut UserStorage,
561
- amount: ${C},
576
+ amount: ${K},
562
577
  ctx: &mut TxContext,
563
578
  ) {
564
- ${r}::${w}::sub_${t}(${E}source, amount${x});
579
+ ${r}::${w}::sub_${t}(${A}source, ${D}amount${v});
565
580
  add(user, amount, ctx);
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(`
581
+ }`)}else if(h&&a)if(g.length===1){let[,K]=_[0],P=K==="string"||K==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,c=Object.entries(e.enums??{}).map(([S])=>({type:I(S),module:S})),f=J(r,K,"bcs",c);n.push(`
567
582
  // \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,
583
+ public(package) fun transfer_user_to_${$}(
584
+ ${O} user: &mut UserStorage,
585
+ target: &mut ${T},
586
+ ${a}: u64,
572
587
  ctx: &TxContext,
573
588
  ) {
574
- ensure_has(user, ${c});
589
+ ensure_has(user, ${a});
575
590
  // Guard before any mutation: abort if target already holds this item.
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});
591
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
592
+ let raw = ${P};
593
+ delete(user, ${a}, ctx);
594
+ ${r}::${w}::set_${t}_data(${A}target, ${D}${a}, raw${v});
580
595
  }
581
596
 
582
- public(package) fun transfer_${_}_to_user(
583
- ${j} source: &mut ${D},
597
+ public(package) fun transfer_${$}_to_user(
598
+ ${O} source: &mut ${T},
584
599
  user: &mut UserStorage,
585
- ${c}: u64,
600
+ ${a}: u64,
586
601
  ctx: &mut TxContext,
587
602
  ) {
588
603
  // Guard before any mutation: abort if user already owns this item.
589
- ensure_has_not(user, ${c});
590
- let raw = ${r}::${w}::remove_${t}_data(${E}source, ${c}${x});
604
+ ensure_has_not(user, ${a});
605
+ let raw = ${r}::${w}::remove_${t}_data(${A}source, ${D}${a}${v});
591
606
  let mut bcs = sui::bcs::new(raw);
592
- let value = ${a};
593
- set(user, ${c}, value, ctx);
607
+ let value = ${f};
608
+ set(user, ${a}, value, ctx);
594
609
  }`)}else n.push(`
595
610
  // \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,
611
+ public(package) fun transfer_user_to_${$}(
612
+ ${O} user: &mut UserStorage,
613
+ target: &mut ${T},
614
+ ${a}: u64,
600
615
  ctx: &TxContext,
601
616
  ) {
602
- ensure_has(user, ${c});
617
+ ensure_has(user, ${a});
603
618
  // Guard before any mutation: abort if target already holds this item.
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);
619
+ dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${a}));
620
+ let data = encode_struct(get_struct(user, ${a}));
621
+ delete(user, ${a}, ctx);
607
622
  let raw: vector<u8> = sui::bcs::to_bytes(&data);
608
- ${r}::${w}::set_${t}_data(${E}target, ${c}, raw${x});
623
+ ${r}::${w}::set_${t}_data(${A}target, ${D}${a}, raw${v});
609
624
  }
610
625
 
611
- public(package) fun transfer_${_}_to_user(
612
- ${j} source: &mut ${D},
626
+ public(package) fun transfer_${$}_to_user(
627
+ ${O} source: &mut ${T},
613
628
  user: &mut UserStorage,
614
- ${c}: u64,
629
+ ${a}: u64,
615
630
  ctx: &mut TxContext,
616
631
  ) {
617
632
  // Guard before any mutation: abort if user already owns this item.
618
- ensure_has_not(user, ${c});
619
- let raw = ${r}::${w}::remove_${t}_data(${E}source, ${c}${x});
633
+ ensure_has_not(user, ${a});
634
+ let raw = ${r}::${w}::remove_${t}_data(${A}source, ${D}${a}${v});
620
635
  let decoded = decode(raw);
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(`
636
+ set_struct(user, ${a}, decoded, ctx);
637
+ }`)}}if(s.listable){let o=!!s.fungible,p=!o&&u.length>0,h=p?u[0]:null,a=`b"${t}"`;if(o&&g.length===1)n.push(`
623
638
  // \u2500\u2500\u2500 listable: market protocol (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
624
639
  // Package-level helpers: call these from your system functions.
625
640
  // Add pause checks, access control, and custom logic there.
@@ -633,9 +648,9 @@ ${j} source: &mut ${D},
633
648
  dubhe::dapp_system::take_fungible_record<DappKey, CoinType>(
634
649
  dapp_key::new(),
635
650
  user_storage,
636
- ${c},
651
+ ${a},
637
652
  { let mut k = vector::empty(); k.push_back(TABLE_NAME); k },
638
- b"${$[0]}",
653
+ b"${g[0]}",
639
654
  amount,
640
655
  price,
641
656
  listed_until,
@@ -674,28 +689,28 @@ ${j} source: &mut ${D},
674
689
  dubhe::dapp_system::expire_fungible_listing<DappKey, CoinType>(
675
690
  dapp_key::new(), listing, user_storage, ctx
676
691
  );
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(`
692
+ }`);else if(p&&h){let $=u.map(k=>`${k}: ${l[k]}`).join(`,
693
+ `),x=u.map(k=>`record_key.push_back(sui::bcs::to_bytes(&${k}));`).join(`
679
694
  `);n.push(`
680
695
  // \u2500\u2500\u2500 listable: market protocol (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
681
696
  // Package-level helpers: call these from your system functions.
682
697
  // Add pause checks, access control, and custom logic there.
683
698
  public(package) fun list<CoinType>(
684
699
  user_storage: &mut UserStorage,
685
- ${_},
700
+ ${$},
686
701
  price: u64,
687
702
  listed_until: std::option::Option<u64>,
688
703
  ctx: &mut TxContext,
689
704
  ) {
690
705
  let mut record_key = vector::empty();
691
706
  record_key.push_back(TABLE_NAME);
692
- ${v}
707
+ ${x}
693
708
  dubhe::dapp_system::take_record<DappKey, CoinType>(
694
709
  dapp_key::new(),
695
710
  user_storage,
696
- ${c},
711
+ ${a},
697
712
  record_key,
698
- vector[${$.map(k=>`b"${k}"`).join(", ")}],
713
+ vector[${g.map(k=>`b"${k}"`).join(", ")}],
699
714
  price,
700
715
  listed_until,
701
716
  ctx,
@@ -734,7 +749,7 @@ ${j} source: &mut ${D},
734
749
  dapp_key::new(), listing, user_storage, ctx
735
750
  );
736
751
  }`)}}return n.join(`
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(`
752
+ `)}import ct from"node:path";function V(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ut(e){return e==="string"||e==="String"?"String":e}function te(e){return`dubhe::dapp_service::ObjectStorage<${e}>`}function pt(e,t){let s=V(e),n=te(s),r=[];for(let[i,d]of Object.entries(t.fields)){let l=ut(d);r.push(`
738
753
  public fun get_${i}(storage: &${n}): ${l} {
739
754
  dubhe::dapp_system::get_object_field<${s}, ${l}>(storage, b"${i}")
740
755
  }
@@ -744,7 +759,7 @@ ${j} source: &mut ${D},
744
759
  dapp_key::new(), storage, b"${i}", value
745
760
  );
746
761
  }`)}return r.join(`
747
- `)}function ut(e,t){let s=W(e),n=N(s);return`
762
+ `)}function dt(e,t){let s=V(e),n=te(s);return`
748
763
  public fun get_${t}(storage: &${n}): u64 {
749
764
  if (dubhe::dapp_system::has_object_field<${s}, u64>(storage, b"${t}")) {
750
765
  dubhe::dapp_system::get_object_field<${s}, u64>(storage, b"${t}")
@@ -764,7 +779,7 @@ ${j} source: &mut ${D},
764
779
  dubhe::dapp_system::set_object_field<DappKey, ${s}, u64>(
765
780
  dapp_key::new(), storage, b"${t}", current - amount
766
781
  );
767
- }`}function pt(e,t,s){let n=W(e),r=N(n);return`
782
+ }`}function lt(e,t,s){let n=V(e),r=te(n);return`
768
783
  public fun has_${t}(storage: &${r}, ${s}: u64): bool {
769
784
  let key = sui::bcs::to_bytes(&${s});
770
785
  dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key)
@@ -787,48 +802,49 @@ ${j} source: &mut ${D},
787
802
  let key = sui::bcs::to_bytes(&${s});
788
803
  assert!(dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key), EFieldNotFound);
789
804
  dubhe::dapp_system::remove_object_field<DappKey, ${n}, vector<u8>>(dapp_key::new(), storage, key)
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}
805
+ }`}function gt(e,t,s,n,r){let i=r.resources??{},d=r.objects??{},l=r.scenes??{},u=V(t),_=te(u),g=[],y=[];for(let o of n){let b=d[o]??l[o];if(!b)continue;let p=b.accepts??[],h=V(o);g.push(` use ${e}::${o};`);let a=p.filter($=>s.includes($));for(let $ of a){let x=i[$];if(!x||typeof x=="string")continue;let k=x,T=!!l[o],w=`${e}::${o}::${h}`,F=T?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,O=T?l[o]:void 0,A=O?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${O.authorization.permit}::${V(O.authorization.permit)}>`:"",D=O?.authorization.kind==="permit"?` source_permit: &${A},
806
+ `:"",v=O?.authorization.kind==="permit",K=v?"source_permit, ":"",P=v?` user_storage: &dubhe::dapp_service::UserStorage,
807
+ `:"",c=v?"user_storage, ":"",f=v?` ctx: &TxContext,
808
+ `:"",S=v?", ctx":"";if(!k.fungible&&k.keys?.length){let j=k.keys[0];y.push(`
809
+ /// Transfer ${$} (keyed item) from ${o} into this ${t}.
810
+ public(package) fun transfer_${o}_to_${t}_${$}(
811
+ ${D} from: &mut ${F},
812
+ to: &mut ${_},
813
+ ${P} ${j}: u64,
814
+ ${f}
799
815
  ) {
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},
807
- amount: u64,
808
- ${K}
816
+ let data = ${o}::remove_${$}_data(${K}from, ${c}${j}${S});
817
+ set_${$}_data(to, ${j}, data);
818
+ }`)}else y.push(`
819
+ /// Transfer ${$} (fungible) from ${o} into this ${t}.
820
+ public(package) fun transfer_${o}_to_${t}_${$}(
821
+ ${D} from: &mut ${F},
822
+ to: &mut ${_},
823
+ ${P} amount: u64,
824
+ ${f}
809
825
  ) {
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=`
826
+ ${o}::sub_${$}(${K}from, ${c}amount${S});
827
+ add_${$}(to, amount);
828
+ }`)}}return{imports:g,functions:y}}async function Be(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
829
+ \u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=V(r),l=`${d}Storage`,u=`b"${r}"`,_=pt(r,i),g=i.accepts??[],y=[];for(let S of g){let j=n[S];if(!j||typeof j=="string")continue;let M=j;!M.fungible&&M.keys?.length?y.push(lt(r,S,M.keys[0])):y.push(dt(r,S))}let{imports:o,functions:b}=gt(s,r,g,i.acceptsFrom??[],e),p=i.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",h=`dubhe::dapp_service::ObjectStorage<${d}>`,a=`
814
830
  public fun assert_${r}_id(storage: &${h}, expected: vector<u8>) {
815
831
  assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);
816
- }`,_=`
832
+ }`,$=`
817
833
  public fun entity_id(storage: &${h}): vector<u8> {
818
834
  *dubhe::dapp_service::object_storage_entity_id(storage)
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]
821
- const EFieldNotFound: vector<u8> = b"Field not found";`:"",E?` #[error]
822
- const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",x?` #[error]
835
+ }`,T=Object.values(i.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
836
+ use std::ascii::String;`:"",w=g.some(S=>{let j=n[S];return!j||typeof j=="string"?!1:!!j.keys?.length&&!j.fungible}),F=g.some(S=>{let j=n[S];return!j||typeof j=="string"?!1:!!j.fungible}),O=w,A=F,D=w,v=!!i.adminOnly,K=[O?` #[error]
837
+ const EFieldNotFound: vector<u8> = b"Field not found";`:"",A?` #[error]
838
+ const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",D?` #[error]
823
839
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:"",` #[error]
824
- const EWrongEntityId: vector<u8> = b"Wrong entity id";`,C?` #[error]
840
+ const EWrongEntityId: vector<u8> = b"Wrong entity id";`,v?` #[error]
825
841
  const ENoPermission: vector<u8> = b"Caller does not have permission";`:""].filter(Boolean).join(`
826
842
  `),P=o.length>0?`
827
843
  `+o.join(`
828
- `):"",a=`dubhe::dapp_service::ObjectStorage<${d}>`,y=`module ${s}::${r} {
844
+ `):"",c=`dubhe::dapp_service::ObjectStorage<${d}>`,f=`module ${s}::${r} {
829
845
  use dubhe::dapp_service::DappStorage;
830
846
  use ${s}::dapp_key;
831
- use ${s}::dapp_key::DappKey;${D}${P}
847
+ use ${s}::dapp_key::DappKey;${T}${P}
832
848
 
833
849
  // \u2500\u2500\u2500 Error constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
834
850
  ${K}
@@ -842,15 +858,15 @@ ${K}
842
858
  public struct ${d} has copy, drop {}
843
859
 
844
860
  // \u2500\u2500\u2500 ID / entity accessors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
845
- ${_}
861
+ ${$}
846
862
 
847
- ${c}
863
+ ${a}
848
864
 
849
865
  // \u2500\u2500\u2500 Field accessors (own fields) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
850
- ${g}
866
+ ${_}
851
867
 
852
868
  // \u2500\u2500\u2500 Bag accessors for accepted resources \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
853
- ${f.join(`
869
+ ${y.join(`
854
870
  `)}
855
871
 
856
872
  // \u2500\u2500\u2500 acceptsFrom: cross-storage transfer functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
@@ -871,7 +887,7 @@ ${p}
871
887
 
872
888
  public(package) fun destroy_${r}(
873
889
  dapp_storage: &mut DappStorage,
874
- storage: ${a},
890
+ storage: ${c},
875
891
  _ctx: &TxContext,
876
892
  ) {
877
893
  dubhe::dapp_system::destroy_typed_object<DappKey, ${d}>(
@@ -879,8 +895,8 @@ ${p}
879
895
  );
880
896
  }
881
897
  }
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} {
898
+ `;await E(f,ct.join(t,`${r}.move`),"formatAndWriteMove")}}import $t from"node:path";function _t(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function ze(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
899
+ \u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=_t(n),i=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
884
900
  use dubhe::dapp_service::{Self, DappStorage};
885
901
  use ${s}::dapp_key;
886
902
  use ${s}::dapp_key::DappKey;
@@ -962,26 +978,29 @@ ${p}
962
978
  }
963
979
 
964
980
  public(package) fun accept_${n}(
965
- permit: &mut ${d},
966
- ctx: &TxContext,
981
+ permit: &mut ${d},
982
+ user_storage: &dubhe::dapp_service::UserStorage,
983
+ ctx: &TxContext,
967
984
  ) {
968
985
  dubhe::dapp_system::accept_scene_permit_invitation<DappKey, ${r}>(
969
- dapp_key::new(), permit, ctx
986
+ dapp_key::new(), permit, user_storage, ctx
970
987
  );
971
988
  }
972
989
 
973
990
  public(package) fun join_${n}(
974
- permit: &mut ${d},
975
- ctx: &TxContext,
991
+ permit: &mut ${d},
992
+ user_storage: &dubhe::dapp_service::UserStorage,
993
+ ctx: &TxContext,
976
994
  ) {
977
- dubhe::dapp_system::join_scene_permit<DappKey, ${r}>(dapp_key::new(), permit, ctx);
995
+ dubhe::dapp_system::join_scene_permit<DappKey, ${r}>(dapp_key::new(), permit, user_storage, ctx);
978
996
  }
979
997
 
980
998
  public(package) fun leave_${n}(
981
- permit: &mut ${d},
982
- ctx: &TxContext,
999
+ permit: &mut ${d},
1000
+ user_storage: &dubhe::dapp_service::UserStorage,
1001
+ ctx: &TxContext,
983
1002
  ) {
984
- dubhe::dapp_system::leave_scene_permit<DappKey, ${r}>(dapp_key::new(), permit, ctx);
1003
+ dubhe::dapp_system::leave_scene_permit<DappKey, ${r}>(dapp_key::new(), permit, user_storage, ctx);
985
1004
  }
986
1005
 
987
1006
  public(package) fun expire_${n}(
@@ -997,53 +1016,55 @@ ${p}
997
1016
  );
998
1017
  }
999
1018
  }
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(`
1001
- public fun get_${u}(storage: &${r}): ${$} {
1002
- dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
1019
+ `;await E(l,$t.join(t,`${n}.move`),"formatAndWriteMove")}}import mt from"node:path";function G(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function bt(e){return e==="string"||e==="String"?"String":e}function N(e){return`dubhe::dapp_service::SceneStorage<${e}>`}function Z(e,t){if(t.authorization.kind==="permit")return`${e.name}::${t.authorization.permit}::${G(t.authorization.permit)}`}function Q(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${Z(e,t)}>`}function ft(e,t,s){let n=G(t),r=N(n),i=Z(e,s),d=Q(e,s),l=[];for(let[u,_]of Object.entries(s.fields)){let g=bt(_);s.authorization.kind==="permit"&&i&&d?l.push(`
1020
+ public fun get_${u}(storage: &${r}): ${g} {
1021
+ dubhe::dapp_system::get_scene_field<${n}, ${g}>(storage, b"${u}")
1003
1022
  }
1004
1023
 
1005
1024
  public(package) fun set_${u}(
1006
- permit: &${d},
1007
- storage: &mut ${r},
1008
- value: ${$},
1009
- ctx: &TxContext,
1025
+ permit: &${d},
1026
+ storage: &mut ${r},
1027
+ user_storage: &dubhe::dapp_service::UserStorage,
1028
+ value: ${g},
1029
+ ctx: &TxContext,
1010
1030
  ) {
1011
- dubhe::dapp_system::set_scene_field<DappKey, ${i}, ${n}, ${$}>(
1012
- dapp_key::new(), permit, storage, b"${u}", value, ctx
1031
+ dubhe::dapp_system::set_scene_field<DappKey, ${i}, ${n}, ${g}>(
1032
+ dapp_key::new(), permit, storage, user_storage, b"${u}", value, ctx
1013
1033
  );
1014
1034
  }
1015
1035
 
1016
- public(package) fun remove_${u}_system_maintenance(storage: &mut ${r}): ${$} {
1017
- dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${$}>(
1036
+ public(package) fun remove_${u}_system_maintenance(storage: &mut ${r}): ${g} {
1037
+ dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${g}>(
1018
1038
  dapp_key::new(), storage, b"${u}"
1019
1039
  )
1020
1040
  }`):l.push(`
1021
- public fun get_${u}(storage: &${r}): ${$} {
1022
- dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
1041
+ public fun get_${u}(storage: &${r}): ${g} {
1042
+ dubhe::dapp_system::get_scene_field<${n}, ${g}>(storage, b"${u}")
1023
1043
  }
1024
1044
 
1025
- public(package) fun set_${u}(storage: &mut ${r}, value: ${$}) {
1026
- dubhe::dapp_system::set_scene_field_system<DappKey, ${n}, ${$}>(
1045
+ public(package) fun set_${u}(storage: &mut ${r}, value: ${g}) {
1046
+ dubhe::dapp_system::set_scene_field_system<DappKey, ${n}, ${g}>(
1027
1047
  dapp_key::new(), storage, b"${u}", value
1028
1048
  );
1029
1049
  }
1030
1050
 
1031
- public(package) fun remove_${u}(storage: &mut ${r}): ${$} {
1032
- dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${$}>(
1051
+ public(package) fun remove_${u}(storage: &mut ${r}): ${g} {
1052
+ dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${g}>(
1033
1053
  dapp_key::new(), storage, b"${u}"
1034
1054
  )
1035
1055
  }`)}return l.join(`
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
1056
+ `)}function se(e,t){let s=Q(e,t);return t.authorization.kind!=="permit"||!s?"":` permit: &${s},
1057
+ `}function re(e){return e.authorization.kind!=="permit"?"":` user_storage: &dubhe::dapp_service::UserStorage,
1058
+ `}function ne(e){return e.authorization.kind==="permit"?` ctx: &TxContext,
1059
+ `:""}function $e(e,t,s,n,r,i){let d=Z(e,t);return t.authorization.kind==="permit"&&d?`dubhe::dapp_system::set_scene_field<DappKey, ${d}, ${s}, ${n}>(
1060
+ dapp_key::new(), permit, storage, user_storage, ${r}, ${i}, ctx
1040
1061
  );`:`dubhe::dapp_system::set_scene_field_system<DappKey, ${s}, ${n}>(
1041
1062
  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}>(
1043
- dapp_key::new(), permit, storage, ${r}, ctx
1063
+ );`}function yt(e,t,s,n,r){let i=Z(e,t);return t.authorization.kind==="permit"&&i?`dubhe::dapp_system::remove_scene_field<DappKey, ${i}, ${s}, ${n}>(
1064
+ dapp_key::new(), permit, storage, user_storage, ${r}, ctx
1044
1065
  )`:`dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${s}, ${n}>(
1045
1066
  dapp_key::new(), storage, ${r}
1046
- )`}function ft(e,t,s,n){let r=Y(t),i=Q(r);return`
1067
+ )`}function ht(e,t,s,n){let r=G(t),i=N(r);return`
1047
1068
  public fun get_${n}(storage: &${i}): u64 {
1048
1069
  if (dubhe::dapp_system::has_scene_field<${r}, u64>(storage, b"${n}")) {
1049
1070
  dubhe::dapp_system::get_scene_field<${r}, u64>(storage, b"${n}")
@@ -1051,21 +1072,21 @@ ${p}
1051
1072
  }
1052
1073
 
1053
1074
  public(package) fun add_${n}(
1054
- ${ee(e,s)} storage: &mut ${i},
1055
- amount: u64,
1056
- ${te(s)} ) {
1075
+ ${se(e,s)} storage: &mut ${i},
1076
+ ${re(s)} amount: u64,
1077
+ ${ne(s)} ) {
1057
1078
  let current = get_${n}(storage);
1058
- ${le(e,s,r,"u64",`b"${n}"`,"current + amount")}
1079
+ ${$e(e,s,r,"u64",`b"${n}"`,"current + amount")}
1059
1080
  }
1060
1081
 
1061
1082
  public(package) fun sub_${n}(
1062
- ${ee(e,s)} storage: &mut ${i},
1063
- amount: u64,
1064
- ${te(s)} ) {
1083
+ ${se(e,s)} storage: &mut ${i},
1084
+ ${re(s)} amount: u64,
1085
+ ${ne(s)} ) {
1065
1086
  let current = get_${n}(storage);
1066
1087
  assert!(current >= amount, EInsufficientAmount);
1067
- ${le(e,s,r,"u64",`b"${n}"`,"current - amount")}
1068
- }`}function yt(e,t,s,n,r){let i=Y(t),d=Q(i);return`
1088
+ ${$e(e,s,r,"u64",`b"${n}"`,"current - amount")}
1089
+ }`}function vt(e,t,s,n,r){let i=G(t),d=N(i);return`
1069
1090
  public fun has_${n}(storage: &${d}, ${r}: u64): bool {
1070
1091
  let key = sui::bcs::to_bytes(&${r});
1071
1092
  dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key)
@@ -1077,59 +1098,60 @@ ${te(s)} ) {
1077
1098
  }
1078
1099
 
1079
1100
  public(package) fun set_${n}_data(
1080
- ${ee(e,s)} storage: &mut ${d},
1081
- ${r}: u64,
1101
+ ${se(e,s)} storage: &mut ${d},
1102
+ ${re(s)} ${r}: u64,
1082
1103
  data: vector<u8>,
1083
- ${te(s)} ) {
1104
+ ${ne(s)} ) {
1084
1105
  let key = sui::bcs::to_bytes(&${r});
1085
1106
  assert!(!dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key), EDuplicateItemId);
1086
- ${le(e,s,i,"vector<u8>","key","data")}
1107
+ ${$e(e,s,i,"vector<u8>","key","data")}
1087
1108
  }
1088
1109
 
1089
1110
  public(package) fun remove_${n}_data(
1090
- ${ee(e,s)} storage: &mut ${d},
1091
- ${r}: u64,
1092
- ${te(s)} ): vector<u8> {
1111
+ ${se(e,s)} storage: &mut ${d},
1112
+ ${re(s)} ${r}: u64,
1113
+ ${ne(s)} ): vector<u8> {
1093
1114
  let key = sui::bcs::to_bytes(&${r});
1094
1115
  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},
1102
- to: &mut ${$},
1103
- ${J}: u64,
1104
- ${c} ) {
1105
- let data = ${v}::remove_${S}_data(${P}from, ${J}${a});
1106
- set_${S}_data(${h}to, ${J}, data${_});
1116
+ ${yt(e,s,i,"vector<u8>","key")}
1117
+ }`}function kt(e,t,s,n,r,i){let d=i.resources??{},l=i.objects??{},u=i.scenes??{},_=G(t),g=N(_),y=[],o=[],b=Q(i,s),p=s.authorization.kind==="permit"&&b?` dest_permit: &${b},
1118
+ `:"",h=s.authorization.kind==="permit"?"dest_permit, ":"",a=s.authorization.kind==="permit"?", ctx":"";for(let $ of r){let x=l[$]??u[$];if(!x)continue;let k=x.accepts??[],T=G($);y.push(` use ${e}::${$};`);let w=!!u[$],F=`${e}::${$}::${T}`,O=w?`dubhe::dapp_service::SceneStorage<${F}>`:`dubhe::dapp_service::ObjectStorage<${F}>`,A=w?x:void 0,D=A?Q(i,A):void 0,v=A?.authorization.kind==="permit"&&!!D,K=v?` source_permit: &${D},
1119
+ `:"",P=v?"source_permit, ":"",c=v?"user_storage, ":"",f=v?", ctx":"",S=s.authorization.kind==="permit",j=S?"user_storage, ":"",M=v||S?` user_storage: &dubhe::dapp_service::UserStorage,
1120
+ `:"",ee=v||S?` ctx: &TxContext,
1121
+ `:"",m=k.filter(C=>n.includes(C));for(let C of m){let W=d[C];if(!W||typeof W=="string")continue;let Y=W;if(!Y.fungible&&Y.keys?.length){let ae=Y.keys[0];o.push(`
1122
+ public(package) fun transfer_${$}_to_${t}_${C}(
1123
+ ${K}${p} from: &mut ${O},
1124
+ to: &mut ${g},
1125
+ ${M} ${ae}: u64,
1126
+ ${ee} ) {
1127
+ let data = ${$}::remove_${C}_data(${P}from, ${c}${ae}${f});
1128
+ set_${C}_data(${h}to, ${j}${ae}, data${a});
1107
1129
  }`)}else o.push(`
1108
- public(package) fun transfer_${v}_to_${t}_${S}(
1109
- ${K}${p} from: &mut ${E},
1110
- to: &mut ${$},
1111
- amount: u64,
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]
1130
+ public(package) fun transfer_${$}_to_${t}_${C}(
1131
+ ${K}${p} from: &mut ${O},
1132
+ to: &mut ${g},
1133
+ ${M} amount: u64,
1134
+ ${ee} ) {
1135
+ ${$}::sub_${C}(${P}from, ${c}amount${f});
1136
+ add_${C}(${h}to, ${j}amount${a});
1137
+ }`)}}return{imports:y,functions:o}}async function He(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
1138
+ \u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=G(r),l=`b"${r}"`,u=N(d),_=ft(e,r,i),g=i.accepts??[],y=[];for(let D of g){let v=n[D];if(!v||typeof v=="string")continue;let K=v;!K.fungible&&K.keys?.length?y.push(vt(e,r,i,D,K.keys[0])):y.push(ht(e,r,i,D))}let{imports:o,functions:b}=kt(s,r,i,g,i.acceptsFrom??[],e),a=Object.values(i.fields).some(D=>D==="string"||D==="String"||D==="vector<String>")?`
1139
+ use std::ascii::String;`:"",$=g.some(D=>{let v=n[D];return!v||typeof v=="string"?!1:!!v.keys?.length&&!v.fungible}),x=g.some(D=>{let v=n[D];return!v||typeof v=="string"?!1:!!v.fungible}),k=[$?` #[error]
1140
+ const EFieldNotFound: vector<u8> = b"Field not found";`:"",x?` #[error]
1141
+ const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",$?` #[error]
1120
1142
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:""].filter(Boolean).join(`
1121
- `),D=k.length>0?`
1143
+ `),T=k.length>0?`
1122
1144
  // \u2500\u2500\u2500 Error constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1123
1145
  ${k}
1124
1146
  `:"",w=o.length>0?`
1125
1147
  `+o.join(`
1126
- `):"",F=X(e,i),j=i.authorization.kind==="permit"&&F?`
1148
+ `):"",F=Q(e,i),O=i.authorization.kind==="permit"&&F?`
1127
1149
  public(package) fun new_${r}_with_permit(
1128
1150
  dapp_storage: &DappStorage,
1129
1151
  permit: &${F},
1130
1152
  ctx: &mut TxContext,
1131
1153
  ): ${u} {
1132
- dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${q(e,i)}, ${d}>(
1154
+ dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${Z(e,i)}, ${d}>(
1133
1155
  dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
1134
1156
  )
1135
1157
  }
@@ -1139,7 +1161,7 @@ ${k}
1139
1161
  permit: &${F},
1140
1162
  ctx: &mut TxContext,
1141
1163
  ) {
1142
- dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${q(e,i)}, ${d}>(
1164
+ dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${Z(e,i)}, ${d}>(
1143
1165
  dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
1144
1166
  );
1145
1167
  }`:`
@@ -1159,21 +1181,21 @@ ${k}
1159
1181
  dubhe::dapp_system::create_and_share_typed_scene_system<DappKey, ${d}>(
1160
1182
  dapp_key::new(), dapp_storage, SCENE_TYPE, ctx
1161
1183
  );
1162
- }`,E=`module ${s}::${r} {
1184
+ }`,A=`module ${s}::${r} {
1163
1185
  use dubhe::dapp_service::DappStorage;
1164
1186
  use ${s}::dapp_key;
1165
- use ${s}::dapp_key::DappKey;${c}${w}
1166
- ${D}
1187
+ use ${s}::dapp_key::DappKey;${a}${w}
1188
+ ${T}
1167
1189
  const SCENE_TYPE: vector<u8> = ${l};
1168
1190
 
1169
1191
  /// Phantom type that distinguishes this scene storage at compile time.
1170
1192
  public struct ${d} has copy, drop {}
1171
1193
 
1172
1194
  // \u2500\u2500\u2500 Field accessors (own fields) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1173
- ${g}
1195
+ ${_}
1174
1196
 
1175
1197
  // \u2500\u2500\u2500 Bag accessors for accepted resources \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1176
- ${f.join(`
1198
+ ${y.join(`
1177
1199
  `)}
1178
1200
 
1179
1201
  // \u2500\u2500\u2500 acceptsFrom: cross-storage transfer functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
@@ -1181,7 +1203,7 @@ ${b.join(`
1181
1203
  `)}
1182
1204
 
1183
1205
  // \u2500\u2500\u2500 SceneStorage lifecycle wrappers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1184
- ${j}
1206
+ ${O}
1185
1207
 
1186
1208
  public(package) fun share_${r}(storage: ${u}) {
1187
1209
  dubhe::dapp_system::share_scene_storage<DappKey, ${d}>(
@@ -1195,24 +1217,28 @@ ${j}
1195
1217
  );
1196
1218
  }
1197
1219
  }
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 {
1220
+ `;await E(A,mt.join(t,`${r}.move`),"formatAndWriteMove")}}async function We(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
1199
1221
  use dubhe::dapp_service::{DappHub, DappStorage};
1200
1222
  use dubhe::dapp_system;
1223
+ use ${e.name}::dapp_key;
1201
1224
  use ${e.name}::dapp_key::DappKey;
1225
+ use ${e.name}::migrate;
1202
1226
 
1203
1227
  /// Create a UserStorage for the transaction sender within this DApp.
1204
1228
  /// Must be called once before the user can interact with any user-level resources.
1205
- /// Aborts if the DApp is currently suspended or the framework version has advanced.
1229
+ /// Aborts if the DApp version does not match this package, the DApp is paused,
1230
+ /// or the framework version has advanced.
1206
1231
  #[allow(lint(public_entry))]
1207
1232
  public entry fun init_user_storage(
1208
1233
  dapp_hub: &DappHub,
1209
1234
  dapp_storage: &mut DappStorage,
1210
1235
  ctx: &mut TxContext,
1211
1236
  ) {
1212
- dapp_system::create_user_storage<DappKey>(dapp_hub, dapp_storage, ctx);
1237
+ dapp_system::ensure_latest_version<DappKey>(dapp_storage, migrate::on_chain_version());
1238
+ dapp_system::create_user_storage(dapp_key::new(), dapp_hub, dapp_storage, ctx);
1213
1239
  }
1214
1240
  }
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}:
1241
+ `;await E(s,t,"formatAndWriteMove")}import Ye from"chalk";import{existsSync as St,readFileSync as xt,writeFileSync as Ve}from"fs";import Ct from"node:path";function wt(e){if(typeof e=="string")return{value:e};let t={};for(let[s,n]of Object.entries(e.fields??{}))t[s]=n;return t}function Ge(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function Dt(e){let t={};for(let[r,i]of Object.entries(e.resources??{}))t[r]=wt(i);let s={};for(let[r,i]of Object.entries(e.objects??{}))s[r]=Ge(i);let n={};for(let[r,i]of Object.entries(e.scenes??{}))n[r]=Ge(i);return{version:1,resources:t,objects:s,scenes:n}}function _e(e,t,s){for(let[n,r]of Object.entries(s)){let i=t[n];if(i)for(let[d,l]of Object.entries(i)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
1216
1242
  Field "${d}" was removed.
1217
1243
 
1218
1244
  Resources, objects, and scenes are stored as raw bytes on-chain.
@@ -1220,10 +1246,10 @@ Removing fields corrupts existing data. Use a new name (e.g. "${n}_v2") for brea
1220
1246
  Field "${d}" type changed from "${l}" to "${r[d]}".
1221
1247
 
1222
1248
  Resources, objects, and scenes are stored as raw bytes on-chain.
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(`
1249
+ Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function qe(e,t){let s=Ct.join(e,`${t.name}.lock.json`),n=Dt(t);if(St(s)){let r;try{r=JSON.parse(xt(s,"utf-8"))}catch{console.warn(Ye.yellow("[dubhe]")+` Could not parse ${Ye.bold(s)}, skipping break-check.`),Ve(s,JSON.stringify(n,null,2)+`
1250
+ `,"utf-8");return}_e("resources",r.resources??{},n.resources),_e("objects",r.objects??{},n.objects),_e("scenes",r.scenes??{},n.scenes)}Ve(s,JSON.stringify(n,null,2)+`
1251
+ `,"utf-8")}import U from"chalk";var oe=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function Je(e){me(e,!1)}function me(e,t=!0){let s=e.resources??{},n=e.objects??{},r=e.permits??{},i=e.scenes??{},d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),_=new Set(Object.keys(i)),g=new Set;for(let o of d)(l.has(o)||u.has(o)||_.has(o))&&g.add(o);for(let o of l)(u.has(o)||_.has(o))&&g.add(o);for(let o of u)_.has(o)&&g.add(o);if(g.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[...g].sort().join(", ")}`);let y=new Set;for(let[o,b]of Object.entries(n)){for(let p of b.accepts??[]){y.add(p);let h=s[p];if(!h)throw new Error(`objects.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`objects.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],a=!!i[p];if(!h&&!a)throw new Error(`objects.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(i)){if(!b.authorization)throw new Error(`scenes.${o} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(b.authorization.kind==="permit"){if(!r[b.authorization.permit])throw new Error(`scenes.${o}.authorization references permit '${b.authorization.permit}', but permits.${b.authorization.permit} is not defined`)}else if(b.authorization.kind!=="system")throw new Error(`scenes.${o}.authorization.kind must be 'system' or 'permit'`);for(let p of b.accepts??[]){y.add(p);let h=s[p];if(!h)throw new Error(`scenes.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`scenes.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],a=!!i[p];if(!h&&!a)throw new Error(`scenes.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(s)){if(typeof b=="string")continue;let p=b;if(p.offchain){if(p.listable)throw new Error(`resources.${o} has both offchain: true and listable: true. offchain resources emit events but store no on-chain state, so there is nothing to take out and place into a Listing.`);if(p.transferable)throw new Error(`resources.${o} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if(p.reactive)throw new Error(`resources.${o} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);p.fungible&&t&&oe(`resources.${U.bold(o)} has both ${U.cyan("offchain: true")} and ${U.cyan("fungible: true")}. offchain fungible events are emitted only; no on-chain balance is maintained and no add/sub functions are generated. This is unusual \u2014 verify your intent.`)}if(p.reactive&&p.fungible&&t&&oe(`resources.${U.bold(o)} has both ${U.cyan("reactive: true")} and ${U.cyan("fungible: true")}. Fungible quantity changes (add/sub) do not suit reactive cross-user writes. Consider using a transfer function instead.`),p.global){if(p.reactive)throw new Error(`resources.${o} has both global: true and reactive: true. global resources live in DappStorage (shared), not in UserStorage. Reactive writes operate between two UserStorage objects and are incompatible with global resources.`);if(p.listable)throw new Error(`resources.${o} has both global: true and listable: true. global resources live in DappStorage and cannot be individually listed for sale. listable requires per-user ownership in UserStorage.`);if(p.transferable)throw new Error(`resources.${o} has both global: true and transferable: true. global resources live in DappStorage and are not owned by individual users. transferable requires per-user state in UserStorage or ObjectStorage.`)}p.fungible&&p.listable&&t&&oe(`resources.${U.bold(o)} has both ${U.cyan("fungible: true")} and ${U.cyan("listable: true")}. The generated ${U.green(`list_${o}`)} entry function will include an ${U.cyan("amount")} parameter for partial listings.`),p.transferable&&!y.has(o)&&t&&oe(`resources.${U.bold(o)} has ${U.cyan("transferable: true")} but is not referenced in any ${U.cyan("objects.accepts")} or ${U.cyan("scenes.accepts")}. The cross-layer transfer functions will not be generated.`)}}import L from"node:path";async function jt(e,t,s,n=1){console.log(`
1252
+ \u{1F680} Starting Code Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(` \u2514\u2500 Settlement Mode: ${n===1?"USER_PAYS":"DAPP_SUBSIDIZES"}`),me(t),qe(e,t),console.log(e);let r=L.join(e,"src",t.name);q(`${r}`)&&pe(`${r}/sources/codegen`),q(`${r}/Move.toml`)||await Se(t,e);let i=L.join(r,"sources","codegen","genesis.move");q(i)||await Fe(t,i,n);let d=L.join(r,"sources","codegen","init_test.move");q(d)||await Oe(t,d);let l=L.join(r,"sources","codegen","dapp_key.move");q(l)||await De(t,l);let u=L.join(r,"sources","scripts","deploy_hook.move");q(u)||await Ce(t,u,n);let _=L.join(r,"sources","codegen","resources");await Le(t,_);let g=L.join(r,"sources","codegen","objects");await Be(t,g);let y=L.join(r,"sources","codegen","permits");await ze(t,y);let o=L.join(r,"sources","codegen","scenes");await He(t,o);let b=L.join(r,"sources","codegen","enums");q(b)||await Ie(t,b),t.errors&&await Ee(t.name,t.errors,e);let p=L.join(r,"sources","codegen","user_storage_init.move");await We(t,p),await Ae(t,e),await we(t,e),console.log(`
1227
1253
  \u2705 Code Generation Complete!
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};
1254
+ `)}var er=jt;var rr=e=>(Je(e),e);import{findUp as Tt}from"find-up";import be from"path";import At from"esbuild";var ie=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as Et}from"fs";import{pathToFileURL as Ot}from"url";import Ft from"os";var Kt=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],fe="dubhe.config.example.mjs";async function gr(e){e=await Ze(e);try{return await At.build({entryPoints:[e],format:"esm",outfile:fe,platform:"node",bundle:!0,packages:"external"}),e=await Ze(fe,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Et(fe,{force:!0})}}async function Ze(e,t){return e===void 0?e=await It():be.isAbsolute(e)||(e=be.join(process.cwd(),e),e=be.normalize(e)),t&&Ft.platform()==="win32"?Ot(e).href:e}async function It(){let e=await Tt(Kt);if(e===void 0)throw new ie;return e}var Ut=(s=>(s.Event="event",s.Schema="schema",s))(Ut||{});export{Ut as SubscriptionKind,qe as checkAndUpdateLock,jt as codegen,rr as defineConfig,E as formatAndWriteMove,Rt as formatMove,Be as generateObjects,He as generateScenes,gr as loadConfig,er as schemaGen};
1229
1255
  //# sourceMappingURL=index.js.map