@0xobelisk/sui-common 1.2.0-pre.122 → 1.2.0-pre.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import be from"prettier";import Je from"prettier-plugin-move-js";async function Ut(e,t){let s;t&&(s=await be.resolveConfig(t));try{return be.format(e,{plugins:[Je],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(n){let r;return n instanceof Error?r=n.message:r=n,console.log(`Error during output formatting: ${r}`),e}}import ye from"node:fs/promises";import Xe from"node:path";import fe from"debug";var ie=fe("dubhe:common"),Ze=fe("dubhe:common");ie.log=console.debug.bind(console);Ze.log=console.error.bind(console);var ae=ie.extend("codegen");ae.log=console.debug.bind(console);async function A(e,t,s){let n=e,r=`// Copyright (c) Obelisk Labs, Inc.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
/* Autogenerated file. Do not edit manually. */
|
|
5
5
|
|
|
6
6
|
`,i=`#[test_only]
|
|
7
7
|
`,d=r+n,l=`#[allow(lint(share_owned))]
|
|
8
|
-
`;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=i+n:t.includes("genesis")&&(d=l+n),await
|
|
8
|
+
`;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=i+n:t.includes("genesis")&&(d=l+n),await ye.mkdir(Xe.dirname(t),{recursive:!0}),await ye.writeFile(t,d),ae(`${s}: ${t}`)}import{existsSync as V}from"fs";import Z from"fs";function ce(e){Z.existsSync(e)&&(Z.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;Z.lstatSync(s).isDirectory()?ce(s):Z.unlinkSync(s)}),Z.rmdirSync(e))}var he={name:"@0xobelisk/sui-common",version:"1.2.0-pre.123",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",author:"team@obelisk.build",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},types:"./dist/index.d.ts",typesVersions:{"*":{index:["./src/index.ts"]}},scripts:{build:"pnpm run type-check && pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",format:"prettier --write .","format:check":"prettier --check .",lint:"eslint . --ext .ts",test:"vitest","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^10.5.0",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5",typescript:"^5.8.3",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^22.16.0","@types/yargs":"^17.0.10",eslint:"^9.0.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3"},engines:{node:">=22.0.0"},publishConfig:{access:"public"}};async function ve(e,t){console.log(`
|
|
9
9
|
\u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/src/${e.name}/Move.toml`);let s=`[package]
|
|
10
10
|
name = "${e.name}"
|
|
11
11
|
version = "1.0.0"
|
|
@@ -13,13 +13,13 @@ edition = "2024"
|
|
|
13
13
|
|
|
14
14
|
[dependencies]
|
|
15
15
|
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.46.3" }
|
|
16
|
-
Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "framework/src/dubhe", rev = "v${
|
|
16
|
+
Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "framework/src/dubhe", rev = "v${he.version}" }
|
|
17
17
|
|
|
18
18
|
[addresses]
|
|
19
19
|
sui = "0x2"
|
|
20
20
|
${e.name} = "0x0"
|
|
21
21
|
`;await A(s,`${t}/src/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
|
|
22
|
-
`)}import{existsSync as
|
|
22
|
+
`)}import{existsSync as ke}from"fs";async function Se(e,t,s=1){if(!ke(t)){let n=s===1?`// Settlement mode: USER_PAYS \u2014 users pay transaction fees at settlement time.
|
|
23
23
|
// The framework admin sets the revenue share via set_dapp_revenue_share.
|
|
24
24
|
// Initialise any DappStorage-level defaults here (e.g. resource starting values).`:`// Settlement mode: DAPP_SUBSIDIZES \u2014 the DApp pays for user operations.
|
|
25
25
|
// Recharge the credit pool via dapp_system::recharge_credit before users can write.
|
|
@@ -29,14 +29,14 @@ ${e.name} = "0x0"
|
|
|
29
29
|
public(package) fun run(_dapp_storage: &mut DappStorage, _ctx: &mut TxContext) {
|
|
30
30
|
${n}
|
|
31
31
|
}
|
|
32
|
-
}`;await A(r,t,"formatAndWriteMove")}}async function
|
|
32
|
+
}`;await A(r,t,"formatAndWriteMove")}}async function xe(e,t){if(!ke(`${t}/src/${e.name}/sources/scripts/migrate.move`)){let s=`module ${e.name}::migrate {
|
|
33
33
|
const ON_CHAIN_VERSION: u32 = 1;
|
|
34
34
|
|
|
35
35
|
public fun on_chain_version(): u32 {
|
|
36
36
|
ON_CHAIN_VERSION
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
`;await A(s,`${t}/src/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function
|
|
39
|
+
`;await A(s,`${t}/src/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function Ce(e,t){let s=`module ${e.name}::dapp_key {
|
|
40
40
|
use std::type_name;
|
|
41
41
|
use sui::address;
|
|
42
42
|
use std::ascii::String;
|
|
@@ -62,14 +62,14 @@ ${e.name} = "0x0"
|
|
|
62
62
|
type_name::with_defining_ids<DappKey1>() == type_name::with_defining_ids<DappKey2>()
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
`;await A(s,t,"formatAndWriteMove")}import{existsSync as
|
|
66
|
-
\u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([i,d])=>{let l=
|
|
65
|
+
`;await A(s,t,"formatAndWriteMove")}import{existsSync as we}from"fs";import De from"node:fs/promises";async function je(e,t){we(`${t}/src/${e.name}/sources/systems`)||await De.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),we(`${t}/src/${e.name}/sources/tests`)||await De.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}function Ne(e){return"E"+e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function et(e){return typeof e=="string"?e:e.message}async function Te(e,t,s){console.log(`
|
|
66
|
+
\u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([i,d])=>{let l=Ne(i),u=et(d);return console.log(` \u2514\u2500 ${i}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${i}(condition: bool) { assert!(condition, ${l}) }`].join(`
|
|
67
67
|
`)}).join(`
|
|
68
68
|
|
|
69
69
|
`),r=`module ${e}::error {
|
|
70
70
|
${n}
|
|
71
71
|
}
|
|
72
|
-
`;await A(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function
|
|
72
|
+
`;await A(r,`${s}/src/${e}/sources/codegen/error.move`,"formatAndWriteMove")}async function Ae(e,t){let n=e.name==="dubhe"?"":`
|
|
73
73
|
/// Create a DappStorage for this DApp without sharing it.
|
|
74
74
|
/// Suitable for unit tests that exercise global-resource functions.
|
|
75
75
|
public fun create_dapp_storage_for_testing(ctx: &mut TxContext): dubhe::dapp_service::DappStorage {
|
|
@@ -91,7 +91,7 @@ module ${e.name}::init_test {
|
|
|
91
91
|
}
|
|
92
92
|
${n}
|
|
93
93
|
}
|
|
94
|
-
`;await A(r,t,"formatAndWriteMove")}async function
|
|
94
|
+
`;await A(r,t,"formatAndWriteMove")}async function Ee(e,t,s=1){let r=e.name==="dubhe"?`module ${e.name}::genesis {
|
|
95
95
|
use dubhe::dapp_service::DappHub;
|
|
96
96
|
|
|
97
97
|
// The framework genesis initialises the DappHub state via deploy_hook.
|
|
@@ -141,8 +141,8 @@ ${n}
|
|
|
141
141
|
// ==========================================
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
|
-
`;await A(r,t,"formatAndWriteMove")}function
|
|
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=
|
|
144
|
+
`;await A(r,t,"formatAndWriteMove")}function Oe(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Fe(e,t){if(console.log(`
|
|
145
|
+
\u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,n]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`);let r=[...n].sort((d,l)=>d.localeCompare(l)),i=tt(e.name,s,r);await A(i,`${t}/${Oe(s)}.move`,"formatAndWriteMove")}}function tt(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Oe(t)} {
|
|
146
146
|
use sui::bcs::{BCS, to_bytes, peel_enum_tag};
|
|
147
147
|
|
|
148
148
|
public enum ${t} has copy, drop, store {
|
|
@@ -166,10 +166,10 @@ ${s.map((r,i)=>` ${i} => ${t}::${r.charAt(0).toUpperCase()+r.slice(1)
|
|
|
166
166
|
_ => abort,
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
|
-
}`}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=
|
|
169
|
+
}`}function Ie(e){return e==="dubhe"?"dapp_service":"dapp_system"}function L(e){return e!=="dubhe"?"dapp_key::new(), ":""}function B(e,t){return""}function H(e,t){return""}function Me(e){return e?"DappStorage":"UserStorage"}function Ue(e){return e?"dapp_storage":"user_storage"}function pe(e,t){let s=Ie(e);return t?{set_record:`${s}::set_global_record`,set_field:`${s}::set_global_field`,get_field:`${s}::get_global_field`,has_record:`${s}::has_global_record`,ensure_has:`${s}::ensure_has_global_record`,ensure_has_not:`${s}::ensure_has_not_global_record`,delete_record:`${s}::delete_global_record`,delete_field:`${s}::delete_global_field`}:{set_record:`${s}::set_record`,set_field:`${s}::set_field`,get_field:`${s}::get_field`,has_record:`${s}::has_record`,ensure_has:`${s}::ensure_has_record`,ensure_has_not:`${s}::ensure_has_not_record`,delete_record:`${s}::delete_record`,delete_field:`${s}::delete_field`}}async function Pe(e,t){if(console.log(`
|
|
170
|
+
\u{1F4E6} Starting Resources Generation...`),!!e.resources)for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=st(e.name,s,n,"Onchain");await A(l,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let r=rt(e.name,s,n),i=ot(e,s,n),d=i?r.replace(/^}$/m,`
|
|
171
171
|
${i}
|
|
172
|
-
}`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function
|
|
172
|
+
}`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function st(e,t,s,n="Onchain"){let r=!z(s),i=r?`${ue(s)}`:"",d=n==="Offchain",l=!1,u=Me(l),g=Ue(l),$=pe(e,l),f=d?"":`
|
|
173
173
|
public fun has(${g}: &${u}): bool {
|
|
174
174
|
let mut key_tuple = vector::empty();
|
|
175
175
|
key_tuple.push_back(TABLE_NAME);
|
|
@@ -229,13 +229,14 @@ ${f}
|
|
|
229
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
|
|
234
|
-
use
|
|
235
|
-
use std::ascii::String;`:
|
|
236
|
-
use std::ascii::
|
|
237
|
-
use std::ascii::String;`:
|
|
238
|
-
${
|
|
232
|
+
}`}function ue(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function rt(e,t,s){let n=s.fields,r=s.keys||[],i=s.offchain||!1,d=s.global||!1,l=i?"Offchain":"Onchain",u=d,g=Me(u),$=Ue(u),f=pe(e,u),o=Object.keys(n).every(m=>r.includes(m)),b=Object.entries(n).filter(([m])=>!r.includes(m)),p=b.map(([m])=>m),h=p.length===1,c=b.filter(([m,O])=>!z(O)&&O!=="string"&&O!=="String").map(([m,O])=>({type:O,module:`${ue(O)}`})).filter((m,O,ne)=>ne.findIndex(oe=>oe.type===m.type)===O),_=Object.entries(n).filter(([m,O])=>!z(O)&&O!=="string"&&O!=="String").map(([m,O])=>({type:O,module:`${ue(O)}`})).filter((m,O,ne)=>ne.findIndex(oe=>oe.type===m.type)===O),v=nt(e,t,n,r,!o&&!h,c,l,u,g,$,f),k=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",D=s.reactive?`
|
|
233
|
+
use dubhe::dapp_service::ScenePermit;`:"",w=Object.values(n),E=p.filter(m=>{let O=n[m];return z(O)||O==="string"||O==="String"}).length>0||r.length>0?`
|
|
234
|
+
use sui::bcs::{to_bytes};`:"",x=w.some(m=>m==="string"||m==="String"),C=w.some(m=>m==="vector<String>"),K=p.some(m=>{let O=n[m];return O==="string"||O==="String"}),P=K?`
|
|
235
|
+
use std::ascii::{String, into_bytes};`:x||C?`
|
|
236
|
+
use std::ascii::String;`:"",a=K?`
|
|
237
|
+
use std::ascii::{string, String, into_bytes};`:x||C?`
|
|
238
|
+
use std::ascii::String;`:"";if(o||h)return`module ${e}::${t} {${E}${P}
|
|
239
|
+
${k}${D}
|
|
239
240
|
use dubhe::dapp_system;
|
|
240
241
|
use ${e}::dapp_key;
|
|
241
242
|
use ${e}::dapp_key::DappKey;
|
|
@@ -246,18 +247,18 @@ ${_.length>0?_.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
|
|
|
246
247
|
const OFFCHAIN: bool = ${i};
|
|
247
248
|
|
|
248
249
|
${v}
|
|
249
|
-
}`;let
|
|
250
|
-
`),
|
|
251
|
-
`),
|
|
250
|
+
}`;let y=p.map(m=>` ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]},`).join(`
|
|
251
|
+
`),S=p.map(m=>`${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]}`).join(", "),T=p.map(m=>` ${m},`).join(`
|
|
252
|
+
`),M=p.map(m=>` public fun ${m}(self: &${I(t)}): ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]} {
|
|
252
253
|
self.${m}
|
|
253
254
|
}`).join(`
|
|
254
255
|
|
|
255
|
-
`),
|
|
256
|
+
`),J=p.map(m=>` public fun update_${m}(self: &mut ${I(t)}, ${m}: ${n[m]==="string"||n[m]==="String"?"String":n[m]==="vector<String>"?"vector<String>":n[m]}) {
|
|
256
257
|
self.${m} = ${m}
|
|
257
258
|
}`).join(`
|
|
258
259
|
|
|
259
|
-
`);return`module ${e}::${t} {${
|
|
260
|
-
${k}
|
|
260
|
+
`);return`module ${e}::${t} {${E}${a}
|
|
261
|
+
${k}${D}
|
|
261
262
|
use dubhe::dapp_system;
|
|
262
263
|
use ${e}::dapp_key;
|
|
263
264
|
use ${e}::dapp_key::DappKey;
|
|
@@ -267,27 +268,27 @@ ${_.length>0?_.map(m=>` use ${e}::${m.module}::{${m.type}};`).join(`
|
|
|
267
268
|
const TABLE_NAME: vector<u8> = b"${t}";
|
|
268
269
|
const OFFCHAIN: bool = ${i};
|
|
269
270
|
|
|
270
|
-
public struct ${
|
|
271
|
-
${
|
|
271
|
+
public struct ${I(t)} has copy, drop, store {
|
|
272
|
+
${y}
|
|
272
273
|
}
|
|
273
274
|
|
|
274
|
-
public fun new(${
|
|
275
|
-
${
|
|
276
|
-
${
|
|
275
|
+
public fun new(${S}): ${I(t)} {
|
|
276
|
+
${I(t)} {
|
|
277
|
+
${T}
|
|
277
278
|
}
|
|
278
279
|
}
|
|
279
280
|
|
|
280
|
-
${T}
|
|
281
|
-
|
|
282
281
|
${M}
|
|
283
282
|
|
|
283
|
+
${J}
|
|
284
|
+
|
|
284
285
|
${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_${
|
|
286
|
-
`)}function
|
|
286
|
+
}`}function z(e){return["address","bool","u8","u16","u32","u64","u128","u256","string","String","vector<address>","vector<bool>","vector<u8>","vector<u16>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>","vector<String>"].includes(e)}function G(e,t,s,n){let r=!z(t),i=r?n.find(d=>d.type===t):null;return t==="string"||t==="String"?`dubhe::bcs::peel_string(&mut ${s})`:t==="vector<String>"?`dubhe::bcs::peel_vec_string(&mut ${s})`:r&&i?`${e}::${i.module}::decode(&mut ${s})`:`sui::bcs::peel_${de(t)}(&mut ${s})`}function Ke(e,t,s,n,r,i,d){let l=`${n}_raw`,u=`${n}_bcs`;return[`let ${l} = ${t.get_field}<DappKey>(${s}, key_tuple, b"${n}");`,`let mut ${u} = sui::bcs::new(${l});`,`let ${n} = ${G(e,r,u,d)};`].join(`
|
|
287
|
+
`)}function nt(e,t,s,n,r=!0,i=[],d="Onchain",l=!1,u="UserStorage",g="user_storage",$=pe("dubhe",!1)){let f=Object.entries(s).filter(([a])=>!n.includes(a)).reduce((a,[y,S])=>({...a,[y]:S}),{}),o=Object.keys(f),b=Object.keys(s).every(a=>n.includes(a)),p=o.length===1,h=d==="Offchain",c=n.length>0?n.map(a=>`${a}: ${s[a]}`).join(", "):"",_=n.length>0?`let mut key_tuple = vector::empty();
|
|
287
288
|
key_tuple.push_back(TABLE_NAME);
|
|
288
289
|
${n.map(a=>`key_tuple.push_back(to_bytes(&${a}));`).join(`
|
|
289
290
|
`)}`:`let mut key_tuple = vector::empty();
|
|
290
|
-
key_tuple.push_back(TABLE_NAME);`,v=l?"":", ctx: &mut TxContext",k=l?"":", ctx",
|
|
291
|
+
key_tuple.push_back(TABLE_NAME);`,v=l?"":", ctx: &mut TxContext",k=l?"":", ctx",D=h?"":` public fun has(${g}: &${u}${c?", ":""}${c}): bool {
|
|
291
292
|
${_}
|
|
292
293
|
${$.has_record}<DappKey>(${g}, key_tuple)
|
|
293
294
|
}
|
|
@@ -304,7 +305,7 @@ ${v}
|
|
|
304
305
|
`,w=`vector[${o.map(a=>`b"${a}"`).join(", ")}]`,F=h?"":` public(package) fun delete(${g}: &mut ${u}${c?", ":""}${c}${l?"":", ctx: &TxContext"}) {
|
|
305
306
|
${_}
|
|
306
307
|
${$.delete_record}<DappKey>(${L(e)}${g}, key_tuple, ${w}${l?"":", ctx"});
|
|
307
|
-
}`,
|
|
308
|
+
}`,j=!p&&!h?o.map(a=>{let y=s[a],S=!z(y),T=S?i.find(M=>M.type===y):null;return` public fun get_${a}(${g}: &${u}${c?", ":""}${c}): ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y} {
|
|
308
309
|
${_}
|
|
309
310
|
let ${a}_raw = ${$.get_field}<DappKey>(${g}, key_tuple, b"${a}");
|
|
310
311
|
let mut ${a}_bcs = sui::bcs::new(${a}_raw);
|
|
@@ -348,7 +349,7 @@ ${v}
|
|
|
348
349
|
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
|
|
349
350
|
}`:` public fun get(${g}: &${u}${c?", ":""}${c}): (${Object.values(f).map(a=>a==="string"||a==="String"?"String":a).join(", ")}) {
|
|
350
351
|
${_}
|
|
351
|
-
${o.map((a,y)=>
|
|
352
|
+
${o.map((a,y)=>Ke(e,$,g,a,s[a],y,i)).join(`
|
|
352
353
|
`)}
|
|
353
354
|
(${o.join(", ")})
|
|
354
355
|
}
|
|
@@ -358,24 +359,24 @@ ${v}
|
|
|
358
359
|
let field_names = ${E};
|
|
359
360
|
let value_tuple = encode(${o.join(", ")});
|
|
360
361
|
${$.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}: ${
|
|
362
|
+
}`,C=r?h?` public(package) fun set_struct(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
|
|
362
363
|
${_}
|
|
363
364
|
let field_names = ${E};
|
|
364
365
|
let value_tuple = encode_struct(${t});
|
|
365
366
|
${$.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}): ${
|
|
367
|
+
}`:` public fun get_struct(${g}: &${u}${c?", ":""}${c}): ${I(t)} {
|
|
367
368
|
${_}
|
|
368
|
-
${o.map((a,y)=>
|
|
369
|
+
${o.map((a,y)=>Ke(e,$,g,a,s[a],y,i)).join(`
|
|
369
370
|
`)}
|
|
370
|
-
${
|
|
371
|
+
${I(t)} { ${o.join(", ")} }
|
|
371
372
|
}
|
|
372
373
|
|
|
373
|
-
public(package) fun set_struct(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${t}: ${
|
|
374
|
+
public(package) fun set_struct(${H(e,l)}${g}: &mut ${u}${c?", ":""}${c}, ${t}: ${I(t)}${v}) {
|
|
374
375
|
${_}
|
|
375
376
|
let field_names = ${E};
|
|
376
377
|
let value_tuple = encode_struct(${t});
|
|
377
378
|
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${g}, key_tuple, field_names, value_tuple, OFFCHAIN${k});
|
|
378
|
-
}`:"",
|
|
379
|
+
}`:"",K=p?` public fun encode(value: ${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"String":Object.values(f)[0]}): vector<vector<u8>> {
|
|
379
380
|
let mut value_tuple = vector::empty();
|
|
380
381
|
value_tuple.push_back(${Object.values(f)[0]==="string"||Object.values(f)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(f)[0]==="vector<String>"||z(Object.values(f)[0])?"to_bytes(&value)":`${e}::${i.find(a=>a.type===Object.values(f)[0])?.module}::encode(value)`});
|
|
381
382
|
value_tuple
|
|
@@ -386,7 +387,7 @@ ${v}
|
|
|
386
387
|
value_tuple
|
|
387
388
|
}
|
|
388
389
|
|
|
389
|
-
public fun encode_struct(${t}: ${
|
|
390
|
+
public fun encode_struct(${t}: ${I(t)}): vector<vector<u8>> {
|
|
390
391
|
encode(${o.map(a=>`${t}.${a}`).join(", ")})
|
|
391
392
|
}`:` public fun encode(${o.map(a=>`${a}: ${s[a]==="string"||s[a]==="String"?"String":s[a]}`).join(", ")}): vector<vector<u8>> {
|
|
392
393
|
let mut value_tuple = vector::empty();
|
|
@@ -395,21 +396,21 @@ ${v}
|
|
|
395
396
|
value_tuple
|
|
396
397
|
}
|
|
397
398
|
|
|
398
|
-
public fun encode_struct(${t}: ${
|
|
399
|
+
public fun encode_struct(${t}: ${I(t)}): vector<vector<u8>> {
|
|
399
400
|
encode(${o.map(a=>`${t}.${a}`).join(", ")})
|
|
400
401
|
}
|
|
401
402
|
|
|
402
|
-
public fun decode(data: vector<u8>): ${
|
|
403
|
+
public fun decode(data: vector<u8>): ${I(t)} {
|
|
403
404
|
let mut bcs_type = sui::bcs::new(data);
|
|
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_${
|
|
405
|
+
${o.map(a=>{let y=s[a],S=!z(y),T=S?i.find(M=>M.type===y):null;return`let ${a} = ${y==="string"||y==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":y==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":S?`${e}::${T?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${de(y)}(&mut bcs_type)`};`}).join(`
|
|
405
406
|
`)}
|
|
406
|
-
${
|
|
407
|
+
${I(t)} {
|
|
407
408
|
${o.map(a=>`${a},`).join(`
|
|
408
409
|
`)}
|
|
409
410
|
}
|
|
410
|
-
}`:"";return[
|
|
411
|
+
}`:"";return[D,F,j,x,C,K].filter(a=>a.trim().length>0).join(`
|
|
411
412
|
|
|
412
|
-
`)}function
|
|
413
|
+
`)}function I(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function de(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${de(t)}`}switch(e){case"u8":return"u8";case"u16":return"u16";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"bool":return"bool";case"address":return"address";case"String":return"string";default:return e}}function ot(e,t,s){let n=[],r=e.name,i=Ie(r),d=L(r),l=s.fields,u=s.keys??[],g=Object.entries(l).filter(([o])=>!u.includes(o)),$=g.map(([o])=>o),f=u.length>0?u.map(o=>`${o}: ${l[o]}`).join(", "):"";if(s.fungible&&$.length===1){let[o,b]=g[0];n.push(`
|
|
413
414
|
// \u2500\u2500\u2500 fungible add / sub \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
414
415
|
#[error]
|
|
415
416
|
const EInsufficientAmount: vector<u8> = b"Insufficient amount";
|
|
@@ -442,9 +443,8 @@ ${v}
|
|
|
442
443
|
// \u2500\u2500\u2500 reactive: cross-user write variants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
443
444
|
// Package-level helpers: add pause checks and access control in your system
|
|
444
445
|
// functions before calling these.
|
|
445
|
-
public(package) fun set_reactive(
|
|
446
|
-
|
|
447
|
-
meta: &dubhe::dapp_service::PermitMetadata,
|
|
446
|
+
public(package) fun set_reactive<PermType>(
|
|
447
|
+
permit: &ScenePermit<PermType>,
|
|
448
448
|
from: &mut UserStorage,
|
|
449
449
|
target: &mut UserStorage,
|
|
450
450
|
${f?f+", ":""}${b},
|
|
@@ -453,11 +453,10 @@ ${v}
|
|
|
453
453
|
${o}
|
|
454
454
|
let field_names = vector[${$.map(p=>`b"${p}"`).join(", ")}];
|
|
455
455
|
let value_tuple = encode(${$.join(", ")});
|
|
456
|
-
${i}::set_record_reactive<DappKey>(${d}
|
|
456
|
+
${i}::set_record_reactive<DappKey, PermType>(${d}permit, from, target, key_tuple, field_names, value_tuple, ctx);
|
|
457
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
|
-
|
|
460
|
-
meta: &dubhe::dapp_service::PermitMetadata,
|
|
458
|
+
public(package) fun set_${b}_reactive<PermType>(
|
|
459
|
+
permit: &ScenePermit<PermType>,
|
|
461
460
|
from: &mut UserStorage,
|
|
462
461
|
target: &mut UserStorage,
|
|
463
462
|
${f?f+", ":""}${b}: ${p==="string"||p==="String"?"String":p},
|
|
@@ -465,12 +464,12 @@ ${v}
|
|
|
465
464
|
) {
|
|
466
465
|
${o}
|
|
467
466
|
let value = ${h};
|
|
468
|
-
${i}::set_field_reactive<DappKey>(${d}
|
|
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=
|
|
467
|
+
${i}::set_field_reactive<DappKey, PermType>(${d}permit, from, target, key_tuple, b"${b}", value, ctx);
|
|
468
|
+
}`)}}if(s.transferable){let o=e.objects??{},b=e.scenes??{},p=!!s.fungible,h=!p&&u.length>0,c=h?u[0]:null;for(let[_,v]of Object.entries(o)){if(!(v.accepts??[]).includes(t))continue;let k=I(_),D=`dubhe::dapp_service::ObjectStorage<${r}::${_}::${k}>`,w=_;if(p&&$.length===1){let[,F]=g[0];n.push(`
|
|
470
469
|
// \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
471
470
|
public(package) fun transfer_user_to_${_}(
|
|
472
471
|
user: &mut UserStorage,
|
|
473
|
-
target: &mut ${
|
|
472
|
+
target: &mut ${D},
|
|
474
473
|
amount: ${F},
|
|
475
474
|
ctx: &mut TxContext,
|
|
476
475
|
) {
|
|
@@ -479,31 +478,31 @@ ${v}
|
|
|
479
478
|
}
|
|
480
479
|
|
|
481
480
|
public(package) fun transfer_${_}_to_user(
|
|
482
|
-
source: &mut ${
|
|
481
|
+
source: &mut ${D},
|
|
483
482
|
user: &mut UserStorage,
|
|
484
483
|
amount: ${F},
|
|
485
484
|
ctx: &mut TxContext,
|
|
486
485
|
) {
|
|
487
486
|
${r}::${w}::sub_${t}(source, amount);
|
|
488
487
|
add(user, amount, ctx);
|
|
489
|
-
}`)}else if(h&&c)if($.length===1){let[,F]=g[0],
|
|
488
|
+
}`)}else if(h&&c)if($.length===1){let[,F]=g[0],j=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${c})))`:`to_bytes(&get(user, ${c}))`,E=Object.entries(e.enums??{}).map(([C])=>({type:I(C),module:C})),x=G(r,F,"bcs",E);n.push(`
|
|
490
489
|
// \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
491
490
|
public(package) fun transfer_user_to_${_}(
|
|
492
491
|
user: &mut UserStorage,
|
|
493
|
-
target: &mut ${
|
|
492
|
+
target: &mut ${D},
|
|
494
493
|
${c}: u64,
|
|
495
494
|
ctx: &TxContext,
|
|
496
495
|
) {
|
|
497
496
|
ensure_has(user, ${c});
|
|
498
497
|
// Guard before any mutation: abort if target already holds this item.
|
|
499
498
|
dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
|
|
500
|
-
let raw = ${
|
|
499
|
+
let raw = ${j};
|
|
501
500
|
delete(user, ${c}, ctx);
|
|
502
501
|
${r}::${w}::set_${t}_data(target, ${c}, raw);
|
|
503
502
|
}
|
|
504
503
|
|
|
505
504
|
public(package) fun transfer_${_}_to_user(
|
|
506
|
-
source: &mut ${
|
|
505
|
+
source: &mut ${D},
|
|
507
506
|
user: &mut UserStorage,
|
|
508
507
|
${c}: u64,
|
|
509
508
|
ctx: &mut TxContext,
|
|
@@ -518,7 +517,7 @@ ${v}
|
|
|
518
517
|
// \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed, multi-field) \u2500\u2500
|
|
519
518
|
public(package) fun transfer_user_to_${_}(
|
|
520
519
|
user: &mut UserStorage,
|
|
521
|
-
target: &mut ${
|
|
520
|
+
target: &mut ${D},
|
|
522
521
|
${c}: u64,
|
|
523
522
|
ctx: &TxContext,
|
|
524
523
|
) {
|
|
@@ -532,7 +531,7 @@ ${v}
|
|
|
532
531
|
}
|
|
533
532
|
|
|
534
533
|
public(package) fun transfer_${_}_to_user(
|
|
535
|
-
source: &mut ${
|
|
534
|
+
source: &mut ${D},
|
|
536
535
|
user: &mut UserStorage,
|
|
537
536
|
${c}: u64,
|
|
538
537
|
ctx: &mut TxContext,
|
|
@@ -542,12 +541,12 @@ ${v}
|
|
|
542
541
|
let raw = ${r}::${w}::remove_${t}_data(source, ${c});
|
|
543
542
|
let decoded = decode(raw);
|
|
544
543
|
set_struct(user, ${c}, decoded, ctx);
|
|
545
|
-
}`)}for(let[_,v]of Object.entries(b)){if(!(v.accepts??[]).includes(t))continue;let k=
|
|
544
|
+
}`)}for(let[_,v]of Object.entries(b)){if(!(v.accepts??[]).includes(t))continue;let k=I(_),D=`dubhe::dapp_service::SceneStorage<${r}::${_}::${k}>`,w=_,F=v.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${v.authorization.permit}::${I(v.authorization.permit)}>`:"",j=v.authorization.kind==="permit"?` permit: &${F},
|
|
546
545
|
`:"",E=v.authorization.kind==="permit"?"permit, ":"",x=v.authorization.kind==="permit"?", ctx":"";if(p&&$.length===1){let[,C]=g[0];n.push(`
|
|
547
546
|
// \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
548
547
|
public(package) fun transfer_user_to_${_}(
|
|
549
|
-
${
|
|
550
|
-
target: &mut ${
|
|
548
|
+
${j} user: &mut UserStorage,
|
|
549
|
+
target: &mut ${D},
|
|
551
550
|
amount: ${C},
|
|
552
551
|
ctx: &mut TxContext,
|
|
553
552
|
) {
|
|
@@ -557,31 +556,31 @@ ${D} user: &mut UserStorage,
|
|
|
557
556
|
|
|
558
557
|
// \u2605 No expiry check on withdraw direction \u2014 prevents asset lock-in expired scenes.
|
|
559
558
|
public(package) fun transfer_${_}_to_user(
|
|
560
|
-
${
|
|
559
|
+
${j} source: &mut ${D},
|
|
561
560
|
user: &mut UserStorage,
|
|
562
561
|
amount: ${C},
|
|
563
562
|
ctx: &mut TxContext,
|
|
564
563
|
) {
|
|
565
564
|
${r}::${w}::sub_${t}(${E}source, amount${x});
|
|
566
565
|
add(user, amount, ctx);
|
|
567
|
-
}`)}else if(h&&c)if($.length===1){let[,C]=g[0],
|
|
566
|
+
}`)}else if(h&&c)if($.length===1){let[,C]=g[0],K=C==="string"||C==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${c})))`:`to_bytes(&get(user, ${c}))`,P=Object.entries(e.enums??{}).map(([y])=>({type:I(y),module:y})),a=G(r,C,"bcs",P);n.push(`
|
|
568
567
|
// \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
569
568
|
public(package) fun transfer_user_to_${_}(
|
|
570
|
-
${
|
|
571
|
-
target: &mut ${
|
|
569
|
+
${j} user: &mut UserStorage,
|
|
570
|
+
target: &mut ${D},
|
|
572
571
|
${c}: u64,
|
|
573
572
|
ctx: &TxContext,
|
|
574
573
|
) {
|
|
575
574
|
ensure_has(user, ${c});
|
|
576
575
|
// Guard before any mutation: abort if target already holds this item.
|
|
577
576
|
dubhe::error::item_already_owned(!${r}::${w}::has_${t}(target, ${c}));
|
|
578
|
-
let raw = ${
|
|
577
|
+
let raw = ${K};
|
|
579
578
|
delete(user, ${c}, ctx);
|
|
580
579
|
${r}::${w}::set_${t}_data(${E}target, ${c}, raw${x});
|
|
581
580
|
}
|
|
582
581
|
|
|
583
582
|
public(package) fun transfer_${_}_to_user(
|
|
584
|
-
${
|
|
583
|
+
${j} source: &mut ${D},
|
|
585
584
|
user: &mut UserStorage,
|
|
586
585
|
${c}: u64,
|
|
587
586
|
ctx: &mut TxContext,
|
|
@@ -595,8 +594,8 @@ ${D} source: &mut ${j},
|
|
|
595
594
|
}`)}else n.push(`
|
|
596
595
|
// \u2500\u2500\u2500 transferable: User \u2194 ${k}Storage (keyed, multi-field) \u2500
|
|
597
596
|
public(package) fun transfer_user_to_${_}(
|
|
598
|
-
${
|
|
599
|
-
target: &mut ${
|
|
597
|
+
${j} user: &mut UserStorage,
|
|
598
|
+
target: &mut ${D},
|
|
600
599
|
${c}: u64,
|
|
601
600
|
ctx: &TxContext,
|
|
602
601
|
) {
|
|
@@ -610,7 +609,7 @@ ${D} user: &mut UserStorage,
|
|
|
610
609
|
}
|
|
611
610
|
|
|
612
611
|
public(package) fun transfer_${_}_to_user(
|
|
613
|
-
${
|
|
612
|
+
${j} source: &mut ${D},
|
|
614
613
|
user: &mut UserStorage,
|
|
615
614
|
${c}: u64,
|
|
616
615
|
ctx: &mut TxContext,
|
|
@@ -735,7 +734,7 @@ ${D} source: &mut ${j},
|
|
|
735
734
|
dapp_key::new(), listing, user_storage, ctx
|
|
736
735
|
);
|
|
737
736
|
}`)}}return n.join(`
|
|
738
|
-
`)}import
|
|
737
|
+
`)}import it from"node:path";function W(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function at(e){return e==="string"||e==="String"?"String":e}function N(e){return`dubhe::dapp_service::ObjectStorage<${e}>`}function ct(e,t){let s=W(e),n=N(s),r=[];for(let[i,d]of Object.entries(t.fields)){let l=at(d);r.push(`
|
|
739
738
|
public fun get_${i}(storage: &${n}): ${l} {
|
|
740
739
|
dubhe::dapp_system::get_object_field<${s}, ${l}>(storage, b"${i}")
|
|
741
740
|
}
|
|
@@ -745,7 +744,7 @@ ${D} source: &mut ${j},
|
|
|
745
744
|
dapp_key::new(), storage, b"${i}", value
|
|
746
745
|
);
|
|
747
746
|
}`)}return r.join(`
|
|
748
|
-
`)}function
|
|
747
|
+
`)}function ut(e,t){let s=W(e),n=N(s);return`
|
|
749
748
|
public fun get_${t}(storage: &${n}): u64 {
|
|
750
749
|
if (dubhe::dapp_system::has_object_field<${s}, u64>(storage, b"${t}")) {
|
|
751
750
|
dubhe::dapp_system::get_object_field<${s}, u64>(storage, b"${t}")
|
|
@@ -765,7 +764,7 @@ ${D} source: &mut ${j},
|
|
|
765
764
|
dubhe::dapp_system::set_object_field<DappKey, ${s}, u64>(
|
|
766
765
|
dapp_key::new(), storage, b"${t}", current - amount
|
|
767
766
|
);
|
|
768
|
-
}`}function
|
|
767
|
+
}`}function pt(e,t,s){let n=W(e),r=N(n);return`
|
|
769
768
|
public fun has_${t}(storage: &${r}, ${s}: u64): bool {
|
|
770
769
|
let key = sui::bcs::to_bytes(&${s});
|
|
771
770
|
dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key)
|
|
@@ -788,15 +787,15 @@ ${D} source: &mut ${j},
|
|
|
788
787
|
let key = sui::bcs::to_bytes(&${s});
|
|
789
788
|
assert!(dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key), EFieldNotFound);
|
|
790
789
|
dubhe::dapp_system::remove_object_field<DappKey, ${n}, vector<u8>>(dapp_key::new(), storage, key)
|
|
791
|
-
}`}function
|
|
792
|
-
`:"",C=
|
|
793
|
-
`:"",P=
|
|
790
|
+
}`}function dt(e,t,s,n,r){let i=r.resources??{},d=r.objects??{},l=r.scenes??{},u=W(t),g=N(u),$=[],f=[];for(let o of n){let b=d[o]??l[o];if(!b)continue;let p=b.accepts??[],h=W(o);$.push(` use ${e}::${o};`);let c=p.filter(_=>s.includes(_));for(let _ of c){let v=i[_];if(!v||typeof v=="string")continue;let k=v,D=!!l[o],w=`${e}::${o}::${h}`,F=D?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,j=D?l[o]:void 0,E=j?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${j.authorization.permit}::${W(j.authorization.permit)}>`:"",x=j?.authorization.kind==="permit"?` source_permit: &${E},
|
|
791
|
+
`:"",C=j?.authorization.kind==="permit"?"source_permit, ":"",K=j?.authorization.kind==="permit"?` ctx: &TxContext,
|
|
792
|
+
`:"",P=j?.authorization.kind==="permit"?", ctx":"";if(!k.fungible&&k.keys?.length){let a=k.keys[0];f.push(`
|
|
794
793
|
/// Transfer ${_} (keyed item) from ${o} into this ${t}.
|
|
795
794
|
public(package) fun transfer_${o}_to_${t}_${_}(
|
|
796
795
|
${x} from: &mut ${F},
|
|
797
796
|
to: &mut ${g},
|
|
798
797
|
${a}: u64,
|
|
799
|
-
${
|
|
798
|
+
${K}
|
|
800
799
|
) {
|
|
801
800
|
let data = ${o}::remove_${_}_data(${C}from, ${a}${P});
|
|
802
801
|
set_${_}_data(to, ${a}, data);
|
|
@@ -806,19 +805,19 @@ ${I}
|
|
|
806
805
|
${x} from: &mut ${F},
|
|
807
806
|
to: &mut ${g},
|
|
808
807
|
amount: u64,
|
|
809
|
-
${
|
|
808
|
+
${K}
|
|
810
809
|
) {
|
|
811
810
|
${o}::sub_${_}(${C}from, amount${P});
|
|
812
811
|
add_${_}(to, amount);
|
|
813
|
-
}`)}}return{imports:$,functions:f}}async function
|
|
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=
|
|
812
|
+
}`)}}return{imports:$,functions:f}}async function Le(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
|
|
813
|
+
\u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=W(r),l=`${d}Storage`,u=`b"${r}"`,g=ct(r,i),$=i.accepts??[],f=[];for(let S of $){let T=n[S];if(!T||typeof T=="string")continue;let M=T;!M.fungible&&M.keys?.length?f.push(pt(r,S,M.keys[0])):f.push(ut(r,S))}let{imports:o,functions:b}=dt(s,r,$,i.acceptsFrom??[],e),p=i.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",h=`dubhe::dapp_service::ObjectStorage<${d}>`,c=`
|
|
815
814
|
public fun assert_${r}_id(storage: &${h}, expected: vector<u8>) {
|
|
816
815
|
assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);
|
|
817
816
|
}`,_=`
|
|
818
817
|
public fun entity_id(storage: &${h}): vector<u8> {
|
|
819
818
|
*dubhe::dapp_service::object_storage_entity_id(storage)
|
|
820
|
-
}`,
|
|
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}),
|
|
819
|
+
}`,D=Object.values(i.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
|
|
820
|
+
use std::ascii::String;`:"",w=$.some(S=>{let T=n[S];return!T||typeof T=="string"?!1:!!T.keys?.length&&!T.fungible}),F=$.some(S=>{let T=n[S];return!T||typeof T=="string"?!1:!!T.fungible}),j=w,E=F,x=w,C=!!i.adminOnly,K=[j?` #[error]
|
|
822
821
|
const EFieldNotFound: vector<u8> = b"Field not found";`:"",E?` #[error]
|
|
823
822
|
const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",x?` #[error]
|
|
824
823
|
const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:"",` #[error]
|
|
@@ -829,10 +828,10 @@ ${I}
|
|
|
829
828
|
`):"",a=`dubhe::dapp_service::ObjectStorage<${d}>`,y=`module ${s}::${r} {
|
|
830
829
|
use dubhe::dapp_service::DappStorage;
|
|
831
830
|
use ${s}::dapp_key;
|
|
832
|
-
use ${s}::dapp_key::DappKey;${
|
|
831
|
+
use ${s}::dapp_key::DappKey;${D}${P}
|
|
833
832
|
|
|
834
833
|
// \u2500\u2500\u2500 Error constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
835
|
-
${
|
|
834
|
+
${K}
|
|
836
835
|
|
|
837
836
|
const TYPE_TAG: vector<u8> = ${u};
|
|
838
837
|
|
|
@@ -859,7 +858,7 @@ ${b.join(`
|
|
|
859
858
|
`)}
|
|
860
859
|
|
|
861
860
|
// \u2500\u2500\u2500 Lifecycle entry functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
862
|
-
public fun create_${r}(
|
|
861
|
+
public(package) fun create_${r}(
|
|
863
862
|
dapp_storage: &mut DappStorage,
|
|
864
863
|
entity_id: vector<u8>,
|
|
865
864
|
ctx: &mut TxContext,
|
|
@@ -870,7 +869,7 @@ ${p}
|
|
|
870
869
|
);
|
|
871
870
|
}
|
|
872
871
|
|
|
873
|
-
public fun destroy_${r}(
|
|
872
|
+
public(package) fun destroy_${r}(
|
|
874
873
|
dapp_storage: &mut DappStorage,
|
|
875
874
|
storage: ${a},
|
|
876
875
|
_ctx: &TxContext,
|
|
@@ -880,8 +879,8 @@ ${p}
|
|
|
880
879
|
);
|
|
881
880
|
}
|
|
882
881
|
}
|
|
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
|
|
882
|
+
`;await A(y,it.join(t,`${r}.move`),"formatAndWriteMove")}}import lt from"node:path";function $t(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function Re(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
|
|
883
|
+
\u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=$t(n),i=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
|
|
885
884
|
use dubhe::dapp_service::{Self, DappStorage};
|
|
886
885
|
use ${s}::dapp_key;
|
|
887
886
|
use ${s}::dapp_key::DappKey;
|
|
@@ -998,7 +997,7 @@ ${p}
|
|
|
998
997
|
);
|
|
999
998
|
}
|
|
1000
999
|
}
|
|
1001
|
-
`;await A(l,
|
|
1000
|
+
`;await A(l,lt.join(t,`${n}.move`),"formatAndWriteMove")}}import gt from"node:path";function Y(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function _t(e){return e==="string"||e==="String"?"String":e}function Q(e){return`dubhe::dapp_service::SceneStorage<${e}>`}function q(e,t){if(t.authorization.kind==="permit")return`${e.name}::${t.authorization.permit}::${Y(t.authorization.permit)}`}function X(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${q(e,t)}>`}function mt(e,t,s){let n=Y(t),r=Q(n),i=q(e,s),d=X(e,s),l=[];for(let[u,g]of Object.entries(s.fields)){let $=_t(g);s.authorization.kind==="permit"&&i&&d?l.push(`
|
|
1002
1001
|
public fun get_${u}(storage: &${r}): ${$} {
|
|
1003
1002
|
dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
|
|
1004
1003
|
}
|
|
@@ -1034,17 +1033,17 @@ ${p}
|
|
|
1034
1033
|
dapp_key::new(), storage, b"${u}"
|
|
1035
1034
|
)
|
|
1036
1035
|
}`)}return l.join(`
|
|
1037
|
-
`)}function
|
|
1038
|
-
`}function
|
|
1039
|
-
`:""}function
|
|
1036
|
+
`)}function ee(e,t){let s=X(e,t);return t.authorization.kind!=="permit"||!s?"":` permit: &${s},
|
|
1037
|
+
`}function te(e){return e.authorization.kind==="permit"?` ctx: &TxContext,
|
|
1038
|
+
`:""}function le(e,t,s,n,r,i){let d=q(e,t);return t.authorization.kind==="permit"&&d?`dubhe::dapp_system::set_scene_field<DappKey, ${d}, ${s}, ${n}>(
|
|
1040
1039
|
dapp_key::new(), permit, storage, ${r}, ${i}, ctx
|
|
1041
1040
|
);`:`dubhe::dapp_system::set_scene_field_system<DappKey, ${s}, ${n}>(
|
|
1042
1041
|
dapp_key::new(), storage, ${r}, ${i}
|
|
1043
|
-
);`}function
|
|
1042
|
+
);`}function bt(e,t,s,n,r){let i=q(e,t);return t.authorization.kind==="permit"&&i?`dubhe::dapp_system::remove_scene_field<DappKey, ${i}, ${s}, ${n}>(
|
|
1044
1043
|
dapp_key::new(), permit, storage, ${r}, ctx
|
|
1045
1044
|
)`:`dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${s}, ${n}>(
|
|
1046
1045
|
dapp_key::new(), storage, ${r}
|
|
1047
|
-
)`}function
|
|
1046
|
+
)`}function ft(e,t,s,n){let r=Y(t),i=Q(r);return`
|
|
1048
1047
|
public fun get_${n}(storage: &${i}): u64 {
|
|
1049
1048
|
if (dubhe::dapp_system::has_scene_field<${r}, u64>(storage, b"${n}")) {
|
|
1050
1049
|
dubhe::dapp_system::get_scene_field<${r}, u64>(storage, b"${n}")
|
|
@@ -1052,21 +1051,21 @@ ${p}
|
|
|
1052
1051
|
}
|
|
1053
1052
|
|
|
1054
1053
|
public(package) fun add_${n}(
|
|
1055
|
-
${
|
|
1054
|
+
${ee(e,s)} storage: &mut ${i},
|
|
1056
1055
|
amount: u64,
|
|
1057
|
-
${
|
|
1056
|
+
${te(s)} ) {
|
|
1058
1057
|
let current = get_${n}(storage);
|
|
1059
|
-
${
|
|
1058
|
+
${le(e,s,r,"u64",`b"${n}"`,"current + amount")}
|
|
1060
1059
|
}
|
|
1061
1060
|
|
|
1062
1061
|
public(package) fun sub_${n}(
|
|
1063
|
-
${
|
|
1062
|
+
${ee(e,s)} storage: &mut ${i},
|
|
1064
1063
|
amount: u64,
|
|
1065
|
-
${
|
|
1064
|
+
${te(s)} ) {
|
|
1066
1065
|
let current = get_${n}(storage);
|
|
1067
1066
|
assert!(current >= amount, EInsufficientAmount);
|
|
1068
|
-
${
|
|
1069
|
-
}`}function
|
|
1067
|
+
${le(e,s,r,"u64",`b"${n}"`,"current - amount")}
|
|
1068
|
+
}`}function yt(e,t,s,n,r){let i=Y(t),d=Q(i);return`
|
|
1070
1069
|
public fun has_${n}(storage: &${d}, ${r}: u64): bool {
|
|
1071
1070
|
let key = sui::bcs::to_bytes(&${r});
|
|
1072
1071
|
dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key)
|
|
@@ -1078,53 +1077,53 @@ ${ee(s)} ) {
|
|
|
1078
1077
|
}
|
|
1079
1078
|
|
|
1080
1079
|
public(package) fun set_${n}_data(
|
|
1081
|
-
${
|
|
1080
|
+
${ee(e,s)} storage: &mut ${d},
|
|
1082
1081
|
${r}: u64,
|
|
1083
1082
|
data: vector<u8>,
|
|
1084
|
-
${
|
|
1083
|
+
${te(s)} ) {
|
|
1085
1084
|
let key = sui::bcs::to_bytes(&${r});
|
|
1086
1085
|
assert!(!dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key), EDuplicateItemId);
|
|
1087
|
-
${
|
|
1086
|
+
${le(e,s,i,"vector<u8>","key","data")}
|
|
1088
1087
|
}
|
|
1089
1088
|
|
|
1090
1089
|
public(package) fun remove_${n}_data(
|
|
1091
|
-
${
|
|
1090
|
+
${ee(e,s)} storage: &mut ${d},
|
|
1092
1091
|
${r}: u64,
|
|
1093
|
-
${
|
|
1092
|
+
${te(s)} ): vector<u8> {
|
|
1094
1093
|
let key = sui::bcs::to_bytes(&${r});
|
|
1095
1094
|
assert!(dubhe::dapp_system::has_scene_field<${i}, vector<u8>>(storage, key), EFieldNotFound);
|
|
1096
|
-
${
|
|
1097
|
-
}`}function
|
|
1095
|
+
${bt(e,s,i,"vector<u8>","key")}
|
|
1096
|
+
}`}function ht(e,t,s,n,r,i){let d=i.resources??{},l=i.objects??{},u=i.scenes??{},g=Y(t),$=Q(g),f=[],o=[],b=X(i,s),p=s.authorization.kind==="permit"&&b?` dest_permit: &${b},
|
|
1098
1097
|
`:"",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
|
|
1100
|
-
`:"",P=x?.authorization.kind==="permit"?"source_permit, ":"",a=x?.authorization.kind==="permit"?", ctx":"",y=
|
|
1098
|
+
`:"",_=s.authorization.kind==="permit"?", ctx":"";for(let v of r){let k=l[v]??u[v];if(!k)continue;let D=k.accepts??[],w=Y(v);f.push(` use ${e}::${v};`);let F=!!u[v],j=`${e}::${v}::${w}`,E=F?`dubhe::dapp_service::SceneStorage<${j}>`:`dubhe::dapp_service::ObjectStorage<${j}>`,x=F?k:void 0,C=x?X(i,x):void 0,K=x?.authorization.kind==="permit"&&C?` source_permit: &${C},
|
|
1099
|
+
`:"",P=x?.authorization.kind==="permit"?"source_permit, ":"",a=x?.authorization.kind==="permit"?", ctx":"",y=D.filter(S=>n.includes(S));for(let S of y){let T=d[S];if(!T||typeof T=="string")continue;let M=T;if(!M.fungible&&M.keys?.length){let J=M.keys[0];o.push(`
|
|
1101
1100
|
public(package) fun transfer_${v}_to_${t}_${S}(
|
|
1102
|
-
${
|
|
1101
|
+
${K}${p} from: &mut ${E},
|
|
1103
1102
|
to: &mut ${$},
|
|
1104
|
-
${
|
|
1103
|
+
${J}: u64,
|
|
1105
1104
|
${c} ) {
|
|
1106
|
-
let data = ${v}::remove_${S}_data(${P}from, ${
|
|
1107
|
-
set_${S}_data(${h}to, ${
|
|
1105
|
+
let data = ${v}::remove_${S}_data(${P}from, ${J}${a});
|
|
1106
|
+
set_${S}_data(${h}to, ${J}, data${_});
|
|
1108
1107
|
}`)}else o.push(`
|
|
1109
1108
|
public(package) fun transfer_${v}_to_${t}_${S}(
|
|
1110
|
-
${
|
|
1109
|
+
${K}${p} from: &mut ${E},
|
|
1111
1110
|
to: &mut ${$},
|
|
1112
1111
|
amount: u64,
|
|
1113
1112
|
${c} ) {
|
|
1114
1113
|
${v}::sub_${S}(${P}from, amount${a});
|
|
1115
1114
|
add_${S}(${h}to, amount${_});
|
|
1116
|
-
}`)}}return{imports:f,functions:o}}async function
|
|
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=
|
|
1115
|
+
}`)}}return{imports:f,functions:o}}async function ze(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
|
|
1116
|
+
\u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,i]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=Y(r),l=`b"${r}"`,u=Q(d),g=mt(e,r,i),$=i.accepts??[],f=[];for(let x of $){let C=n[x];if(!C||typeof C=="string")continue;let K=C;!K.fungible&&K.keys?.length?f.push(yt(e,r,i,x,K.keys[0])):f.push(ft(e,r,i,x))}let{imports:o,functions:b}=ht(s,r,i,$,i.acceptsFrom??[],e),c=Object.values(i.fields).some(x=>x==="string"||x==="String"||x==="vector<String>")?`
|
|
1118
1117
|
use std::ascii::String;`:"",_=$.some(x=>{let C=n[x];return!C||typeof C=="string"?!1:!!C.keys?.length&&!C.fungible}),v=$.some(x=>{let C=n[x];return!C||typeof C=="string"?!1:!!C.fungible}),k=[_?` #[error]
|
|
1119
1118
|
const EFieldNotFound: vector<u8> = b"Field not found";`:"",v?` #[error]
|
|
1120
1119
|
const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",_?` #[error]
|
|
1121
1120
|
const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:""].filter(Boolean).join(`
|
|
1122
|
-
`),
|
|
1121
|
+
`),D=k.length>0?`
|
|
1123
1122
|
// \u2500\u2500\u2500 Error constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
1124
1123
|
${k}
|
|
1125
1124
|
`:"",w=o.length>0?`
|
|
1126
1125
|
`+o.join(`
|
|
1127
|
-
`):"",F=
|
|
1126
|
+
`):"",F=X(e,i),j=i.authorization.kind==="permit"&&F?`
|
|
1128
1127
|
public(package) fun new_${r}_with_permit(
|
|
1129
1128
|
dapp_storage: &DappStorage,
|
|
1130
1129
|
permit: &${F},
|
|
@@ -1164,7 +1163,7 @@ ${k}
|
|
|
1164
1163
|
use dubhe::dapp_service::DappStorage;
|
|
1165
1164
|
use ${s}::dapp_key;
|
|
1166
1165
|
use ${s}::dapp_key::DappKey;${c}${w}
|
|
1167
|
-
${
|
|
1166
|
+
${D}
|
|
1168
1167
|
const SCENE_TYPE: vector<u8> = ${l};
|
|
1169
1168
|
|
|
1170
1169
|
/// Phantom type that distinguishes this scene storage at compile time.
|
|
@@ -1182,7 +1181,7 @@ ${b.join(`
|
|
|
1182
1181
|
`)}
|
|
1183
1182
|
|
|
1184
1183
|
// \u2500\u2500\u2500 SceneStorage lifecycle wrappers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
1185
|
-
${
|
|
1184
|
+
${j}
|
|
1186
1185
|
|
|
1187
1186
|
public(package) fun share_${r}(storage: ${u}) {
|
|
1188
1187
|
dubhe::dapp_system::share_scene_storage<DappKey, ${d}>(
|
|
@@ -1196,7 +1195,7 @@ ${D}
|
|
|
1196
1195
|
);
|
|
1197
1196
|
}
|
|
1198
1197
|
}
|
|
1199
|
-
`;await A(E
|
|
1198
|
+
`;await A(E,gt.join(t,`${r}.move`),"formatAndWriteMove")}}async function Be(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
|
|
1200
1199
|
use dubhe::dapp_service::{DappHub, DappStorage};
|
|
1201
1200
|
use dubhe::dapp_system;
|
|
1202
1201
|
use ${e.name}::dapp_key::DappKey;
|
|
@@ -1213,7 +1212,7 @@ ${D}
|
|
|
1213
1212
|
dapp_system::create_user_storage<DappKey>(dapp_hub, dapp_storage, ctx);
|
|
1214
1213
|
}
|
|
1215
1214
|
}
|
|
1216
|
-
`;await A(s,t,"formatAndWriteMove")}import
|
|
1215
|
+
`;await A(s,t,"formatAndWriteMove")}import He from"chalk";import{existsSync as vt,readFileSync as kt,writeFileSync as We}from"fs";import St from"node:path";function xt(e){if(typeof e=="string")return{value:e};let t={};for(let[s,n]of Object.entries(e.fields??{}))t[s]=n;return t}function Ye(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function Ct(e){let t={};for(let[r,i]of Object.entries(e.resources??{}))t[r]=xt(i);let s={};for(let[r,i]of Object.entries(e.objects??{}))s[r]=Ye(i);let n={};for(let[r,i]of Object.entries(e.scenes??{}))n[r]=Ye(i);return{version:1,resources:t,objects:s,scenes:n}}function $e(e,t,s){for(let[n,r]of Object.entries(s)){let i=t[n];if(i)for(let[d,l]of Object.entries(i)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
|
|
1217
1216
|
Field "${d}" was removed.
|
|
1218
1217
|
|
|
1219
1218
|
Resources, objects, and scenes are stored as raw bytes on-chain.
|
|
@@ -1221,10 +1220,10 @@ Removing fields corrupts existing data. Use a new name (e.g. "${n}_v2") for brea
|
|
|
1221
1220
|
Field "${d}" type changed from "${l}" to "${r[d]}".
|
|
1222
1221
|
|
|
1223
1222
|
Resources, objects, and scenes are stored as raw bytes on-chain.
|
|
1224
|
-
Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function
|
|
1225
|
-
`,"utf-8");return}
|
|
1226
|
-
`,"utf-8")}import U from"chalk";var
|
|
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"}`)
|
|
1223
|
+
Changing field types corrupts existing data. Use a new name (e.g. "${n}_v2") for breaking changes.`)}}}function Ve(e,t){let s=St.join(e,`${t.name}.lock.json`),n=Ct(t);if(vt(s)){let r;try{r=JSON.parse(kt(s,"utf-8"))}catch{console.warn(He.yellow("[dubhe]")+` Could not parse ${He.bold(s)}, skipping break-check.`),We(s,JSON.stringify(n,null,2)+`
|
|
1224
|
+
`,"utf-8");return}$e("resources",r.resources??{},n.resources),$e("objects",r.objects??{},n.objects),$e("scenes",r.scenes??{},n.scenes)}We(s,JSON.stringify(n,null,2)+`
|
|
1225
|
+
`,"utf-8")}import U from"chalk";var se=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function Ge(e){ge(e,!1)}function ge(e,t=!0){let s=e.resources??{},n=e.objects??{},r=e.permits??{},i=e.scenes??{},d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),g=new Set(Object.keys(i)),$=new Set;for(let o of d)(l.has(o)||u.has(o)||g.has(o))&&$.add(o);for(let o of l)(u.has(o)||g.has(o))&&$.add(o);for(let o of u)g.has(o)&&$.add(o);if($.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[...$].sort().join(", ")}`);let f=new Set;for(let[o,b]of Object.entries(n)){for(let p of b.accepts??[]){f.add(p);let h=s[p];if(!h)throw new Error(`objects.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`objects.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],c=!!i[p];if(!h&&!c)throw new Error(`objects.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(i)){if(!b.authorization)throw new Error(`scenes.${o} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(b.authorization.kind==="permit"){if(!r[b.authorization.permit])throw new Error(`scenes.${o}.authorization references permit '${b.authorization.permit}', but permits.${b.authorization.permit} is not defined`)}else if(b.authorization.kind!=="system")throw new Error(`scenes.${o}.authorization.kind must be 'system' or 'permit'`);for(let p of b.accepts??[]){f.add(p);let h=s[p];if(!h)throw new Error(`scenes.${o}.accepts references '${p}' which is not defined in resources`);if(typeof h!="string"&&!h.transferable)throw new Error(`scenes.${o}.accepts includes '${p}', but resources.${p} is missing transferable: true. Add transferable: true to resources.${p} to enable cross-storage transfers.`)}for(let p of b.acceptsFrom??[]){let h=!!n[p],c=!!i[p];if(!h&&!c)throw new Error(`scenes.${o}.acceptsFrom references '${p}' which is not defined in objects or scenes`)}}for(let[o,b]of Object.entries(s)){if(typeof b=="string")continue;let p=b;if(p.offchain){if(p.listable)throw new Error(`resources.${o} has both offchain: true and listable: true. offchain resources emit events but store no on-chain state, so there is nothing to take out and place into a Listing.`);if(p.transferable)throw new Error(`resources.${o} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if(p.reactive)throw new Error(`resources.${o} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);p.fungible&&t&&se(`resources.${U.bold(o)} has both ${U.cyan("offchain: true")} and ${U.cyan("fungible: true")}. offchain fungible events are emitted only; no on-chain balance is maintained and no add/sub functions are generated. This is unusual \u2014 verify your intent.`)}if(p.reactive&&p.fungible&&t&&se(`resources.${U.bold(o)} has both ${U.cyan("reactive: true")} and ${U.cyan("fungible: true")}. Fungible quantity changes (add/sub) do not suit reactive cross-user writes. Consider using a transfer function instead.`),p.global){if(p.reactive)throw new Error(`resources.${o} has both global: true and reactive: true. global resources live in DappStorage (shared), not in UserStorage. Reactive writes operate between two UserStorage objects and are incompatible with global resources.`);if(p.listable)throw new Error(`resources.${o} has both global: true and listable: true. global resources live in DappStorage and cannot be individually listed for sale. listable requires per-user ownership in UserStorage.`);if(p.transferable)throw new Error(`resources.${o} has both global: true and transferable: true. global resources live in DappStorage and are not owned by individual users. transferable requires per-user state in UserStorage or ObjectStorage.`)}p.fungible&&p.listable&&t&&se(`resources.${U.bold(o)} has both ${U.cyan("fungible: true")} and ${U.cyan("listable: true")}. The generated ${U.green(`list_${o}`)} entry function will include an ${U.cyan("amount")} parameter for partial listings.`),p.transferable&&!f.has(o)&&t&&se(`resources.${U.bold(o)} has ${U.cyan("transferable: true")} but is not referenced in any ${U.cyan("objects.accepts")} or ${U.cyan("scenes.accepts")}. The cross-layer transfer functions will not be generated.`)}}import R from"node:path";async function wt(e,t,s,n=1){console.log(`
|
|
1226
|
+
\u{1F680} Starting Code Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(` \u2514\u2500 Settlement Mode: ${n===1?"USER_PAYS":"DAPP_SUBSIDIZES"}`),ge(t),Ve(e,t),console.log(e);let r=R.join(e,"src",t.name);V(`${r}`)&&ce(`${r}/sources/codegen`),V(`${r}/Move.toml`)||await ve(t,e);let i=R.join(r,"sources","codegen","genesis.move");V(i)||await Ee(t,i,n);let d=R.join(r,"sources","codegen","init_test.move");V(d)||await Ae(t,d);let l=R.join(r,"sources","codegen","dapp_key.move");V(l)||await Ce(t,l);let u=R.join(r,"sources","scripts","deploy_hook.move");V(u)||await Se(t,u,n);let g=R.join(r,"sources","codegen","resources");await Pe(t,g);let $=R.join(r,"sources","codegen","objects");await Le(t,$);let f=R.join(r,"sources","codegen","permits");await Re(t,f);let o=R.join(r,"sources","codegen","scenes");await ze(t,o);let b=R.join(r,"sources","codegen","enums");V(b)||await Fe(t,b),t.errors&&await Te(t.name,t.errors,e);let p=R.join(r,"sources","codegen","user_storage_init.move");await Be(t,p),await je(t,e),await xe(t,e),console.log(`
|
|
1228
1227
|
\u2705 Code Generation Complete!
|
|
1229
|
-
`)}var
|
|
1228
|
+
`)}var Qs=wt;var tr=e=>(Ge(e),e);import{findUp as Dt}from"find-up";import _e from"path";import jt from"esbuild";var re=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as Tt}from"fs";import{pathToFileURL as At}from"url";import Et from"os";var Ot=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],me="dubhe.config.example.mjs";async function dr(e){e=await qe(e);try{return await jt.build({entryPoints:[e],format:"esm",outfile:me,platform:"node",bundle:!0,packages:"external"}),e=await qe(me,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Tt(me,{force:!0})}}async function qe(e,t){return e===void 0?e=await Ft():_e.isAbsolute(e)||(e=_e.join(process.cwd(),e),e=_e.normalize(e)),t&&Et.platform()==="win32"?At(e).href:e}async function Ft(){let e=await Dt(Ot);if(e===void 0)throw new re;return e}var Kt=(s=>(s.Event="event",s.Schema="schema",s))(Kt||{});export{Kt as SubscriptionKind,Ve as checkAndUpdateLock,wt as codegen,tr as defineConfig,A as formatAndWriteMove,Ut as formatMove,Le as generateObjects,ze as generateScenes,dr as loadConfig,Qs as schemaGen};
|
|
1230
1229
|
//# sourceMappingURL=index.js.map
|