@0xobelisk/sui-common 1.2.0-pre.120 → 1.2.0-pre.121
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 +34 -34
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/codegen/utils/renderMove/dapp.ts +2 -0
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import me from"prettier";import Ge from"prettier-plugin-move-js";async function It(e,t){let s;t&&(s=await me.resolveConfig(t));try{return me.format(e,{plugins:[Ge],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(n){let r;return n instanceof Error?r=n.message:r=n,console.log(`Error during output formatting: ${r}`),e}}import fe from"node:fs/promises";import Je from"node:path";import be from"debug";var ie=be("dubhe:common"),qe=be("dubhe:common");ie.log=console.debug.bind(console);qe.log=console.error.bind(console);var ae=ie.extend("codegen");ae.log=console.debug.bind(console);async function A(e,t,s){let n=e,r=`// Copyright (c) Obelisk Labs, Inc.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
/* Autogenerated file. Do not edit manually. */
|
|
5
5
|
|
|
6
6
|
`,o=`#[test_only]
|
|
7
7
|
`,d=r+n,l=`#[allow(lint(share_owned))]
|
|
8
|
-
`;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=o+n:t.includes("genesis")&&(d=l+n),await
|
|
8
|
+
`;t.includes(".toml")||t.includes("system")||t.includes("migrate")?d=n:t.includes("init_test")?d=o+n:t.includes("genesis")&&(d=l+n),await fe.mkdir(Je.dirname(t),{recursive:!0}),await fe.writeFile(t,d),ae(`${s}: ${t}`)}import{existsSync as V}from"fs";import J from"fs";function ce(e){J.existsSync(e)&&(J.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;J.lstatSync(s).isDirectory()?ce(s):J.unlinkSync(s)}),J.rmdirSync(e))}var ye={name:"@0xobelisk/sui-common",version:"1.2.0-pre.121",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",author:"team@obelisk.build",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},types:"./dist/index.d.ts",typesVersions:{"*":{index:["./src/index.ts"]}},scripts:{build:"pnpm run type-check && pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",format:"prettier --write .","format:check":"prettier --check .",lint:"eslint . --ext .ts",test:"vitest","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^10.5.0",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5",typescript:"^5.8.3",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^22.16.0","@types/yargs":"^17.0.10",eslint:"^9.0.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3"},engines:{node:">=22.0.0"},publishConfig:{access:"public"}};async function he(e,t){console.log(`
|
|
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${ye.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 ve}from"fs";async function ke(e,t,s=1){if(!ve(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 Se(e,t){if(!ve(`${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 xe(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
|
|
65
|
+
`;await A(s,t,"formatAndWriteMove")}import{existsSync as Ce}from"fs";import we from"node:fs/promises";async function De(e,t){Ce(`${t}/src/${e.name}/sources/systems`)||await we.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),Ce(`${t}/src/${e.name}/sources/tests`)||await we.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}function Xe(e){return"E"+e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Qe(e){return typeof e=="string"?e:e.message}async function je(e,t,s){console.log(`
|
|
66
66
|
\u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([o,d])=>{let l=Xe(o),u=Qe(d);return console.log(` \u2514\u2500 ${o}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${o}(condition: bool) { assert!(condition, ${l}) }`].join(`
|
|
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 Te(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 Ae(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)),o=Ne(e.name,s,r);await A(o,`${t}/${
|
|
144
|
+
`;await A(r,t,"formatAndWriteMove")}function Ee(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Oe(e,t){if(console.log(`
|
|
145
|
+
\u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,n]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`);let r=[...n].sort((d,l)=>d.localeCompare(l)),o=Ne(e.name,s,r);await A(o,`${t}/${Ee(s)}.move`,"formatAndWriteMove")}}function Ne(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Ee(t)} {
|
|
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,o)=>` ${o} => ${t}::${r.charAt(0).toUpperCase()+r.slice(1)
|
|
|
166
166
|
_ => abort,
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
|
-
}`}function
|
|
169
|
+
}`}function Ke(e){return e==="dubhe"?"dapp_service":"dapp_system"}function L(e){return e!=="dubhe"?"dapp_key::new(), ":""}function B(e,t){return""}function H(e,t){return""}function Ie(e){return e?"DappStorage":"UserStorage"}function Me(e){return e?"dapp_storage":"user_storage"}function pe(e,t){let s=Ke(e);return t?{set_record:`${s}::set_global_record`,set_field:`${s}::set_global_field`,get_field:`${s}::get_global_field`,has_record:`${s}::has_global_record`,ensure_has:`${s}::ensure_has_global_record`,ensure_has_not:`${s}::ensure_has_not_global_record`,delete_record:`${s}::delete_global_record`,delete_field:`${s}::delete_global_field`}:{set_record:`${s}::set_record`,set_field:`${s}::set_field`,get_field:`${s}::get_field`,has_record:`${s}::has_record`,ensure_has:`${s}::ensure_has_record`,ensure_has_not:`${s}::ensure_has_not_record`,delete_record:`${s}::delete_record`,delete_field:`${s}::delete_field`}}async function Ue(e,t){if(console.log(`
|
|
170
170
|
\u{1F4E6} Starting Resources Generation...`),!!e.resources)for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=et(e.name,s,n,"Onchain");await A(l,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let r=tt(e.name,s,n),o=rt(e,s,n),d=o?r.replace(/^}$/m,`
|
|
171
171
|
${o}
|
|
172
|
-
}`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function et(e,t,s,n="Onchain"){let r=!z(s),o=r?`${
|
|
172
|
+
}`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function et(e,t,s,n="Onchain"){let r=!z(s),o=r?`${ue(s)}`:"",d=n==="Offchain",l=!1,u=Ie(l),_=Me(l),$=pe(e,l),p=d?"":`
|
|
173
173
|
public fun has(${_}: &${u}): bool {
|
|
174
174
|
let mut key_tuple = vector::empty();
|
|
175
175
|
key_tuple.push_back(TABLE_NAME);
|
|
@@ -229,7 +229,7 @@ ${p}
|
|
|
229
229
|
value_tuple.push_back(${s==="string"||s==="String"?"to_bytes(&into_bytes(value))":s==="vector<String>"?"to_bytes(&value)":r?`${e}::${o}::encode(value)`:"to_bytes(&value)"});
|
|
230
230
|
value_tuple
|
|
231
231
|
}
|
|
232
|
-
}`}function
|
|
232
|
+
}`}function ue(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function tt(e,t,s){let n=s.fields,r=s.keys||[],o=s.offchain||!1,d=s.global||!1,l=o?"Offchain":"Onchain",u=d,_=Ie(u),$=Me(u),p=pe(e,u),c=Object.keys(n).every(b=>r.includes(b)),g=Object.entries(n).filter(([b])=>!r.includes(b)),f=g.map(([b])=>b),C=f.length===1,a=g.filter(([b,O])=>!z(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ue(O)}`})).filter((b,O,ne)=>ne.findIndex(oe=>oe.type===b.type)===O),m=Object.entries(n).filter(([b,O])=>!z(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ue(O)}`})).filter((b,O,ne)=>ne.findIndex(oe=>oe.type===b.type)===O),h=st(e,t,n,r,!c&&!C,a,l,u,_,$,p),v=u?"use dubhe::dapp_service::DappStorage;":s.listable?"use dubhe::dapp_service::{UserStorage, DappStorage};":"use dubhe::dapp_service::UserStorage;",j=Object.values(n),D=f.filter(b=>{let O=n[b];return z(O)||O==="string"||O==="String"}).length>0||r.length>0?`
|
|
233
233
|
use sui::bcs::{to_bytes};`:"",E=j.some(b=>b==="string"||b==="String"),S=j.some(b=>b==="vector<String>"),x=f.some(b=>{let O=n[b];return O==="string"||O==="String"}),I=x?`
|
|
234
234
|
use std::ascii::{String, into_bytes};`:E||S?`
|
|
235
235
|
use std::ascii::String;`:"",P=x?`
|
|
@@ -282,8 +282,8 @@ ${T}
|
|
|
282
282
|
${M}
|
|
283
283
|
|
|
284
284
|
${h}
|
|
285
|
-
}`}function z(e){return["address","bool","u8","u16","u32","u64","u128","u256","string","String","vector<address>","vector<bool>","vector<u8>","vector<u16>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>","vector<String>"].includes(e)}function G(e,t,s,n){let r=!z(t),o=r?n.find(d=>d.type===t):null;return t==="string"||t==="String"?`dubhe::bcs::peel_string(&mut ${s})`:t==="vector<String>"?`dubhe::bcs::peel_vec_string(&mut ${s})`:r&&o?`${e}::${o.module}::decode(&mut ${s})`:`sui::bcs::peel_${
|
|
286
|
-
`)}function st(e,t,s,n,r=!0,o=[],d="Onchain",l=!1,u="UserStorage",_="user_storage",$=
|
|
285
|
+
}`}function z(e){return["address","bool","u8","u16","u32","u64","u128","u256","string","String","vector<address>","vector<bool>","vector<u8>","vector<u16>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>","vector<String>"].includes(e)}function G(e,t,s,n){let r=!z(t),o=r?n.find(d=>d.type===t):null;return t==="string"||t==="String"?`dubhe::bcs::peel_string(&mut ${s})`:t==="vector<String>"?`dubhe::bcs::peel_vec_string(&mut ${s})`:r&&o?`${e}::${o.module}::decode(&mut ${s})`:`sui::bcs::peel_${de(t)}(&mut ${s})`}function Fe(e,t,s,n,r,o,d){let l=`${n}_raw`,u=`${n}_bcs`;return[`let ${l} = ${t.get_field}<DappKey>(${s}, key_tuple, b"${n}");`,`let mut ${u} = sui::bcs::new(${l});`,`let ${n} = ${G(e,r,u,d)};`].join(`
|
|
286
|
+
`)}function st(e,t,s,n,r=!0,o=[],d="Onchain",l=!1,u="UserStorage",_="user_storage",$=pe("dubhe",!1)){let p=Object.entries(s).filter(([i])=>!n.includes(i)).reduce((i,[y,k])=>({...i,[y]:k}),{}),c=Object.keys(p),g=Object.keys(s).every(i=>n.includes(i)),f=c.length===1,C=d==="Offchain",a=n.length>0?n.map(i=>`${i}: ${s[i]}`).join(", "):"",m=n.length>0?`let mut key_tuple = vector::empty();
|
|
287
287
|
key_tuple.push_back(TABLE_NAME);
|
|
288
288
|
${n.map(i=>`key_tuple.push_back(to_bytes(&${i}));`).join(`
|
|
289
289
|
`)}`:`let mut key_tuple = vector::empty();
|
|
@@ -348,7 +348,7 @@ ${h}
|
|
|
348
348
|
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
|
|
349
349
|
}`:` public fun get(${_}: &${u}${a?", ":""}${a}): (${Object.values(p).map(i=>i==="string"||i==="String"?"String":i).join(", ")}) {
|
|
350
350
|
${m}
|
|
351
|
-
${c.map((i,y)=>
|
|
351
|
+
${c.map((i,y)=>Fe(e,$,_,i,s[i],y,o)).join(`
|
|
352
352
|
`)}
|
|
353
353
|
(${c.join(", ")})
|
|
354
354
|
}
|
|
@@ -365,7 +365,7 @@ ${h}
|
|
|
365
365
|
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
|
|
366
366
|
}`:` public fun get_struct(${_}: &${u}${a?", ":""}${a}): ${K(t)} {
|
|
367
367
|
${m}
|
|
368
|
-
${c.map((i,y)=>
|
|
368
|
+
${c.map((i,y)=>Fe(e,$,_,i,s[i],y,o)).join(`
|
|
369
369
|
`)}
|
|
370
370
|
${K(t)} { ${c.join(", ")} }
|
|
371
371
|
}
|
|
@@ -401,7 +401,7 @@ ${h}
|
|
|
401
401
|
|
|
402
402
|
public fun decode(data: vector<u8>): ${K(t)} {
|
|
403
403
|
let mut bcs_type = sui::bcs::new(data);
|
|
404
|
-
${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`let ${i} = ${y==="string"||y==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":y==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":k?`${e}::${T?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${
|
|
404
|
+
${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`let ${i} = ${y==="string"||y==="String"?"string(sui::bcs::peel_vec_u8(&mut bcs_type))":y==="vector<String>"?"dubhe::bcs::peel_vec_string(&mut bcs_type)":k?`${e}::${T?.module}::decode(&mut bcs_type)`:`sui::bcs::peel_${de(y)}(&mut bcs_type)`};`}).join(`
|
|
405
405
|
`)}
|
|
406
406
|
${K(t)} {
|
|
407
407
|
${c.map(i=>`${i},`).join(`
|
|
@@ -409,7 +409,7 @@ ${h}
|
|
|
409
409
|
}
|
|
410
410
|
}`:"";return[j,F,D,S,x,I].filter(i=>i.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 de(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${de(t)}`}switch(e){case"u8":return"u8";case"u16":return"u16";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"bool":return"bool";case"address":return"address";case"String":return"string";default:return e}}function rt(e,t,s){let n=[],r=e.name,o=Ke(r),d=L(r),l=s.fields,u=s.keys??[],_=Object.entries(l).filter(([c])=>!u.includes(c)),$=_.map(([c])=>c),p=u.length>0?u.map(c=>`${c}: ${l[c]}`).join(", "):"";if(s.fungible&&$.length===1){let[c,g]=_[0];n.push(`
|
|
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";
|
|
@@ -810,7 +810,7 @@ ${I}
|
|
|
810
810
|
) {
|
|
811
811
|
${c}::sub_${m}(${x}from, amount${P});
|
|
812
812
|
add_${m}(to, amount);
|
|
813
|
-
}`)}}return{imports:$,functions:p}}async function
|
|
813
|
+
}`)}}return{imports:$,functions:p}}async function Pe(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
|
|
814
814
|
\u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=W(r),l=`${d}Storage`,u=`b"${r}"`,_=it(r,o),$=o.accepts??[],p=[];for(let k of $){let T=n[k];if(!T||typeof T=="string")continue;let M=T;!M.fungible&&M.keys?.length?p.push(ct(r,k,M.keys[0])):p.push(at(r,k))}let{imports:c,functions:g}=ut(s,r,$,o.acceptsFrom??[],e),f=o.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",C=`dubhe::dapp_service::ObjectStorage<${d}>`,a=`
|
|
815
815
|
public fun assert_${r}_id(storage: &${C}, expected: vector<u8>) {
|
|
816
816
|
assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);
|
|
@@ -880,7 +880,7 @@ ${f}
|
|
|
880
880
|
);
|
|
881
881
|
}
|
|
882
882
|
}
|
|
883
|
-
`;await A(y,nt.join(t,`${r}.move`),"formatAndWriteMove")}}import pt from"node:path";function dt(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function
|
|
883
|
+
`;await A(y,nt.join(t,`${r}.move`),"formatAndWriteMove")}}import pt from"node:path";function dt(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}async function Le(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
|
|
884
884
|
\u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=dt(n),o=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
|
|
885
885
|
use dubhe::dapp_service::{Self, DappStorage};
|
|
886
886
|
use ${s}::dapp_key;
|
|
@@ -1036,7 +1036,7 @@ ${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
|
|
1039
|
+
`:""}function le(e,t,s,n,r,o){let d=q(e,t);return t.authorization.kind==="permit"&&d?`dubhe::dapp_system::set_scene_field<DappKey, ${d}, ${s}, ${n}>(
|
|
1040
1040
|
dapp_key::new(), permit, storage, ${r}, ${o}, ctx
|
|
1041
1041
|
);`:`dubhe::dapp_system::set_scene_field_system<DappKey, ${s}, ${n}>(
|
|
1042
1042
|
dapp_key::new(), storage, ${r}, ${o}
|
|
@@ -1056,7 +1056,7 @@ ${N(e,s)} storage: &mut ${o},
|
|
|
1056
1056
|
amount: u64,
|
|
1057
1057
|
${ee(s)} ) {
|
|
1058
1058
|
let current = get_${n}(storage);
|
|
1059
|
-
${
|
|
1059
|
+
${le(e,s,r,"u64",`b"${n}"`,"current + amount")}
|
|
1060
1060
|
}
|
|
1061
1061
|
|
|
1062
1062
|
public(package) fun sub_${n}(
|
|
@@ -1065,7 +1065,7 @@ ${N(e,s)} storage: &mut ${o},
|
|
|
1065
1065
|
${ee(s)} ) {
|
|
1066
1066
|
let current = get_${n}(storage);
|
|
1067
1067
|
assert!(current >= amount, EInsufficientAmount);
|
|
1068
|
-
${
|
|
1068
|
+
${le(e,s,r,"u64",`b"${n}"`,"current - amount")}
|
|
1069
1069
|
}`}function bt(e,t,s,n,r){let o=Y(t),d=X(o);return`
|
|
1070
1070
|
public fun has_${n}(storage: &${d}, ${r}: u64): bool {
|
|
1071
1071
|
let key = sui::bcs::to_bytes(&${r});
|
|
@@ -1084,7 +1084,7 @@ ${N(e,s)} storage: &mut ${d},
|
|
|
1084
1084
|
${ee(s)} ) {
|
|
1085
1085
|
let key = sui::bcs::to_bytes(&${r});
|
|
1086
1086
|
assert!(!dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key), EDuplicateItemId);
|
|
1087
|
-
${
|
|
1087
|
+
${le(e,s,o,"vector<u8>","key","data")}
|
|
1088
1088
|
}
|
|
1089
1089
|
|
|
1090
1090
|
public(package) fun remove_${n}_data(
|
|
@@ -1113,7 +1113,7 @@ ${I}${f} from: &mut ${E},
|
|
|
1113
1113
|
${a} ) {
|
|
1114
1114
|
${h}::sub_${k}(${P}from, amount${i});
|
|
1115
1115
|
add_${k}(${C}to, amount${m});
|
|
1116
|
-
}`)}}return{imports:p,functions:c}}async function
|
|
1116
|
+
}`)}}return{imports:p,functions:c}}async function Re(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
|
|
1117
1117
|
\u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=Y(r),l=`b"${r}"`,u=X(d),_=gt(e,r,o),$=o.accepts??[],p=[];for(let S of $){let x=n[S];if(!x||typeof x=="string")continue;let I=x;!I.fungible&&I.keys?.length?p.push(bt(e,r,o,S,I.keys[0])):p.push(mt(e,r,o,S))}let{imports:c,functions:g}=ft(s,r,o,$,o.acceptsFrom??[],e),a=Object.values(o.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
|
|
1118
1118
|
use std::ascii::String;`:"",m=$.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.keys?.length&&!x.fungible}),h=$.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.fungible}),v=[m?` #[error]
|
|
1119
1119
|
const EFieldNotFound: vector<u8> = b"Field not found";`:"",h?` #[error]
|
|
@@ -1196,7 +1196,7 @@ ${D}
|
|
|
1196
1196
|
);
|
|
1197
1197
|
}
|
|
1198
1198
|
}
|
|
1199
|
-
`;await A(E,lt.join(t,`${r}.move`),"formatAndWriteMove")}}async function
|
|
1199
|
+
`;await A(E,lt.join(t,`${r}.move`),"formatAndWriteMove")}}async function ze(e,t){if(e.name==="dubhe")return;let s=`module ${e.name}::user_storage_init {
|
|
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
|
|
1216
|
+
`;await A(s,t,"formatAndWriteMove")}import Be from"chalk";import{existsSync as yt,readFileSync as ht,writeFileSync as He}from"fs";import vt from"node:path";function kt(e){if(typeof e=="string")return{value:e};let t={};for(let[s,n]of Object.entries(e.fields??{}))t[s]=n;return t}function We(e){let t={};for(let[s,n]of Object.entries(e.fields))t[s]=n;return t}function St(e){let t={};for(let[r,o]of Object.entries(e.resources??{}))t[r]=kt(o);let s={};for(let[r,o]of Object.entries(e.objects??{}))s[r]=We(o);let n={};for(let[r,o]of Object.entries(e.scenes??{}))n[r]=We(o);return{version:1,resources:t,objects:s,scenes:n}}function $e(e,t,s){for(let[n,r]of Object.entries(s)){let o=t[n];if(o)for(let[d,l]of Object.entries(o)){if(!(d in r))throw new Error(`[dubhe] Breaking change detected in ${e}.${n}:
|
|
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
|
|
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=vt.join(e,`${t.name}.lock.json`),n=St(t);if(yt(s)){let r;try{r=JSON.parse(ht(s,"utf-8"))}catch{console.warn(Be.yellow("[dubhe]")+` Could not parse ${Be.bold(s)}, skipping break-check.`),He(s,JSON.stringify(n,null,2)+`
|
|
1225
|
+
`,"utf-8");return}$e("resources",r.resources??{},n.resources),$e("objects",r.objects??{},n.objects),$e("scenes",r.scenes??{},n.scenes)}He(s,JSON.stringify(n,null,2)+`
|
|
1226
|
+
`,"utf-8")}import U from"chalk";var te=e=>console.warn(U.yellow("[dubhe codegen]")+U.yellow(" WARNING: ")+e);function se(e){let t=e.resources??{},s=e.objects??{},n=e.permits??{},r=e.scenes??{},o=new Set(Object.keys(t)),d=new Set(Object.keys(s)),l=new Set(Object.keys(n)),u=new Set(Object.keys(r)),_=new Set;for(let p of o)(d.has(p)||l.has(p)||u.has(p))&&_.add(p);for(let p of d)(l.has(p)||u.has(p))&&_.add(p);for(let p of l)u.has(p)&&_.add(p);if(_.size>0)throw new Error(`Duplicate module names found across resources/objects/permits/scenes: ${[..._].sort().join(", ")}`);let $=new Set;for(let[p,c]of Object.entries(s)){for(let g of c.accepts??[]){$.add(g);let f=t[g];if(!f)throw new Error(`objects.${p}.accepts references '${g}' which is not defined in resources`);if(typeof f!="string"&&!f.transferable)throw new Error(`objects.${p}.accepts includes '${g}', but resources.${g} is missing transferable: true. Add transferable: true to resources.${g} to enable cross-storage transfers.`)}for(let g of c.acceptsFrom??[]){let f=!!s[g],C=!!r[g];if(!f&&!C)throw new Error(`objects.${p}.acceptsFrom references '${g}' which is not defined in objects or scenes`)}}for(let[p,c]of Object.entries(r)){if(!c.authorization)throw new Error(`scenes.${p} is missing authorization. Use { kind: 'system' } or { kind: 'permit', permit: '<permit_name>' }.`);if(c.authorization.kind==="permit"){if(!n[c.authorization.permit])throw new Error(`scenes.${p}.authorization references permit '${c.authorization.permit}', but permits.${c.authorization.permit} is not defined`)}else if(c.authorization.kind!=="system")throw new Error(`scenes.${p}.authorization.kind must be 'system' or 'permit'`);for(let g of c.accepts??[]){$.add(g);let f=t[g];if(!f)throw new Error(`scenes.${p}.accepts references '${g}' which is not defined in resources`);if(typeof f!="string"&&!f.transferable)throw new Error(`scenes.${p}.accepts includes '${g}', but resources.${g} is missing transferable: true. Add transferable: true to resources.${g} to enable cross-storage transfers.`)}for(let g of c.acceptsFrom??[]){let f=!!s[g],C=!!r[g];if(!f&&!C)throw new Error(`scenes.${p}.acceptsFrom references '${g}' which is not defined in objects or scenes`)}}for(let[p,c]of Object.entries(t)){if(typeof c=="string")continue;let g=c;if(g.offchain){if(g.listable)throw new Error(`resources.${p} has both offchain: true and listable: true. offchain resources emit events but store no on-chain state, so there is nothing to take out and place into a Listing.`);if(g.transferable)throw new Error(`resources.${p} has both offchain: true and transferable: true. offchain resources have no on-chain state to transfer between storages.`);if(g.reactive)throw new Error(`resources.${p} has both offchain: true and reactive: true. reactive writes target on-chain state, which offchain resources do not have.`);g.fungible&&te(`resources.${U.bold(p)} has both ${U.cyan("offchain: true")} and ${U.cyan("fungible: true")}. offchain fungible events are emitted only; no on-chain balance is maintained and no add/sub functions are generated. This is unusual \u2014 verify your intent.`)}if(g.reactive&&g.fungible&&te(`resources.${U.bold(p)} has both ${U.cyan("reactive: true")} and ${U.cyan("fungible: true")}. Fungible quantity changes (add/sub) do not suit reactive cross-user writes. Consider using a transfer function instead.`),g.global){if(g.reactive)throw new Error(`resources.${p} has both global: true and reactive: true. global resources live in DappStorage (shared), not in UserStorage. Reactive writes operate between two UserStorage objects and are incompatible with global resources.`);if(g.listable)throw new Error(`resources.${p} has both global: true and listable: true. global resources live in DappStorage and cannot be individually listed for sale. listable requires per-user ownership in UserStorage.`);if(g.transferable)throw new Error(`resources.${p} has both global: true and transferable: true. global resources live in DappStorage and are not owned by individual users. transferable requires per-user state in UserStorage or ObjectStorage.`)}g.fungible&&g.listable&&te(`resources.${U.bold(p)} has both ${U.cyan("fungible: true")} and ${U.cyan("listable: true")}. The generated ${U.green(`list_${p}`)} entry function will include an ${U.cyan("amount")} parameter for partial listings.`),g.transferable&&!$.has(p)&&te(`resources.${U.bold(p)} has ${U.cyan("transferable: true")} but is not referenced in any ${U.cyan("objects.accepts")} or ${U.cyan("scenes.accepts")}. The cross-layer transfer functions will not be generated.`)}}import R from"node:path";async function xt(e,t,s,n=1){console.log(`
|
|
1227
|
+
\u{1F680} Starting Code Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(` \u2514\u2500 Settlement Mode: ${n===1?"USER_PAYS":"DAPP_SUBSIDIZES"}`),se(t),Ye(e,t),console.log(e);let r=R.join(e,"src",t.name);V(`${r}`)&&ce(`${r}/sources/codegen`),V(`${r}/Move.toml`)||await he(t,e);let o=R.join(r,"sources","codegen","genesis.move");V(o)||await Ae(t,o,n);let d=R.join(r,"sources","codegen","init_test.move");V(d)||await Te(t,d);let l=R.join(r,"sources","codegen","dapp_key.move");V(l)||await xe(t,l);let u=R.join(r,"sources","scripts","deploy_hook.move");V(u)||await ke(t,u,n);let _=R.join(r,"sources","codegen","resources");await Ue(t,_);let $=R.join(r,"sources","codegen","objects");await Pe(t,$);let p=R.join(r,"sources","codegen","permits");await Le(t,p);let c=R.join(r,"sources","codegen","scenes");await Re(t,c);let g=R.join(r,"sources","codegen","enums");V(g)||await Oe(t,g),t.errors&&await je(t.name,t.errors,e);let f=R.join(r,"sources","codegen","user_storage_init.move");await ze(t,f),await De(t,e),await Se(t,e),console.log(`
|
|
1228
1228
|
\u2705 Code Generation Complete!
|
|
1229
|
-
`)}var Zs=xt;var
|
|
1229
|
+
`)}var Zs=xt;var Ns=e=>(se(e),e);import{findUp as Ct}from"find-up";import ge from"path";import wt from"esbuild";var re=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as Dt}from"fs";import{pathToFileURL as jt}from"url";import Tt from"os";var At=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],_e="dubhe.config.example.mjs";async function ur(e){e=await Ve(e);try{return await wt.build({entryPoints:[e],format:"esm",outfile:_e,platform:"node",bundle:!0,packages:"external"}),e=await Ve(_e,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Dt(_e,{force:!0})}}async function Ve(e,t){return e===void 0?e=await Et():ge.isAbsolute(e)||(e=ge.join(process.cwd(),e),e=ge.normalize(e)),t&&Tt.platform()==="win32"?jt(e).href:e}async function Et(){let e=await Ct(At);if(e===void 0)throw new re;return e}var Ot=(s=>(s.Event="event",s.Schema="schema",s))(Ot||{});export{Ot as SubscriptionKind,Ye as checkAndUpdateLock,xt as codegen,Ns as defineConfig,A as formatAndWriteMove,It as formatMove,Pe as generateObjects,Re as generateScenes,ur as loadConfig,Zs as schemaGen};
|
|
1230
1230
|
//# sourceMappingURL=index.js.map
|