@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 +324 -324
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/codegen/utils/renderMove/dapp.ts +2 -2
- package/src/codegen/utils/validateConfig.ts +47 -32
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import me from"prettier";import
|
|
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
|
-
`,
|
|
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=
|
|
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
|
|
66
|
-
\u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([
|
|
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)),
|
|
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,
|
|
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
|
|
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=
|
|
171
|
-
${
|
|
172
|
-
}`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function
|
|
173
|
-
public fun has(${
|
|
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>(${
|
|
176
|
+
${$.has_record}<DappKey>(${g}, key_tuple)
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
public fun ensure_has(${
|
|
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>(${
|
|
182
|
+
${$.ensure_has}<DappKey>(${g}, key_tuple)
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
public fun ensure_has_not(${
|
|
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>(${
|
|
188
|
+
${$.ensure_has_not}<DappKey>(${g}, key_tuple)
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
public(package) fun delete(${
|
|
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)}${
|
|
194
|
+
${$.delete_record}<DappKey>(${L(e)}${g}, key_tuple, vector[b"value"], ctx);
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
-
public fun get(${
|
|
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>(${
|
|
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:
|
|
202
|
+
let value = ${G(e,s,"value_bcs",r?[{type:s,module:i}]:[])};
|
|
203
203
|
(value)
|
|
204
204
|
}
|
|
205
|
-
`,
|
|
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
|
-
${
|
|
209
|
+
${o}
|
|
210
210
|
use dubhe::dapp_system;
|
|
211
211
|
use ${e}::dapp_key;
|
|
212
212
|
use ${e}::dapp_key::DappKey;
|
|
213
|
-
${
|
|
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
|
-
${
|
|
219
|
-
public(package) fun set(${H(e,l)}${
|
|
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)}${
|
|
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}::${
|
|
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
|
|
233
|
-
use sui::bcs::{to_bytes};`:"",E=j.some(
|
|
234
|
-
use std::ascii::{String, into_bytes};`:E||
|
|
235
|
-
use std::ascii::String;`:"",P=
|
|
236
|
-
use std::ascii::{string, String, into_bytes};`:E||
|
|
237
|
-
use std::ascii::String;`:"";if(
|
|
238
|
-
${
|
|
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
|
-
${
|
|
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 = ${
|
|
246
|
+
const OFFCHAIN: bool = ${i};
|
|
247
247
|
|
|
248
|
-
${
|
|
249
|
-
}`;let
|
|
250
|
-
`),y=
|
|
251
|
-
`),T=
|
|
252
|
-
self.${
|
|
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=
|
|
256
|
-
self.${
|
|
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
|
-
${
|
|
260
|
+
${k}
|
|
261
261
|
use dubhe::dapp_system;
|
|
262
262
|
use ${e}::dapp_key;
|
|
263
263
|
use ${e}::dapp_key::DappKey;
|
|
264
|
-
${
|
|
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 = ${
|
|
268
|
+
const OFFCHAIN: bool = ${i};
|
|
269
269
|
|
|
270
270
|
public struct ${K(t)} has copy, drop, store {
|
|
271
|
-
${
|
|
271
|
+
${a}
|
|
272
272
|
}
|
|
273
273
|
|
|
274
274
|
public fun new(${y}): ${K(t)} {
|
|
275
275
|
${K(t)} {
|
|
276
|
-
${
|
|
276
|
+
${S}
|
|
277
277
|
}
|
|
278
278
|
}
|
|
279
279
|
|
|
@@ -281,164 +281,164 @@ ${T}
|
|
|
281
281
|
|
|
282
282
|
${M}
|
|
283
283
|
|
|
284
|
-
${
|
|
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),
|
|
286
|
-
`)}function
|
|
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(
|
|
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);`,
|
|
291
|
-
${
|
|
292
|
-
${$.has_record}<DappKey>(${
|
|
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(${
|
|
296
|
-
${
|
|
297
|
-
${$.ensure_has}<DappKey>(${
|
|
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(${
|
|
301
|
-
${
|
|
302
|
-
${$.ensure_has_not}<DappKey>(${
|
|
300
|
+
public fun ensure_has_not(${g}: &${u}${c?", ":""}${c}) {
|
|
301
|
+
${_}
|
|
302
|
+
${$.ensure_has_not}<DappKey>(${g}, key_tuple)
|
|
303
303
|
}
|
|
304
|
-
`,w=`vector[${
|
|
305
|
-
${
|
|
306
|
-
${$.delete_record}<DappKey>(${L(e)}${
|
|
307
|
-
}`,D=!
|
|
308
|
-
${
|
|
309
|
-
let ${
|
|
310
|
-
let mut ${
|
|
311
|
-
let ${
|
|
312
|
-
${
|
|
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_${
|
|
316
|
-
${
|
|
317
|
-
let value = ${y==="string"||y==="String"?`to_bytes(&into_bytes(${
|
|
318
|
-
${$.set_field}<DappKey>(${L(e)}${B(e,l)}${
|
|
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[${
|
|
322
|
-
${
|
|
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)}${
|
|
326
|
-
}`:
|
|
327
|
-
${
|
|
328
|
-
let field_names = vector[b"${
|
|
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)}${
|
|
331
|
-
}`:` public fun get(${
|
|
332
|
-
${
|
|
333
|
-
let ${
|
|
334
|
-
let mut ${
|
|
335
|
-
let value = ${G(e,Object.values(
|
|
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)}${
|
|
340
|
-
${
|
|
341
|
-
let field_names = vector[b"${
|
|
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)}${
|
|
344
|
-
}`:
|
|
345
|
-
${
|
|
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(${
|
|
348
|
-
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${
|
|
349
|
-
}`:` public fun get(${
|
|
350
|
-
${
|
|
351
|
-
${
|
|
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
|
-
(${
|
|
353
|
+
(${o.join(", ")})
|
|
354
354
|
}
|
|
355
355
|
|
|
356
|
-
public(package) fun set(${H(e,l)}${
|
|
357
|
-
${
|
|
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(${
|
|
360
|
-
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${
|
|
361
|
-
}`,
|
|
362
|
-
${
|
|
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)}${
|
|
366
|
-
}`:` public fun get_struct(${
|
|
367
|
-
${
|
|
368
|
-
${
|
|
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)} { ${
|
|
370
|
+
${K(t)} { ${o.join(", ")} }
|
|
371
371
|
}
|
|
372
372
|
|
|
373
|
-
public(package) fun set_struct(${H(e,l)}${
|
|
374
|
-
${
|
|
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)}${
|
|
378
|
-
}`:"",I=
|
|
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(
|
|
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?
|
|
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
|
-
${
|
|
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(${
|
|
391
|
-
}`:` public fun encode(${
|
|
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
|
-
${
|
|
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(${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
407
|
+
${o.map(a=>`${a},`).join(`
|
|
408
408
|
`)}
|
|
409
409
|
}
|
|
410
|
-
}`:"";return[j,F,D,
|
|
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
|
|
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: ${
|
|
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: ${
|
|
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
|
|
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
|
-
${
|
|
432
|
+
${p},
|
|
433
433
|
ctx: &mut TxContext,
|
|
434
434
|
) {
|
|
435
|
-
ensure_has_not(user_storage, ${
|
|
436
|
-
set(user_storage, ${
|
|
437
|
-
}`)}if(s.reactive){let
|
|
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(
|
|
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
|
|
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
|
-
${
|
|
450
|
+
${f?f+", ":""}${b},
|
|
451
451
|
ctx: &mut TxContext,
|
|
452
452
|
) {
|
|
453
|
-
${
|
|
454
|
-
let field_names = vector[${$.map(
|
|
453
|
+
${o}
|
|
454
|
+
let field_names = vector[${$.map(p=>`b"${p}"`).join(", ")}];
|
|
455
455
|
let value_tuple = encode(${$.join(", ")});
|
|
456
|
-
${
|
|
457
|
-
}`)}for(let[
|
|
458
|
-
public(package) fun set_${
|
|
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
|
-
${
|
|
463
|
+
${f?f+", ":""}${b}: ${p==="string"||p==="String"?"String":p},
|
|
464
464
|
ctx: &mut TxContext,
|
|
465
465
|
) {
|
|
466
|
-
${
|
|
467
|
-
let value = ${
|
|
468
|
-
${
|
|
469
|
-
}`)}}if(s.transferable){let
|
|
470
|
-
// \u2500\u2500\u2500 transferable: User \u2194 ${
|
|
471
|
-
public(package) fun transfer_user_to_${
|
|
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_${
|
|
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(
|
|
490
|
-
// \u2500\u2500\u2500 transferable: User \u2194 ${
|
|
491
|
-
public(package) fun transfer_user_to_${
|
|
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
|
-
${
|
|
494
|
+
${c}: u64,
|
|
495
495
|
ctx: &TxContext,
|
|
496
496
|
) {
|
|
497
|
-
ensure_has(user, ${
|
|
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, ${
|
|
499
|
+
dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
|
|
500
500
|
let raw = ${D};
|
|
501
|
-
delete(user, ${
|
|
502
|
-
${r}::${w}::set_${t}_data(target, ${
|
|
501
|
+
delete(user, ${c}, ctx);
|
|
502
|
+
${r}::${w}::set_${t}_data(target, ${c}, raw);
|
|
503
503
|
}
|
|
504
504
|
|
|
505
|
-
public(package) fun transfer_${
|
|
505
|
+
public(package) fun transfer_${_}_to_user(
|
|
506
506
|
source: &mut ${j},
|
|
507
507
|
user: &mut UserStorage,
|
|
508
|
-
${
|
|
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, ${
|
|
513
|
-
let raw = ${r}::${w}::remove_${t}_data(source, ${
|
|
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 = ${
|
|
516
|
-
set(user, ${
|
|
515
|
+
let value = ${x};
|
|
516
|
+
set(user, ${c}, value, ctx);
|
|
517
517
|
}`)}else n.push(`
|
|
518
|
-
// \u2500\u2500\u2500 transferable: User \u2194 ${
|
|
519
|
-
public(package) fun transfer_user_to_${
|
|
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
|
-
${
|
|
522
|
+
${c}: u64,
|
|
523
523
|
ctx: &TxContext,
|
|
524
524
|
) {
|
|
525
|
-
ensure_has(user, ${
|
|
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, ${
|
|
528
|
-
let data = encode_struct(get_struct(user, ${
|
|
529
|
-
delete(user, ${
|
|
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, ${
|
|
531
|
+
${r}::${w}::set_${t}_data(target, ${c}, raw);
|
|
532
532
|
}
|
|
533
533
|
|
|
534
|
-
public(package) fun transfer_${
|
|
534
|
+
public(package) fun transfer_${_}_to_user(
|
|
535
535
|
source: &mut ${j},
|
|
536
536
|
user: &mut UserStorage,
|
|
537
|
-
${
|
|
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, ${
|
|
542
|
-
let raw = ${r}::${w}::remove_${t}_data(source, ${
|
|
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, ${
|
|
545
|
-
}`)}for(let[
|
|
546
|
-
`:"",E=
|
|
547
|
-
// \u2500\u2500\u2500 transferable: User \u2194 ${
|
|
548
|
-
public(package) fun transfer_user_to_${
|
|
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: ${
|
|
551
|
+
amount: ${C},
|
|
552
552
|
ctx: &mut TxContext,
|
|
553
553
|
) {
|
|
554
554
|
sub(user, amount, ctx);
|
|
555
|
-
${r}::${w}::add_${t}(${E}target, amount${
|
|
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_${
|
|
559
|
+
public(package) fun transfer_${_}_to_user(
|
|
560
560
|
${D} source: &mut ${j},
|
|
561
561
|
user: &mut UserStorage,
|
|
562
|
-
amount: ${
|
|
562
|
+
amount: ${C},
|
|
563
563
|
ctx: &mut TxContext,
|
|
564
564
|
) {
|
|
565
|
-
${r}::${w}::sub_${t}(${E}source, amount${
|
|
565
|
+
${r}::${w}::sub_${t}(${E}source, amount${x});
|
|
566
566
|
add(user, amount, ctx);
|
|
567
|
-
}`)}else if(
|
|
568
|
-
// \u2500\u2500\u2500 transferable: User \u2194 ${
|
|
569
|
-
public(package) fun transfer_user_to_${
|
|
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
|
-
${
|
|
572
|
+
${c}: u64,
|
|
573
573
|
ctx: &TxContext,
|
|
574
574
|
) {
|
|
575
|
-
ensure_has(user, ${
|
|
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, ${
|
|
577
|
+
dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
|
|
578
578
|
let raw = ${I};
|
|
579
|
-
delete(user, ${
|
|
580
|
-
${r}::${w}::set_${t}_data(${E}target, ${
|
|
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_${
|
|
583
|
+
public(package) fun transfer_${_}_to_user(
|
|
584
584
|
${D} source: &mut ${j},
|
|
585
585
|
user: &mut UserStorage,
|
|
586
|
-
${
|
|
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, ${
|
|
591
|
-
let raw = ${r}::${w}::remove_${t}_data(${E}source, ${
|
|
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 = ${
|
|
594
|
-
set(user, ${
|
|
593
|
+
let value = ${a};
|
|
594
|
+
set(user, ${c}, value, ctx);
|
|
595
595
|
}`)}else n.push(`
|
|
596
|
-
// \u2500\u2500\u2500 transferable: User \u2194 ${
|
|
597
|
-
public(package) fun transfer_user_to_${
|
|
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
|
-
${
|
|
600
|
+
${c}: u64,
|
|
601
601
|
ctx: &TxContext,
|
|
602
602
|
) {
|
|
603
|
-
ensure_has(user, ${
|
|
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, ${
|
|
606
|
-
let data = encode_struct(get_struct(user, ${
|
|
607
|
-
delete(user, ${
|
|
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, ${
|
|
609
|
+
${r}::${w}::set_${t}_data(${E}target, ${c}, raw${x});
|
|
610
610
|
}
|
|
611
611
|
|
|
612
|
-
public(package) fun transfer_${
|
|
612
|
+
public(package) fun transfer_${_}_to_user(
|
|
613
613
|
${D} source: &mut ${j},
|
|
614
614
|
user: &mut UserStorage,
|
|
615
|
-
${
|
|
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, ${
|
|
620
|
-
let raw = ${r}::${w}::remove_${t}_data(${E}source, ${
|
|
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, ${
|
|
623
|
-
}`)}}if(s.listable){let
|
|
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
|
-
${
|
|
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(
|
|
679
|
-
`),
|
|
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
|
-
${
|
|
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
|
-
${
|
|
693
|
+
${v}
|
|
694
694
|
dubhe::dapp_system::take_record<DappKey, CoinType>(
|
|
695
695
|
dapp_key::new(),
|
|
696
696
|
user_storage,
|
|
697
|
-
${
|
|
697
|
+
${c},
|
|
698
698
|
record_key,
|
|
699
|
-
vector[${$.map(
|
|
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
|
|
739
|
-
public fun get_${
|
|
740
|
-
dubhe::dapp_system::get_object_field<${s}, ${l}>(storage, b"${
|
|
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_${
|
|
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"${
|
|
745
|
+
dapp_key::new(), storage, b"${i}", value
|
|
746
746
|
);
|
|
747
747
|
}`)}return r.join(`
|
|
748
|
-
`)}function
|
|
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
|
|
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
|
|
792
|
-
`:"",
|
|
793
|
-
`:"",P=D?.authorization.kind==="permit"?", ctx":"";if(!
|
|
794
|
-
/// Transfer ${
|
|
795
|
-
public(package) fun transfer_${
|
|
796
|
-
${
|
|
797
|
-
to: &mut ${
|
|
798
|
-
${
|
|
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 = ${
|
|
802
|
-
set_${
|
|
803
|
-
}`)}else
|
|
804
|
-
/// Transfer ${
|
|
805
|
-
public(package) fun transfer_${
|
|
806
|
-
${
|
|
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
|
-
${
|
|
812
|
-
add_${
|
|
813
|
-
}`)}}return{imports:$,functions:
|
|
814
|
-
\u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,
|
|
815
|
-
public fun assert_${r}_id(storage: &${
|
|
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
|
-
}`,
|
|
818
|
-
public fun entity_id(storage: &${
|
|
817
|
+
}`,_=`
|
|
818
|
+
public fun entity_id(storage: &${h}): vector<u8> {
|
|
819
819
|
*dubhe::dapp_service::object_storage_entity_id(storage)
|
|
820
|
-
}`,j=Object.values(
|
|
821
|
-
use std::ascii::String;`:"",w=$.some(
|
|
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";`:"",
|
|
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";`,
|
|
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=
|
|
828
|
-
`+
|
|
829
|
-
`):"",
|
|
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
|
-
${
|
|
846
|
+
${_}
|
|
847
847
|
|
|
848
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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: ${
|
|
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,
|
|
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=
|
|
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> = ${
|
|
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,
|
|
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, ${
|
|
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
|
|
1040
|
-
dapp_key::new(), permit, storage, ${r}, ${
|
|
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}, ${
|
|
1043
|
-
);`}function
|
|
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
|
|
1048
|
-
public fun get_${n}(storage: &${
|
|
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 ${
|
|
1055
|
+
${N(e,s)} storage: &mut ${i},
|
|
1056
1056
|
amount: u64,
|
|
1057
1057
|
${ee(s)} ) {
|
|
1058
1058
|
let current = get_${n}(storage);
|
|
1059
|
-
${
|
|
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 ${
|
|
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
|
-
${
|
|
1069
|
-
}`}function
|
|
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<${
|
|
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<${
|
|
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<${
|
|
1087
|
-
${
|
|
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<${
|
|
1096
|
-
${
|
|
1097
|
-
}`}function
|
|
1098
|
-
`:"",
|
|
1099
|
-
`:"",
|
|
1100
|
-
`:"",P=
|
|
1101
|
-
public(package) fun transfer_${
|
|
1102
|
-
${I}${
|
|
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
|
-
${
|
|
1105
|
-
${
|
|
1106
|
-
let data = ${
|
|
1107
|
-
set_${
|
|
1108
|
-
}`)}else
|
|
1109
|
-
public(package) fun transfer_${
|
|
1110
|
-
${I}${
|
|
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
|
-
${
|
|
1114
|
-
${
|
|
1115
|
-
add_${
|
|
1116
|
-
}`)}}return{imports:
|
|
1117
|
-
\u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,
|
|
1118
|
-
use std::ascii::String;`:"",
|
|
1119
|
-
const EFieldNotFound: vector<u8> = b"Field not found";`:"",
|
|
1120
|
-
const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",
|
|
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=
|
|
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
|
-
${
|
|
1125
|
-
`:"",w=
|
|
1126
|
-
`+
|
|
1127
|
-
`):"",F=Z(e,
|
|
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,
|
|
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,
|
|
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;${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
|
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
|
|
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=
|
|
1225
|
-
`,"utf-8");return}
|
|
1226
|
-
`,"utf-8")}import U from"chalk";var te=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function
|
|
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"}`)
|
|
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
|
|
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
|