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

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
@@ -5,7 +5,7 @@ import be from"prettier";import Je from"prettier-plugin-move-js";async function
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 ye.mkdir(Xe.dirname(t),{recursive:!0}),await ye.writeFile(t,d),ae(`${s}: ${t}`)}import{existsSync as V}from"fs";import Z from"fs";function ce(e){Z.existsSync(e)&&(Z.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;Z.lstatSync(s).isDirectory()?ce(s):Z.unlinkSync(s)}),Z.rmdirSync(e))}var he={name:"@0xobelisk/sui-common",version:"1.2.0-pre.124",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",author:"team@obelisk.build",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},types:"./dist/index.d.ts",typesVersions:{"*":{index:["./src/index.ts"]}},scripts:{build:"pnpm run type-check && pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",format:"prettier --write .","format:check":"prettier --check .",lint:"eslint . --ext .ts",test:"vitest","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^10.5.0",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5",typescript:"^5.8.3",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^22.16.0","@types/yargs":"^17.0.10",eslint:"^9.0.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3"},engines:{node:">=22.0.0"},publishConfig:{access:"public"}};async function ve(e,t){console.log(`
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"
@@ -41,10 +41,25 @@ ${e.name} = "0x0"
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
  }
@@ -166,38 +181,38 @@ ${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(`
184
+ }`}function Ie(e){return e==="dubhe"?"dapp_service":"dapp_system"}function R(e){return e!=="dubhe"?"dapp_key::new(), ":""}function B(e,t){return""}function H(e,t){return""}function Me(e){return e?"DappStorage":"UserStorage"}function Ue(e){return e?"dapp_storage":"user_storage"}function pe(e,t){let s=Ie(e);return t?{set_record:`${s}::set_global_record`,set_field:`${s}::set_global_field`,get_field:`${s}::get_global_field`,has_record:`${s}::has_global_record`,ensure_has:`${s}::ensure_has_global_record`,ensure_has_not:`${s}::ensure_has_not_global_record`,delete_record:`${s}::delete_global_record`,delete_field:`${s}::delete_global_field`}:{set_record:`${s}::set_record`,set_field:`${s}::set_field`,get_field:`${s}::get_field`,has_record:`${s}::has_record`,ensure_has:`${s}::ensure_has_record`,ensure_has_not:`${s}::ensure_has_not_record`,delete_record:`${s}::delete_record`,delete_field:`${s}::delete_field`}}async function Pe(e,t){if(console.log(`
170
185
  \u{1F4E6} Starting Resources Generation...`),!!e.resources)for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=st(e.name,s,n,"Onchain");await A(l,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let r=rt(e.name,s,n),i=ot(e,s,n),d=i?r.replace(/^}$/m,`
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 A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function st(e,t,s,n="Onchain"){let r=!z(s),i=r?`${ue(s)}`:"",d=n==="Offchain",l=!1,u=Me(l),$=Ue(l),g=pe(e,l),f=d?"":`
188
+ public fun has(${$}: &${u}): bool {
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
217
  let value = ${G(e,s,"value_bcs",r?[{type:s,module:i}]:[])};
203
218
  (value)
@@ -216,12 +231,12 @@ ${b?` use ${e}::${i}::{${s}};`:""}
216
231
  const OFFCHAIN: bool = ${n==="Offchain"};
217
232
 
218
233
  ${f}
219
- public(package) fun set(${H(e,l)}${g}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
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)}${B(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,7 +244,7 @@ ${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?`
247
+ }`}function ue(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function rt(e,t,s){let n=s.fields,r=s.keys||[],i=s.offchain||!1,d=s.global||!1,l=i?"Offchain":"Onchain",u=d,$=Me(u),g=Ue(u),f=pe(e,u),o=Object.keys(n).every(m=>r.includes(m)),b=Object.entries(n).filter(([m])=>!r.includes(m)),p=b.map(([m])=>m),h=p.length===1,c=b.filter(([m,O])=>!z(O)&&O!=="string"&&O!=="String").map(([m,O])=>({type:O,module:`${ue(O)}`})).filter((m,O,ne)=>ne.findIndex(oe=>oe.type===m.type)===O),_=Object.entries(n).filter(([m,O])=>!z(O)&&O!=="string"&&O!=="String").map(([m,O])=>({type:O,module:`${ue(O)}`})).filter((m,O,ne)=>ne.findIndex(oe=>oe.type===m.type)===O),v=nt(e,t,n,r,!o&&!h,c,l,u,$,g,f),k=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",D=s.reactive?`
233
248
  use dubhe::dapp_service::ScenePermit;`:"",w=Object.values(n),E=p.filter(m=>{let O=n[m];return z(O)||O==="string"||O==="String"}).length>0||r.length>0?`
234
249
  use sui::bcs::{to_bytes};`:"",x=w.some(m=>m==="string"||m==="String"),C=w.some(m=>m==="vector<String>"),K=p.some(m=>{let O=n[m];return O==="string"||O==="String"}),P=K?`
235
250
  use std::ascii::{String, into_bytes};`:x||C?`
@@ -284,98 +299,98 @@ ${J}
284
299
 
285
300
  ${v}
286
301
  }`}function z(e){return["address","bool","u8","u16","u32","u64","u128","u256","string","String","vector<address>","vector<bool>","vector<u8>","vector<u16>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>","vector<String>"].includes(e)}function G(e,t,s,n){let r=!z(t),i=r?n.find(d=>d.type===t):null;return t==="string"||t==="String"?`dubhe::bcs::peel_string(&mut ${s})`:t==="vector<String>"?`dubhe::bcs::peel_vec_string(&mut ${s})`:r&&i?`${e}::${i.module}::decode(&mut ${s})`:`sui::bcs::peel_${de(t)}(&mut ${s})`}function Ke(e,t,s,n,r,i,d){let l=`${n}_raw`,u=`${n}_bcs`;return[`let ${l} = ${t.get_field}<DappKey>(${s}, key_tuple, b"${n}");`,`let mut ${u} = sui::bcs::new(${l});`,`let ${n} = ${G(e,r,u,d)};`].join(`
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();
302
+ `)}function nt(e,t,s,n,r=!0,i=[],d="Onchain",l=!1,u="UserStorage",$="user_storage",g=pe("dubhe",!1)){let f=Object.entries(s).filter(([a])=>!n.includes(a)).reduce((a,[y,S])=>({...a,[y]:S}),{}),o=Object.keys(f),b=Object.keys(s).every(a=>n.includes(a)),p=o.length===1,h=d==="Offchain",c=n.length>0?n.map(a=>`${a}: ${s[a]}`).join(", "):"",_=n.length>0?`let mut key_tuple = vector::empty();
288
303
  key_tuple.push_back(TABLE_NAME);
289
304
  ${n.map(a=>`key_tuple.push_back(to_bytes(&${a}));`).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 {
306
+ key_tuple.push_back(TABLE_NAME);`,v=l?"":", ctx: &mut TxContext",k=l?"":", ctx",D=h?"":` public fun has(${$}: &${u}${c?", ":""}${c}): bool {
292
307
  ${_}
293
- ${$.has_record}<DappKey>(${g}, key_tuple)
308
+ ${g.has_record}<DappKey>(${$}, key_tuple)
294
309
  }
295
310
 
296
- public fun ensure_has(${g}: &${u}${c?", ":""}${c}) {
311
+ public fun ensure_has(${$}: &${u}${c?", ":""}${c}) {
297
312
  ${_}
298
- ${$.ensure_has}<DappKey>(${g}, key_tuple)
313
+ ${g.ensure_has}<DappKey>(${$}, key_tuple)
299
314
  }
300
315
 
301
- public fun ensure_has_not(${g}: &${u}${c?", ":""}${c}) {
316
+ public fun ensure_has_not(${$}: &${u}${c?", ":""}${c}) {
302
317
  ${_}
303
- ${$.ensure_has_not}<DappKey>(${g}, key_tuple)
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"}) {
320
+ `,w=`vector[${o.map(a=>`b"${a}"`).join(", ")}]`,F=h?"":` public(package) fun delete(${$}: &mut ${u}${c?", ":""}${c}${l?"":", ctx: &TxContext"}) {
306
321
  ${_}
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} {
322
+ ${g.delete_record}<DappKey>(${R(e)}${$}, key_tuple, ${w}${l?"":", ctx"});
323
+ }`,j=!p&&!h?o.map(a=>{let y=s[a],S=!z(y),T=S?i.find(M=>M.type===y):null;return` public fun get_${a}(${$}: &${u}${c?", ":""}${c}): ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y} {
309
324
  ${_}
310
- let ${a}_raw = ${$.get_field}<DappKey>(${g}, key_tuple, b"${a}");
325
+ let ${a}_raw = ${g.get_field}<DappKey>(${$}, key_tuple, b"${a}");
311
326
  let mut ${a}_bcs = sui::bcs::new(${a}_raw);
312
327
  let ${a} = ${G(e,y,`${a}_bcs`,i)};
313
328
  ${a}
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}) {
331
+ public(package) fun set_${a}(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${a}: ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y}${v}) {
317
332
  ${_}
318
333
  let value = ${y==="string"||y==="String"?`to_bytes(&into_bytes(${a}))`:y==="vector<String>"?`to_bytes(&${a})`:S?`${e}::${T?.module}::encode(${a})`:`to_bytes(&${a})`};
319
- ${$.set_field}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, b"${a}", value${k});
334
+ ${g.set_field}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, b"${a}", 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}) {
337
+ `):"",E=`vector[${o.map(a=>`b"${a}"`).join(", ")}]`,x=b?` public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}${v}) {
323
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}) {
341
+ ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
342
+ }`:p?h?` public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}${v}) {
328
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]} {
346
+ ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
347
+ }`:` public fun get(${$}: &${u}${c?", ":""}${c}): ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]} {
333
348
  ${_}
334
- let ${o[0]}_raw = ${$.get_field}<DappKey>(${g}, key_tuple, b"${o[0]}");
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
351
  let value = ${G(e,Object.values(f)[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}) {
355
+ public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}${v}) {
341
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}) {
359
+ ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
360
+ }`:h?` public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}${v}) {
346
361
  ${_}
347
362
  let field_names = ${E};
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(", ")}) {
364
+ ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
365
+ }`:` public fun get(${$}: &${u}${c?", ":""}${c}): (${Object.values(f).map(a=>a==="string"||a==="String"?"String":a).join(", ")}) {
351
366
  ${_}
352
- ${o.map((a,y)=>Ke(e,$,g,a,s[a],y,i)).join(`
367
+ ${o.map((a,y)=>Ke(e,g,$,a,s[a],y,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}) {
372
+ public(package) fun set(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}${v}) {
358
373
  ${_}
359
374
  let field_names = ${E};
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}) {
376
+ ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
377
+ }`,C=r?h?` public(package) fun set_struct(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
363
378
  ${_}
364
379
  let field_names = ${E};
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)} {
381
+ ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
382
+ }`:` public fun get_struct(${$}: &${u}${c?", ":""}${c}): ${I(t)} {
368
383
  ${_}
369
- ${o.map((a,y)=>Ke(e,$,g,a,s[a],y,i)).join(`
384
+ ${o.map((a,y)=>Ke(e,g,$,a,s[a],y,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}) {
389
+ public(package) fun set_struct(${H(e,l)}${$}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
375
390
  ${_}
376
391
  let field_names = ${E};
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});
393
+ ${g.set_record}<DappKey>(${R(e)}${B(e,l)}${$}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
379
394
  }`:"",K=p?` public fun encode(value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}): vector<vector<u8>> {
380
395
  let mut value_tuple = vector::empty();
381
396
  value_tuple.push_back(${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(f)[0]==="vector<String>"||z(Object.values(f)[0])?"to_bytes(&value)":`${e}::${i.find(a=>a.type===Object.values(f)[0])?.module}::encode(value)`});
@@ -410,7 +425,7 @@ ${v}
410
425
  }
411
426
  }`:"";return[D,F,j,x,C,K].filter(a=>a.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 de(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${de(t)}`}switch(e){case"u8":return"u8";case"u16":return"u16";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"bool":return"bool";case"address":return"address";case"String":return"string";default:return e}}function ot(e,t,s){let n=[],r=e.name,i=Ie(r),d=R(r),l=s.fields,u=s.keys??[],$=Object.entries(l).filter(([o])=>!u.includes(o)),g=$.map(([o])=>o),f=u.length>0?u.map(o=>`${o}: ${l[o]}`).join(", "):"";if(s.fungible&&g.length===1){let[o,b]=$[0];n.push(`
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(", "),c=[...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.
@@ -439,7 +454,7 @@ ${v}
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.
@@ -451,10 +466,10 @@ ${v}
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,
@@ -465,7 +480,7 @@ ${v}
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,c=h?u[0]:null;for(let[_,v]of Object.entries(o)){if(!(v.accepts??[]).includes(t))continue;let k=I(_),D=`dubhe::dapp_service::ObjectStorage<${r}::${_}::${k}>`,w=_;if(p&&g.length===1){let[,F]=$[0];n.push(`
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
485
  public(package) fun transfer_user_to_${_}(
471
486
  user: &mut UserStorage,
@@ -485,7 +500,7 @@ ${v}
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&&c)if(g.length===1){let[,F]=$[0],j=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${c})))`:`to_bytes(&get(user, ${c}))`,E=Object.entries(e.enums??{}).map(([C])=>({type:I(C),module:C})),x=G(r,F,"bcs",E);n.push(`
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
505
  public(package) fun transfer_user_to_${_}(
491
506
  user: &mut UserStorage,
@@ -542,7 +557,7 @@ ${v}
542
557
  let decoded = decode(raw);
543
558
  set_struct(user, ${c}, decoded, ctx);
544
559
  }`)}for(let[_,v]of Object.entries(b)){if(!(v.accepts??[]).includes(t))continue;let k=I(_),D=`dubhe::dapp_service::SceneStorage<${r}::${_}::${k}>`,w=_,F=v.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${v.authorization.permit}::${I(v.authorization.permit)}>`:"",j=v.authorization.kind==="permit"?` permit: &${F},
545
- `:"",E=v.authorization.kind==="permit"?"permit, ":"",x=v.authorization.kind==="permit"?", ctx":"";if(p&&$.length===1){let[,C]=g[0];n.push(`
560
+ `:"",E=v.authorization.kind==="permit"?"permit, ":"",x=v.authorization.kind==="permit"?", ctx":"";if(p&&g.length===1){let[,C]=$[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
562
  public(package) fun transfer_user_to_${_}(
548
563
  ${j} user: &mut UserStorage,
@@ -563,7 +578,7 @@ ${j} source: &mut ${D},
563
578
  ) {
564
579
  ${r}::${w}::sub_${t}(${E}source, amount${x});
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&&c)if(g.length===1){let[,C]=$[0],K=C==="string"||C==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${c})))`:`to_bytes(&get(user, ${c}))`,P=Object.entries(e.enums??{}).map(([y])=>({type:I(y),module:y})),a=G(r,C,"bcs",P);n.push(`
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
583
  public(package) fun transfer_user_to_${_}(
569
584
  ${j} user: &mut UserStorage,
@@ -619,7 +634,7 @@ ${j} source: &mut ${D},
619
634
  let raw = ${r}::${w}::remove_${t}_data(${E}source, ${c}${x});
620
635
  let decoded = decode(raw);
621
636
  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(`
637
+ }`)}}if(s.listable){let o=!!s.fungible,p=!o&&u.length>0,h=p?u[0]:null,c=`b"${t}"`;if(o&&g.length===1)n.push(`
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.
@@ -635,7 +650,7 @@ ${j} source: &mut ${D},
635
650
  user_storage,
636
651
  ${c},
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,
@@ -695,7 +710,7 @@ ${j} source: &mut ${D},
695
710
  user_storage,
696
711
  ${c},
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,
@@ -787,13 +802,13 @@ ${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},
805
+ }`}function dt(e,t,s,n,r){let i=r.resources??{},d=r.objects??{},l=r.scenes??{},u=W(t),$=N(u),g=[],f=[];for(let o of n){let b=d[o]??l[o];if(!b)continue;let p=b.accepts??[],h=W(o);g.push(` use ${e}::${o};`);let c=p.filter(_=>s.includes(_));for(let _ of c){let v=i[_];if(!v||typeof v=="string")continue;let k=v,D=!!l[o],w=`${e}::${o}::${h}`,F=D?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,j=D?l[o]:void 0,E=j?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${j.authorization.permit}::${W(j.authorization.permit)}>`:"",x=j?.authorization.kind==="permit"?` source_permit: &${E},
791
806
  `:"",C=j?.authorization.kind==="permit"?"source_permit, ":"",K=j?.authorization.kind==="permit"?` ctx: &TxContext,
792
807
  `:"",P=j?.authorization.kind==="permit"?", ctx":"";if(!k.fungible&&k.keys?.length){let a=k.keys[0];f.push(`
793
808
  /// Transfer ${_} (keyed item) from ${o} into this ${t}.
794
809
  public(package) fun transfer_${o}_to_${t}_${_}(
795
810
  ${x} from: &mut ${F},
796
- to: &mut ${g},
811
+ to: &mut ${$},
797
812
  ${a}: u64,
798
813
  ${K}
799
814
  ) {
@@ -803,21 +818,21 @@ ${K}
803
818
  /// Transfer ${_} (fungible) from ${o} into this ${t}.
804
819
  public(package) fun transfer_${o}_to_${t}_${_}(
805
820
  ${x} from: &mut ${F},
806
- to: &mut ${g},
821
+ to: &mut ${$},
807
822
  amount: u64,
808
823
  ${K}
809
824
  ) {
810
825
  ${o}::sub_${_}(${C}from, amount${P});
811
826
  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=`
827
+ }`)}}return{imports:g,functions:f}}async function Re(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
828
+ \u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=W(r),l=`${d}Storage`,u=`b"${r}"`,$=ct(r,i),g=i.accepts??[],f=[];for(let S of g){let T=n[S];if(!T||typeof T=="string")continue;let M=T;!M.fungible&&M.keys?.length?f.push(pt(r,S,M.keys[0])):f.push(ut(r,S))}let{imports:o,functions:b}=dt(s,r,g,i.acceptsFrom??[],e),p=i.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",h=`dubhe::dapp_service::ObjectStorage<${d}>`,c=`
814
829
  public fun assert_${r}_id(storage: &${h}, expected: vector<u8>) {
815
830
  assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);
816
831
  }`,_=`
817
832
  public fun entity_id(storage: &${h}): vector<u8> {
818
833
  *dubhe::dapp_service::object_storage_entity_id(storage)
819
834
  }`,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]
835
+ use std::ascii::String;`:"",w=g.some(S=>{let T=n[S];return!T||typeof T=="string"?!1:!!T.keys?.length&&!T.fungible}),F=g.some(S=>{let T=n[S];return!T||typeof T=="string"?!1:!!T.fungible}),j=w,E=F,x=w,C=!!i.adminOnly,K=[j?` #[error]
821
836
  const EFieldNotFound: vector<u8> = b"Field not found";`:"",E?` #[error]
822
837
  const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",x?` #[error]
823
838
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:"",` #[error]
@@ -847,7 +862,7 @@ ${_}
847
862
  ${c}
848
863
 
849
864
  // \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}
865
+ ${$}
851
866
 
852
867
  // \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
868
  ${f.join(`
@@ -879,8 +894,8 @@ ${p}
879
894
  );
880
895
  }
881
896
  }
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} {
897
+ `;await A(y,it.join(t,`${r}.move`),"formatAndWriteMove")}}import lt from"node:path";function gt(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function Le(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
898
+ \u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=gt(n),i=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
884
899
  use dubhe::dapp_service::{Self, DappStorage};
885
900
  use ${s}::dapp_key;
886
901
  use ${s}::dapp_key::DappKey;
@@ -997,39 +1012,39 @@ ${p}
997
1012
  );
998
1013
  }
999
1014
  }
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}")
1015
+ `;await A(l,lt.join(t,`${n}.move`),"formatAndWriteMove")}}import $t from"node:path";function Y(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function _t(e){return e==="string"||e==="String"?"String":e}function Q(e){return`dubhe::dapp_service::SceneStorage<${e}>`}function q(e,t){if(t.authorization.kind==="permit")return`${e.name}::${t.authorization.permit}::${Y(t.authorization.permit)}`}function X(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${q(e,t)}>`}function mt(e,t,s){let n=Y(t),r=Q(n),i=q(e,s),d=X(e,s),l=[];for(let[u,$]of Object.entries(s.fields)){let g=_t($);s.authorization.kind==="permit"&&i&&d?l.push(`
1016
+ public fun get_${u}(storage: &${r}): ${g} {
1017
+ dubhe::dapp_system::get_scene_field<${n}, ${g}>(storage, b"${u}")
1003
1018
  }
1004
1019
 
1005
1020
  public(package) fun set_${u}(
1006
1021
  permit: &${d},
1007
1022
  storage: &mut ${r},
1008
- value: ${$},
1023
+ value: ${g},
1009
1024
  ctx: &TxContext,
1010
1025
  ) {
1011
- dubhe::dapp_system::set_scene_field<DappKey, ${i}, ${n}, ${$}>(
1026
+ dubhe::dapp_system::set_scene_field<DappKey, ${i}, ${n}, ${g}>(
1012
1027
  dapp_key::new(), permit, storage, b"${u}", value, ctx
1013
1028
  );
1014
1029
  }
1015
1030
 
1016
- public(package) fun remove_${u}_system_maintenance(storage: &mut ${r}): ${$} {
1017
- dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${$}>(
1031
+ public(package) fun remove_${u}_system_maintenance(storage: &mut ${r}): ${g} {
1032
+ dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${g}>(
1018
1033
  dapp_key::new(), storage, b"${u}"
1019
1034
  )
1020
1035
  }`):l.push(`
1021
- public fun get_${u}(storage: &${r}): ${$} {
1022
- dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
1036
+ public fun get_${u}(storage: &${r}): ${g} {
1037
+ dubhe::dapp_system::get_scene_field<${n}, ${g}>(storage, b"${u}")
1023
1038
  }
1024
1039
 
1025
- public(package) fun set_${u}(storage: &mut ${r}, value: ${$}) {
1026
- dubhe::dapp_system::set_scene_field_system<DappKey, ${n}, ${$}>(
1040
+ public(package) fun set_${u}(storage: &mut ${r}, value: ${g}) {
1041
+ dubhe::dapp_system::set_scene_field_system<DappKey, ${n}, ${g}>(
1027
1042
  dapp_key::new(), storage, b"${u}", value
1028
1043
  );
1029
1044
  }
1030
1045
 
1031
- public(package) fun remove_${u}(storage: &mut ${r}): ${$} {
1032
- dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${$}>(
1046
+ public(package) fun remove_${u}(storage: &mut ${r}): ${g} {
1047
+ dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${g}>(
1033
1048
  dapp_key::new(), storage, b"${u}"
1034
1049
  )
1035
1050
  }`)}return l.join(`
@@ -1093,13 +1108,13 @@ ${te(s)} ): vector<u8> {
1093
1108
  let key = sui::bcs::to_bytes(&${r});
1094
1109
  assert!(dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key), EFieldNotFound);
1095
1110
  ${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},
1111
+ }`}function ht(e,t,s,n,r,i){let d=i.resources??{},l=i.objects??{},u=i.scenes??{},$=Y(t),g=Q($),f=[],o=[],b=X(i,s),p=s.authorization.kind==="permit"&&b?` dest_permit: &${b},
1097
1112
  `:"",h=s.authorization.kind==="permit"?"dest_permit, ":"",c=s.authorization.kind==="permit"?` ctx: &TxContext,
1098
1113
  `:"",_=s.authorization.kind==="permit"?", ctx":"";for(let v of r){let k=l[v]??u[v];if(!k)continue;let D=k.accepts??[],w=Y(v);f.push(` use ${e}::${v};`);let F=!!u[v],j=`${e}::${v}::${w}`,E=F?`dubhe::dapp_service::SceneStorage<${j}>`:`dubhe::dapp_service::ObjectStorage<${j}>`,x=F?k:void 0,C=x?X(i,x):void 0,K=x?.authorization.kind==="permit"&&C?` source_permit: &${C},
1099
1114
  `:"",P=x?.authorization.kind==="permit"?"source_permit, ":"",a=x?.authorization.kind==="permit"?", ctx":"",y=D.filter(S=>n.includes(S));for(let S of y){let T=d[S];if(!T||typeof T=="string")continue;let M=T;if(!M.fungible&&M.keys?.length){let J=M.keys[0];o.push(`
1100
1115
  public(package) fun transfer_${v}_to_${t}_${S}(
1101
1116
  ${K}${p} from: &mut ${E},
1102
- to: &mut ${$},
1117
+ to: &mut ${g},
1103
1118
  ${J}: u64,
1104
1119
  ${c} ) {
1105
1120
  let data = ${v}::remove_${S}_data(${P}from, ${J}${a});
@@ -1107,14 +1122,14 @@ ${c} ) {
1107
1122
  }`)}else o.push(`
1108
1123
  public(package) fun transfer_${v}_to_${t}_${S}(
1109
1124
  ${K}${p} from: &mut ${E},
1110
- to: &mut ${$},
1125
+ to: &mut ${g},
1111
1126
  amount: u64,
1112
1127
  ${c} ) {
1113
1128
  ${v}::sub_${S}(${P}from, amount${a});
1114
1129
  add_${S}(${h}to, amount${_});
1115
1130
  }`)}}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]
1131
+ \u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=Y(r),l=`b"${r}"`,u=Q(d),$=mt(e,r,i),g=i.accepts??[],f=[];for(let x of g){let C=n[x];if(!C||typeof C=="string")continue;let K=C;!K.fungible&&K.keys?.length?f.push(yt(e,r,i,x,K.keys[0])):f.push(ft(e,r,i,x))}let{imports:o,functions:b}=ht(s,r,i,g,i.acceptsFrom??[],e),c=Object.values(i.fields).some(x=>x==="string"||x==="String"||x==="vector<String>")?`
1132
+ use std::ascii::String;`:"",_=g.some(x=>{let C=n[x];return!C||typeof C=="string"?!1:!!C.keys?.length&&!C.fungible}),v=g.some(x=>{let C=n[x];return!C||typeof C=="string"?!1:!!C.fungible}),k=[_?` #[error]
1118
1133
  const EFieldNotFound: vector<u8> = b"Field not found";`:"",v?` #[error]
1119
1134
  const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",_?` #[error]
1120
1135
  const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:""].filter(Boolean).join(`
@@ -1170,7 +1185,7 @@ ${D}
1170
1185
  public struct ${d} has copy, drop {}
1171
1186
 
1172
1187
  // \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}
1188
+ ${$}
1174
1189
 
1175
1190
  // \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
1191
  ${f.join(`
@@ -1195,24 +1210,28 @@ ${j}
1195
1210
  );
1196
1211
  }
1197
1212
  }
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 {
1213
+ `;await A(E,$t.join(t,`${r}.move`),"formatAndWriteMove")}}async function Be(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
1199
1214
  use dubhe::dapp_service::{DappHub, DappStorage};
1200
1215
  use dubhe::dapp_system;
1216
+ use ${e.name}::dapp_key;
1201
1217
  use ${e.name}::dapp_key::DappKey;
1218
+ use ${e.name}::migrate;
1202
1219
 
1203
1220
  /// Create a UserStorage for the transaction sender within this DApp.
1204
1221
  /// 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.
1222
+ /// Aborts if the DApp version does not match this package, the DApp is paused,
1223
+ /// or the framework version has advanced.
1206
1224
  #[allow(lint(public_entry))]
1207
1225
  public entry fun init_user_storage(
1208
1226
  dapp_hub: &DappHub,
1209
1227
  dapp_storage: &mut DappStorage,
1210
1228
  ctx: &mut TxContext,
1211
1229
  ) {
1212
- dapp_system::create_user_storage<DappKey>(dapp_hub, dapp_storage, ctx);
1230
+ dapp_system::ensure_latest_version<DappKey>(dapp_storage, migrate::on_chain_version());
1231
+ dapp_system::create_user_storage(dapp_key::new(), dapp_hub, dapp_storage, ctx);
1213
1232
  }
1214
1233
  }
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}:
1234
+ `;await A(s,t,"formatAndWriteMove")}import He from"chalk";import{existsSync as vt,readFileSync as kt,writeFileSync as We}from"fs";import St from"node:path";function xt(e){if(typeof e=="string")return{value:e};let t={};for(let[s,n]of Object.entries(e.fields??{}))t[s]=n;return t}function Ye(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function Ct(e){let t={};for(let[r,i]of Object.entries(e.resources??{}))t[r]=xt(i);let s={};for(let[r,i]of Object.entries(e.objects??{}))s[r]=Ye(i);let n={};for(let[r,i]of Object.entries(e.scenes??{}))n[r]=Ye(i);return{version:1,resources:t,objects:s,scenes:n}}function ge(e,t,s){for(let[n,r]of Object.entries(s)){let i=t[n];if(i)for(let[d,l]of Object.entries(i)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
1216
1235
  Field "${d}" was removed.
1217
1236
 
1218
1237
  Resources, objects, and scenes are stored as raw bytes on-chain.
@@ -1221,9 +1240,9 @@ Removing fields corrupts existing data. Use a new name (e.g. "${n}_v2") for brea
1221
1240
 
1222
1241
  Resources, objects, and scenes are stored as raw bytes on-chain.
1223
1242
  Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function Ve(e,t){let s=St.join(e,`${t.name}.lock.json`),n=Ct(t);if(vt(s)){let r;try{r=JSON.parse(kt(s,"utf-8"))}catch{console.warn(He.yellow("[dubhe]")+` Could not parse ${He.bold(s)}, skipping break-check.`),We(s,JSON.stringify(n,null,2)+`
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(`
1243
+ `,"utf-8");return}ge("resources",r.resources??{},n.resources),ge("objects",r.objects??{},n.objects),ge("scenes",r.scenes??{},n.scenes)}We(s,JSON.stringify(n,null,2)+`
1244
+ `,"utf-8")}import U from"chalk";var se=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function Ge(e){$e(e,!1)}function $e(e,t=!0){let s=e.resources??{},n=e.objects??{},r=e.permits??{},i=e.scenes??{},d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),$=new Set(Object.keys(i)),g=new Set;for(let o of d)(l.has(o)||u.has(o)||$.has(o))&&g.add(o);for(let o of l)(u.has(o)||$.has(o))&&g.add(o);for(let o of u)$.has(o)&&g.add(o);if(g.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[...g].sort().join(", ")}`);let f=new Set;for(let[o,b]of Object.entries(n)){for(let p of b.accepts??[]){f.add(p);let h=s[p];if(!h)throw new Error(`objects.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`objects.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],c=!!i[p];if(!h&&!c)throw new Error(`objects.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(i)){if(!b.authorization)throw new Error(`scenes.${o} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(b.authorization.kind==="permit"){if(!r[b.authorization.permit])throw new Error(`scenes.${o}.authorization references permit '${b.authorization.permit}', but permits.${b.authorization.permit} is not defined`)}else if(b.authorization.kind!=="system")throw new Error(`scenes.${o}.authorization.kind must be 'system' or 'permit'`);for(let p of b.accepts??[]){f.add(p);let h=s[p];if(!h)throw new Error(`scenes.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`scenes.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],c=!!i[p];if(!h&&!c)throw new Error(`scenes.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(s)){if(typeof b=="string")continue;let p=b;if(p.offchain){if(p.listable)throw new Error(`resources.${o} has both offchain: true and listable: true. offchain resources emit events but store no on-chain state, so there is nothing to take out and place into a Listing.`);if(p.transferable)throw new Error(`resources.${o} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if(p.reactive)throw new Error(`resources.${o} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);p.fungible&&t&&se(`resources.${U.bold(o)} has both ${U.cyan("offchain: true")} and ${U.cyan("fungible: true")}. offchain fungible events are emitted only; no on-chain balance is maintained and no add/sub functions are generated. This is unusual \u2014 verify your intent.`)}if(p.reactive&&p.fungible&&t&&se(`resources.${U.bold(o)} has both ${U.cyan("reactive: true")} and ${U.cyan("fungible: true")}. Fungible quantity changes (add/sub) do not suit reactive cross-user writes. Consider using a transfer function instead.`),p.global){if(p.reactive)throw new Error(`resources.${o} has both global: true and reactive: true. global resources live in DappStorage (shared), not in UserStorage. Reactive writes operate between two UserStorage objects and are incompatible with global resources.`);if(p.listable)throw new Error(`resources.${o} has both global: true and listable: true. global resources live in DappStorage and cannot be individually listed for sale. listable requires per-user ownership in UserStorage.`);if(p.transferable)throw new Error(`resources.${o} has both global: true and transferable: true. global resources live in DappStorage and are not owned by individual users. transferable requires per-user state in UserStorage or ObjectStorage.`)}p.fungible&&p.listable&&t&&se(`resources.${U.bold(o)} has both ${U.cyan("fungible: true")} and ${U.cyan("listable: true")}. The generated ${U.green(`list_${o}`)} entry function will include an ${U.cyan("amount")} parameter for partial listings.`),p.transferable&&!f.has(o)&&t&&se(`resources.${U.bold(o)} has ${U.cyan("transferable: true")} but is not referenced in any ${U.cyan("objects.accepts")} or ${U.cyan("scenes.accepts")}. The cross-layer transfer functions will not be generated.`)}}import L from"node:path";async function wt(e,t,s,n=1){console.log(`
1245
+ \u{1F680} Starting Code Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(` \u2514\u2500 Settlement Mode: ${n===1?"USER_PAYS":"DAPP_SUBSIDIZES"}`),$e(t),Ve(e,t),console.log(e);let r=L.join(e,"src",t.name);V(`${r}`)&&ce(`${r}/sources/codegen`),V(`${r}/Move.toml`)||await ve(t,e);let i=L.join(r,"sources","codegen","genesis.move");V(i)||await Ee(t,i,n);let d=L.join(r,"sources","codegen","init_test.move");V(d)||await Ae(t,d);let l=L.join(r,"sources","codegen","dapp_key.move");V(l)||await Ce(t,l);let u=L.join(r,"sources","scripts","deploy_hook.move");V(u)||await Se(t,u,n);let $=L.join(r,"sources","codegen","resources");await Pe(t,$);let g=L.join(r,"sources","codegen","objects");await Re(t,g);let f=L.join(r,"sources","codegen","permits");await Le(t,f);let o=L.join(r,"sources","codegen","scenes");await ze(t,o);let b=L.join(r,"sources","codegen","enums");V(b)||await Fe(t,b),t.errors&&await Te(t.name,t.errors,e);let p=L.join(r,"sources","codegen","user_storage_init.move");await Be(t,p),await je(t,e),await xe(t,e),console.log(`
1227
1246
  \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};
1247
+ `)}var Qs=wt;var tr=e=>(Ge(e),e);import{findUp as Dt}from"find-up";import _e from"path";import jt from"esbuild";var re=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as Tt}from"fs";import{pathToFileURL as At}from"url";import Et from"os";var Ot=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],me="dubhe.config.example.mjs";async function dr(e){e=await qe(e);try{return await jt.build({entryPoints:[e],format:"esm",outfile:me,platform:"node",bundle:!0,packages:"external"}),e=await qe(me,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Tt(me,{force:!0})}}async function qe(e,t){return e===void 0?e=await Ft():_e.isAbsolute(e)||(e=_e.join(process.cwd(),e),e=_e.normalize(e)),t&&Et.platform()==="win32"?At(e).href:e}async function Ft(){let e=await Dt(Ot);if(e===void 0)throw new re;return e}var Kt=(s=>(s.Event="event",s.Schema="schema",s))(Kt||{});export{Kt as SubscriptionKind,Ve as checkAndUpdateLock,wt as codegen,tr as defineConfig,A as formatAndWriteMove,Ut as formatMove,Re as generateObjects,ze as generateScenes,dr as loadConfig,Qs as schemaGen};
1229
1248
  //# sourceMappingURL=index.js.map