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

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