@0xobelisk/sui-common 1.2.0-pre.119 → 1.2.0-pre.120
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 +137 -137
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/codegen/utils/generateLock.ts +4 -1
- package/src/codegen/utils/renderMove/codegen.ts +6 -0
- package/src/codegen/utils/renderMove/dapp.ts +0 -2
- package/src/codegen/utils/renderMove/generateResources.ts +0 -4
- package/src/codegen/utils/validateConfig.ts +26 -10
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _e from"prettier";import Ge from"prettier-plugin-move-js";async function It(e,t){let s;t&&(s=await _e.resolveConfig(t));try{return _e.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 be from"node:fs/promises";import Je from"node:path";import me from"debug";var oe=me("dubhe:common"),qe=me("dubhe:common");oe.log=console.debug.bind(console);qe.log=console.error.bind(console);var ie=oe.extend("codegen");ie.log=console.debug.bind(console);async function A(e,t,s){let n=e,r=`// Copyright (c) Obelisk Labs, Inc.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
/* Autogenerated file. Do not edit manually. */
|
|
5
5
|
|
|
6
6
|
`,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 be.mkdir(Je.dirname(t),{recursive:!0}),await be.writeFile(t,d),ie(`${s}: ${t}`)}import{existsSync as V}from"fs";import J from"fs";function ae(e){J.existsSync(e)&&(J.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;J.lstatSync(s).isDirectory()?ae(s):J.unlinkSync(s)}),J.rmdirSync(e))}var fe={name:"@0xobelisk/sui-common",version:"1.2.0-pre.120",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 ye(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${fe.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 he}from"fs";async function ve(e,t,s=1){if(!he(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 ke(e,t){if(!he(`${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 Se(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(([o,d])=>{let l=
|
|
65
|
+
`;await A(s,t,"formatAndWriteMove")}import{existsSync as xe}from"fs";import Ce from"node:fs/promises";async function we(e,t){xe(`${t}/src/${e.name}/sources/systems`)||await Ce.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),xe(`${t}/src/${e.name}/sources/tests`)||await Ce.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 De(e,t,s){console.log(`
|
|
66
|
+
\u{1F4E6} Starting Error Generation...`);let n=Object.entries(t).map(([o,d])=>{let l=Xe(o),u=Qe(d);return console.log(` \u2514\u2500 ${o}: ${u}`),[" #[error]",` const ${l}: vector<u8> = b"${u}";`,` public fun ${o}(condition: bool) { assert!(condition, ${l}) }`].join(`
|
|
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 je(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 Te(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=
|
|
144
|
+
`;await A(r,t,"formatAndWriteMove")}function Ae(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function Ee(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}/${Ae(s)}.move`,"formatAndWriteMove")}}function Ne(e,t,s){let n=s.map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(",");return`module ${e}::${Ae(t)} {
|
|
146
146
|
use sui::bcs::{BCS, to_bytes, peel_enum_tag};
|
|
147
147
|
|
|
148
148
|
public enum ${t} has copy, drop, store {
|
|
@@ -166,43 +166,43 @@ ${s.map((r,o)=>` ${o} => ${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)
|
|
169
|
+
}`}function Fe(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 Ke(e){return e?"DappStorage":"UserStorage"}function Ie(e){return e?"dapp_storage":"user_storage"}function ue(e,t){let s=Fe(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 Me(e,t){if(console.log(`
|
|
170
|
+
\u{1F4E6} Starting Resources Generation...`),!!e.resources)for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let l=et(e.name,s,n,"Onchain");await A(l,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let r=tt(e.name,s,n),o=rt(e,s,n),d=o?r.replace(/^}$/m,`
|
|
171
171
|
${o}
|
|
172
|
-
}`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}
|
|
172
|
+
}`):r;await A(d,`${t}/${s}.move`,"formatAndWriteMove")}}function et(e,t,s,n="Onchain"){let r=!z(s),o=r?`${ce(s)}`:"",d=n==="Offchain",l=!1,u=Ke(l),_=Ie(l),$=ue(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);
|
|
176
|
-
${
|
|
176
|
+
${$.has_record}<DappKey>(${_}, key_tuple)
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
public fun ensure_has(${_}: &${u}) {
|
|
180
180
|
let mut key_tuple = vector::empty();
|
|
181
181
|
key_tuple.push_back(TABLE_NAME);
|
|
182
|
-
${
|
|
182
|
+
${$.ensure_has}<DappKey>(${_}, key_tuple)
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
public fun ensure_has_not(${_}: &${u}) {
|
|
186
186
|
let mut key_tuple = vector::empty();
|
|
187
187
|
key_tuple.push_back(TABLE_NAME);
|
|
188
|
-
${
|
|
188
|
+
${$.ensure_has_not}<DappKey>(${_}, key_tuple)
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
public(package) fun delete(${_}: &mut ${u}, ctx: &TxContext) {
|
|
192
192
|
let mut key_tuple = vector::empty();
|
|
193
193
|
key_tuple.push_back(TABLE_NAME);
|
|
194
|
-
${
|
|
194
|
+
${$.delete_record}<DappKey>(${L(e)}${_}, key_tuple, vector[b"value"], ctx);
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
public fun get(${_}: &${u}): (${s==="string"||s==="String"?"String":s}) {
|
|
198
198
|
let mut key_tuple = vector::empty();
|
|
199
199
|
key_tuple.push_back(TABLE_NAME);
|
|
200
|
-
let value_raw = ${
|
|
200
|
+
let value_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"value");
|
|
201
201
|
let mut value_bcs = sui::bcs::new(value_raw);
|
|
202
202
|
let value = ${G(e,s,"value_bcs",r?[{type:s,module:o}]:[])};
|
|
203
203
|
(value)
|
|
204
204
|
}
|
|
205
|
-
`,c=l?"use dubhe::dapp_service::DappStorage;":"use dubhe::dapp_service::UserStorage;"
|
|
205
|
+
`,c=l?"use dubhe::dapp_service::DappStorage;":"use dubhe::dapp_service::UserStorage;",g=r&&s!=="string"&&s!=="String";return`module ${e}::${t} {${!g?`
|
|
206
206
|
use sui::bcs::{to_bytes};`:""}${s==="string"||s==="String"?`
|
|
207
207
|
use std::ascii::{String, into_bytes};`:s==="vector<String>"?`
|
|
208
208
|
use std::ascii::String;`:""}
|
|
@@ -210,18 +210,18 @@ ${o}
|
|
|
210
210
|
use dubhe::dapp_system;
|
|
211
211
|
use ${e}::dapp_key;
|
|
212
212
|
use ${e}::dapp_key::DappKey;
|
|
213
|
-
${
|
|
213
|
+
${g?` use ${e}::${o}::{${s}};`:""}
|
|
214
214
|
|
|
215
215
|
const TABLE_NAME: vector<u8> = b"${t}";
|
|
216
216
|
const OFFCHAIN: bool = ${n==="Offchain"};
|
|
217
217
|
|
|
218
218
|
${p}
|
|
219
|
-
public(package) fun set(${
|
|
219
|
+
public(package) fun set(${H(e,l)}${_}: &mut ${u}, value: ${s==="string"||s==="String"?"String":s}, ctx: &mut TxContext) {
|
|
220
220
|
let mut key_tuple = vector::empty();
|
|
221
221
|
key_tuple.push_back(TABLE_NAME);
|
|
222
222
|
let field_names = vector[b"value"];
|
|
223
223
|
let value_tuple = encode(value);
|
|
224
|
-
${
|
|
224
|
+
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
public fun encode(value: ${s==="string"||s==="String"?"String":s}): vector<vector<u8>> {
|
|
@@ -229,10 +229,10 @@ ${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 ce(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,_=Ke(u),$=Ie(u),p=ue(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:`${ce(O)}`})).filter((b,O,re)=>re.findIndex(ne=>ne.type===b.type)===O),m=Object.entries(n).filter(([b,O])=>!z(O)&&O!=="string"&&O!=="String").map(([b,O])=>({type:O,module:`${ce(O)}`})).filter((b,O,re)=>re.findIndex(ne=>ne.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
|
-
use std::ascii::String;`:"",
|
|
235
|
+
use std::ascii::String;`:"",P=x?`
|
|
236
236
|
use std::ascii::{string, String, into_bytes};`:E||S?`
|
|
237
237
|
use std::ascii::String;`:"";if(c||C)return`module ${e}::${t} {${D}${I}
|
|
238
238
|
${v}
|
|
@@ -256,7 +256,7 @@ ${h}
|
|
|
256
256
|
self.${b} = ${b}
|
|
257
257
|
}`).join(`
|
|
258
258
|
|
|
259
|
-
`);return`module ${e}::${t} {${D}${
|
|
259
|
+
`);return`module ${e}::${t} {${D}${P}
|
|
260
260
|
${v}
|
|
261
261
|
use dubhe::dapp_system;
|
|
262
262
|
use ${e}::dapp_key;
|
|
@@ -282,106 +282,106 @@ ${T}
|
|
|
282
282
|
${M}
|
|
283
283
|
|
|
284
284
|
${h}
|
|
285
|
-
}`}function
|
|
286
|
-
`)}function
|
|
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_${pe(t)}(&mut ${s})`}function Oe(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",$=ue("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();
|
|
290
290
|
key_tuple.push_back(TABLE_NAME);`,h=l?"":", ctx: &mut TxContext",v=l?"":", ctx",j=C?"":` public fun has(${_}: &${u}${a?", ":""}${a}): bool {
|
|
291
291
|
${m}
|
|
292
|
-
${
|
|
292
|
+
${$.has_record}<DappKey>(${_}, key_tuple)
|
|
293
293
|
}
|
|
294
294
|
|
|
295
295
|
public fun ensure_has(${_}: &${u}${a?", ":""}${a}) {
|
|
296
296
|
${m}
|
|
297
|
-
${
|
|
297
|
+
${$.ensure_has}<DappKey>(${_}, key_tuple)
|
|
298
298
|
}
|
|
299
299
|
|
|
300
300
|
public fun ensure_has_not(${_}: &${u}${a?", ":""}${a}) {
|
|
301
301
|
${m}
|
|
302
|
-
${
|
|
302
|
+
${$.ensure_has_not}<DappKey>(${_}, key_tuple)
|
|
303
303
|
}
|
|
304
304
|
`,w=`vector[${c.map(i=>`b"${i}"`).join(", ")}]`,F=C?"":` public(package) fun delete(${_}: &mut ${u}${a?", ":""}${a}${l?"":", ctx: &TxContext"}) {
|
|
305
305
|
${m}
|
|
306
|
-
${
|
|
307
|
-
}`,D=!f&&!C?c.map(i=>{let y=s[i],k=!
|
|
306
|
+
${$.delete_record}<DappKey>(${L(e)}${_}, key_tuple, ${w}${l?"":", ctx"});
|
|
307
|
+
}`,D=!f&&!C?c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return` public fun get_${i}(${_}: &${u}${a?", ":""}${a}): ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y} {
|
|
308
308
|
${m}
|
|
309
|
-
let ${i}_raw = ${
|
|
309
|
+
let ${i}_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"${i}");
|
|
310
310
|
let mut ${i}_bcs = sui::bcs::new(${i}_raw);
|
|
311
311
|
let ${i} = ${G(e,y,`${i}_bcs`,o)};
|
|
312
312
|
${i}
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
public(package) fun set_${i}(${
|
|
315
|
+
public(package) fun set_${i}(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${i}: ${y==="string"||y==="String"?"String":y==="vector<String>"?"vector<String>":y}${h}) {
|
|
316
316
|
${m}
|
|
317
317
|
let value = ${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`};
|
|
318
|
-
${
|
|
318
|
+
${$.set_field}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, b"${i}", value${v});
|
|
319
319
|
}`}).join(`
|
|
320
320
|
|
|
321
|
-
`):"",E=`vector[${c.map(i=>`b"${i}"`).join(", ")}]`,S
|
|
321
|
+
`):"",E=`vector[${c.map(i=>`b"${i}"`).join(", ")}]`,S=g?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}${h}) {
|
|
322
322
|
${m}
|
|
323
323
|
let field_names: vector<vector<u8>> = vector[];
|
|
324
324
|
let value_tuple: vector<vector<u8>> = vector[];
|
|
325
|
-
${
|
|
326
|
-
}`:f?C?` public(package) fun set(${
|
|
325
|
+
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
|
|
326
|
+
}`:f?C?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}${h}) {
|
|
327
327
|
${m}
|
|
328
328
|
let field_names = vector[b"${c[0]}"];
|
|
329
329
|
let value_tuple = encode(value);
|
|
330
|
-
${
|
|
330
|
+
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
|
|
331
331
|
}`:` public fun get(${_}: &${u}${a?", ":""}${a}): ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]} {
|
|
332
332
|
${m}
|
|
333
|
-
let ${c[0]}_raw = ${
|
|
333
|
+
let ${c[0]}_raw = ${$.get_field}<DappKey>(${_}, key_tuple, b"${c[0]}");
|
|
334
334
|
let mut ${c[0]}_bcs = sui::bcs::new(${c[0]}_raw);
|
|
335
335
|
let value = ${G(e,Object.values(p)[0],`${c[0]}_bcs`,o)};
|
|
336
336
|
value
|
|
337
337
|
}
|
|
338
338
|
|
|
339
|
-
public(package) fun set(${
|
|
339
|
+
public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}${h}) {
|
|
340
340
|
${m}
|
|
341
341
|
let field_names = vector[b"${c[0]}"];
|
|
342
342
|
let value_tuple = encode(value);
|
|
343
|
-
${
|
|
344
|
-
}`:C?` public(package) fun set(${
|
|
343
|
+
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
|
|
344
|
+
}`:C?` public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}${h}) {
|
|
345
345
|
${m}
|
|
346
346
|
let field_names = ${E};
|
|
347
347
|
let value_tuple = encode(${c.join(", ")});
|
|
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)=>Oe(e,$,_,i,s[i],y,o)).join(`
|
|
352
352
|
`)}
|
|
353
353
|
(${c.join(", ")})
|
|
354
354
|
}
|
|
355
355
|
|
|
356
|
-
public(package) fun set(${
|
|
356
|
+
public(package) fun set(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}${h}) {
|
|
357
357
|
${m}
|
|
358
358
|
let field_names = ${E};
|
|
359
359
|
let value_tuple = encode(${c.join(", ")});
|
|
360
|
-
${
|
|
361
|
-
}`,x=r?C?` public(package) fun set_struct(${
|
|
360
|
+
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
|
|
361
|
+
}`,x=r?C?` public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${K(t)}${h}) {
|
|
362
362
|
${m}
|
|
363
363
|
let field_names = ${E};
|
|
364
364
|
let value_tuple = encode_struct(${t});
|
|
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)=>Oe(e,$,_,i,s[i],y,o)).join(`
|
|
369
369
|
`)}
|
|
370
370
|
${K(t)} { ${c.join(", ")} }
|
|
371
371
|
}
|
|
372
372
|
|
|
373
|
-
public(package) fun set_struct(${
|
|
373
|
+
public(package) fun set_struct(${H(e,l)}${_}: &mut ${u}${a?", ":""}${a}, ${t}: ${K(t)}${h}) {
|
|
374
374
|
${m}
|
|
375
375
|
let field_names = ${E};
|
|
376
376
|
let value_tuple = encode_struct(${t});
|
|
377
|
-
${
|
|
377
|
+
${$.set_record}<DappKey>(${L(e)}${B(e,l)}${_}, key_tuple, field_names, value_tuple, OFFCHAIN${v});
|
|
378
378
|
}`:"",I=f?` public fun encode(value: ${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"String":Object.values(p)[0]}): vector<vector<u8>> {
|
|
379
379
|
let mut value_tuple = vector::empty();
|
|
380
|
-
value_tuple.push_back(${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(p)[0]==="vector<String>"||
|
|
380
|
+
value_tuple.push_back(${Object.values(p)[0]==="string"||Object.values(p)[0]==="String"?"to_bytes(&into_bytes(value))":Object.values(p)[0]==="vector<String>"||z(Object.values(p)[0])?"to_bytes(&value)":`${e}::${o.find(i=>i.type===Object.values(p)[0])?.module}::encode(value)`});
|
|
381
381
|
value_tuple
|
|
382
382
|
}`:r?C?` public fun encode(${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}): vector<vector<u8>> {
|
|
383
383
|
let mut value_tuple = vector::empty();
|
|
384
|
-
${c.map(i=>{let y=s[i],k=!
|
|
384
|
+
${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`});`}).join(`
|
|
385
385
|
`)}
|
|
386
386
|
value_tuple
|
|
387
387
|
}
|
|
@@ -390,7 +390,7 @@ ${h}
|
|
|
390
390
|
encode(${c.map(i=>`${t}.${i}`).join(", ")})
|
|
391
391
|
}`:` public fun encode(${c.map(i=>`${i}: ${s[i]==="string"||s[i]==="String"?"String":s[i]}`).join(", ")}): vector<vector<u8>> {
|
|
392
392
|
let mut value_tuple = vector::empty();
|
|
393
|
-
${c.map(i=>{let y=s[i],k=!
|
|
393
|
+
${c.map(i=>{let y=s[i],k=!z(y),T=k?o.find(M=>M.type===y):null;return`value_tuple.push_back(${y==="string"||y==="String"?`to_bytes(&into_bytes(${i}))`:y==="vector<String>"?`to_bytes(&${i})`:k?`${e}::${T?.module}::encode(${i})`:`to_bytes(&${i})`});`}).join(`
|
|
394
394
|
`)}
|
|
395
395
|
value_tuple
|
|
396
396
|
}
|
|
@@ -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=!
|
|
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_${pe(y)}(&mut bcs_type)`};`}).join(`
|
|
405
405
|
`)}
|
|
406
406
|
${K(t)} {
|
|
407
407
|
${c.map(i=>`${i},`).join(`
|
|
@@ -409,21 +409,21 @@ ${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 pe(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":t==="String"?"vec_string":`vec_${pe(t)}`}switch(e){case"u8":return"u8";case"u16":return"u16";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"bool":return"bool";case"address":return"address";case"String":return"string";default:return e}}function rt(e,t,s){let n=[],r=e.name,o=Fe(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";
|
|
416
416
|
|
|
417
|
-
public(package) fun add(user_storage: &mut UserStorage, amount: ${
|
|
417
|
+
public(package) fun add(user_storage: &mut UserStorage, amount: ${g}, ctx: &mut TxContext) {
|
|
418
418
|
let current = if (has(user_storage)) { get(user_storage) } else { 0 };
|
|
419
419
|
set(user_storage, current + amount, ctx);
|
|
420
420
|
}
|
|
421
421
|
|
|
422
|
-
public(package) fun sub(user_storage: &mut UserStorage, amount: ${
|
|
422
|
+
public(package) fun sub(user_storage: &mut UserStorage, amount: ${g}, ctx: &mut TxContext) {
|
|
423
423
|
let current = get(user_storage);
|
|
424
424
|
assert!(current >= amount, EInsufficientAmount);
|
|
425
425
|
set(user_storage, current - amount, ctx);
|
|
426
|
-
}`)}if(u.length>0&&!s.offchain&&!s.global){let c=u.map(m=>`${m}: ${l[m]}`).join(", ")
|
|
426
|
+
}`)}if(u.length>0&&!s.offchain&&!s.global){let c=u.map(m=>`${m}: ${l[m]}`).join(", "),g=$.map(m=>`${m}: ${l[m]}`).join(", "),f=[c,g].filter(Boolean).join(", "),C=u.join(", "),a=[...u,...$].join(", ");n.push(`
|
|
427
427
|
// \u2500\u2500\u2500 keys: mint (developer provides keys; framework ensures no duplicate) \u2500
|
|
428
428
|
// Choosing the ID strategy (fresh address, counter, coordinate pack, etc.)
|
|
429
429
|
// is intentionally left to the caller.
|
|
@@ -436,9 +436,9 @@ ${h}
|
|
|
436
436
|
set(user_storage, ${a}, ctx);
|
|
437
437
|
}`)}if(s.reactive){let c=u.length>0?`let mut key_tuple = vector::empty();
|
|
438
438
|
key_tuple.push_back(TABLE_NAME);
|
|
439
|
-
${u.map(
|
|
439
|
+
${u.map(g=>`key_tuple.push_back(sui::bcs::to_bytes(&${g}));`).join(`
|
|
440
440
|
`)}`:`let mut key_tuple = vector::empty();
|
|
441
|
-
key_tuple.push_back(TABLE_NAME);`;if(
|
|
441
|
+
key_tuple.push_back(TABLE_NAME);`;if($.length>1){let g=$.map(f=>`${f}: ${l[f]}`).join(", ");n.push(`
|
|
442
442
|
// \u2500\u2500\u2500 reactive: cross-user write variants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
443
443
|
// Package-level helpers: add pause checks and access control in your system
|
|
444
444
|
// functions before calling these.
|
|
@@ -447,26 +447,26 @@ ${h}
|
|
|
447
447
|
meta: &dubhe::dapp_service::PermitMetadata,
|
|
448
448
|
from: &mut UserStorage,
|
|
449
449
|
target: &mut UserStorage,
|
|
450
|
-
${p?p+", ":""}${
|
|
450
|
+
${p?p+", ":""}${g},
|
|
451
451
|
ctx: &mut TxContext,
|
|
452
452
|
) {
|
|
453
453
|
${c}
|
|
454
|
-
let field_names = vector[${
|
|
455
|
-
let value_tuple = encode(${
|
|
454
|
+
let field_names = vector[${$.map(f=>`b"${f}"`).join(", ")}];
|
|
455
|
+
let value_tuple = encode(${$.join(", ")});
|
|
456
456
|
${o}::set_record_reactive<DappKey>(${d}scene_id, meta, from, target, key_tuple, field_names, value_tuple, ctx);
|
|
457
|
-
}`)}for(let[
|
|
458
|
-
public(package) fun set_${
|
|
457
|
+
}`)}for(let[g,f]of _){let C=f==="string"||f==="String"?`sui::bcs::to_bytes(&std::ascii::into_bytes(${g}))`:`sui::bcs::to_bytes(&${g})`;n.push(`
|
|
458
|
+
public(package) fun set_${g}_reactive(
|
|
459
459
|
scene_id: &sui::object::UID,
|
|
460
460
|
meta: &dubhe::dapp_service::PermitMetadata,
|
|
461
461
|
from: &mut UserStorage,
|
|
462
462
|
target: &mut UserStorage,
|
|
463
|
-
${p?p+", ":""}${
|
|
463
|
+
${p?p+", ":""}${g}: ${f==="string"||f==="String"?"String":f},
|
|
464
464
|
ctx: &mut TxContext,
|
|
465
465
|
) {
|
|
466
466
|
${c}
|
|
467
467
|
let value = ${C};
|
|
468
|
-
${o}::set_field_reactive<DappKey>(${d}scene_id, meta, from, target, key_tuple, b"${
|
|
469
|
-
}`)}}if(s.transferable){let c=e.objects??{}
|
|
468
|
+
${o}::set_field_reactive<DappKey>(${d}scene_id, meta, from, target, key_tuple, b"${g}", value, ctx);
|
|
469
|
+
}`)}}if(s.transferable){let c=e.objects??{},g=e.scenes??{},f=!!s.fungible,C=!f&&u.length>0,a=C?u[0]:null;for(let[m,h]of Object.entries(c)){if(!(h.accepts??[]).includes(t))continue;let v=K(m),j=`dubhe::dapp_service::ObjectStorage<${r}::${m}::${v}>`,w=m;if(f&&$.length===1){let[,F]=_[0];n.push(`
|
|
470
470
|
// \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
471
471
|
public(package) fun transfer_user_to_${m}(
|
|
472
472
|
user: &mut UserStorage,
|
|
@@ -486,7 +486,7 @@ ${h}
|
|
|
486
486
|
) {
|
|
487
487
|
${r}::${w}::sub_${t}(source, amount);
|
|
488
488
|
add(user, amount, ctx);
|
|
489
|
-
}`)}else if(C&&a)if(
|
|
489
|
+
}`)}else if(C&&a)if($.length===1){let[,F]=_[0],D=F==="string"||F==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,E=Object.entries(e.enums??{}).map(([x])=>({type:K(x),module:x})),S=G(r,F,"bcs",E);n.push(`
|
|
490
490
|
// \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
491
491
|
public(package) fun transfer_user_to_${m}(
|
|
492
492
|
user: &mut UserStorage,
|
|
@@ -542,8 +542,8 @@ ${h}
|
|
|
542
542
|
let raw = ${r}::${w}::remove_${t}_data(source, ${a});
|
|
543
543
|
let decoded = decode(raw);
|
|
544
544
|
set_struct(user, ${a}, decoded, ctx);
|
|
545
|
-
}`)}for(let[m,h]of Object.entries(
|
|
546
|
-
`:"",E=h.authorization.kind==="permit"?"permit, ":"",S=h.authorization.kind==="permit"?", ctx":"";if(f
|
|
545
|
+
}`)}for(let[m,h]of Object.entries(g)){if(!(h.accepts??[]).includes(t))continue;let v=K(m),j=`dubhe::dapp_service::SceneStorage<${r}::${m}::${v}>`,w=m,F=h.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${r}::${h.authorization.permit}::${K(h.authorization.permit)}>`:"",D=h.authorization.kind==="permit"?` permit: &${F},
|
|
546
|
+
`:"",E=h.authorization.kind==="permit"?"permit, ":"",S=h.authorization.kind==="permit"?", ctx":"";if(f&&$.length===1){let[,x]=_[0];n.push(`
|
|
547
547
|
// \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
548
548
|
public(package) fun transfer_user_to_${m}(
|
|
549
549
|
${D} user: &mut UserStorage,
|
|
@@ -564,7 +564,7 @@ ${D} source: &mut ${j},
|
|
|
564
564
|
) {
|
|
565
565
|
${r}::${w}::sub_${t}(${E}source, amount${S});
|
|
566
566
|
add(user, amount, ctx);
|
|
567
|
-
}`)}else if(C&&a)if(
|
|
567
|
+
}`)}else if(C&&a)if($.length===1){let[,x]=_[0],I=x==="string"||x==="String"?`to_bytes(&std::ascii::into_bytes(get(user, ${a})))`:`to_bytes(&get(user, ${a}))`,P=Object.entries(e.enums??{}).map(([y])=>({type:K(y),module:y})),i=G(r,x,"bcs",P);n.push(`
|
|
568
568
|
// \u2500\u2500\u2500 transferable: User \u2194 ${v}Storage (keyed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
569
569
|
public(package) fun transfer_user_to_${m}(
|
|
570
570
|
${D} user: &mut UserStorage,
|
|
@@ -620,7 +620,7 @@ ${D} source: &mut ${j},
|
|
|
620
620
|
let raw = ${r}::${w}::remove_${t}_data(${E}source, ${a}${S});
|
|
621
621
|
let decoded = decode(raw);
|
|
622
622
|
set_struct(user, ${a}, decoded, ctx);
|
|
623
|
-
}`)}}if(s.listable){let c=!!s.fungible,f=!c&&u.length>0,C=f?u[0]:null,a=`b"${t}"`;if(c
|
|
623
|
+
}`)}}if(s.listable){let c=!!s.fungible,f=!c&&u.length>0,C=f?u[0]:null,a=`b"${t}"`;if(c&&$.length===1)n.push(`
|
|
624
624
|
// \u2500\u2500\u2500 listable: market protocol (fungible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
625
625
|
// Package-level helpers: call these from your system functions.
|
|
626
626
|
// Add pause checks, access control, and custom logic there.
|
|
@@ -636,7 +636,7 @@ ${D} source: &mut ${j},
|
|
|
636
636
|
user_storage,
|
|
637
637
|
${a},
|
|
638
638
|
{ let mut k = vector::empty(); k.push_back(TABLE_NAME); k },
|
|
639
|
-
b"${
|
|
639
|
+
b"${$[0]}",
|
|
640
640
|
amount,
|
|
641
641
|
price,
|
|
642
642
|
listed_until,
|
|
@@ -696,7 +696,7 @@ ${D} source: &mut ${j},
|
|
|
696
696
|
user_storage,
|
|
697
697
|
${a},
|
|
698
698
|
record_key,
|
|
699
|
-
vector[${
|
|
699
|
+
vector[${$.map(v=>`b"${v}"`).join(", ")}],
|
|
700
700
|
price,
|
|
701
701
|
listed_until,
|
|
702
702
|
ctx,
|
|
@@ -735,7 +735,7 @@ ${D} source: &mut ${j},
|
|
|
735
735
|
dapp_key::new(), listing, user_storage, ctx
|
|
736
736
|
);
|
|
737
737
|
}`)}}return n.join(`
|
|
738
|
-
`)}import
|
|
738
|
+
`)}import nt from"node:path";function W(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ot(e){return e==="string"||e==="String"?"String":e}function Q(e){return`dubhe::dapp_service::ObjectStorage<${e}>`}function it(e,t){let s=W(e),n=Q(s),r=[];for(let[o,d]of Object.entries(t.fields)){let l=ot(d);r.push(`
|
|
739
739
|
public fun get_${o}(storage: &${n}): ${l} {
|
|
740
740
|
dubhe::dapp_system::get_object_field<${s}, ${l}>(storage, b"${o}")
|
|
741
741
|
}
|
|
@@ -745,7 +745,7 @@ ${D} source: &mut ${j},
|
|
|
745
745
|
dapp_key::new(), storage, b"${o}", value
|
|
746
746
|
);
|
|
747
747
|
}`)}return r.join(`
|
|
748
|
-
`)}function
|
|
748
|
+
`)}function at(e,t){let s=W(e),n=Q(s);return`
|
|
749
749
|
public fun get_${t}(storage: &${n}): u64 {
|
|
750
750
|
if (dubhe::dapp_system::has_object_field<${s}, u64>(storage, b"${t}")) {
|
|
751
751
|
dubhe::dapp_system::get_object_field<${s}, u64>(storage, b"${t}")
|
|
@@ -765,7 +765,7 @@ ${D} source: &mut ${j},
|
|
|
765
765
|
dubhe::dapp_system::set_object_field<DappKey, ${s}, u64>(
|
|
766
766
|
dapp_key::new(), storage, b"${t}", current - amount
|
|
767
767
|
);
|
|
768
|
-
}`}function
|
|
768
|
+
}`}function ct(e,t,s){let n=W(e),r=Q(n);return`
|
|
769
769
|
public fun has_${t}(storage: &${r}, ${s}: u64): bool {
|
|
770
770
|
let key = sui::bcs::to_bytes(&${s});
|
|
771
771
|
dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key)
|
|
@@ -788,9 +788,9 @@ ${D} source: &mut ${j},
|
|
|
788
788
|
let key = sui::bcs::to_bytes(&${s});
|
|
789
789
|
assert!(dubhe::dapp_system::has_object_field<${n}, vector<u8>>(storage, key), EFieldNotFound);
|
|
790
790
|
dubhe::dapp_system::remove_object_field<DappKey, ${n}, vector<u8>>(dapp_key::new(), storage, key)
|
|
791
|
-
}`}function
|
|
791
|
+
}`}function ut(e,t,s,n,r){let o=r.resources??{},d=r.objects??{},l=r.scenes??{},u=W(t),_=Q(u),$=[],p=[];for(let c of n){let g=d[c]??l[c];if(!g)continue;let f=g.accepts??[],C=W(c);$.push(` use ${e}::${c};`);let a=f.filter(m=>s.includes(m));for(let m of a){let h=o[m];if(!h||typeof h=="string")continue;let v=h,j=!!l[c],w=`${e}::${c}::${C}`,F=j?`dubhe::dapp_service::SceneStorage<${w}>`:`dubhe::dapp_service::ObjectStorage<${w}>`,D=j?l[c]:void 0,E=D?.authorization.kind==="permit"?`dubhe::dapp_service::ScenePermit<${e}::${D.authorization.permit}::${W(D.authorization.permit)}>`:"",S=D?.authorization.kind==="permit"?` source_permit: &${E},
|
|
792
792
|
`:"",x=D?.authorization.kind==="permit"?"source_permit, ":"",I=D?.authorization.kind==="permit"?` ctx: &TxContext,
|
|
793
|
-
`:"",
|
|
793
|
+
`:"",P=D?.authorization.kind==="permit"?", ctx":"";if(!v.fungible&&v.keys?.length){let i=v.keys[0];p.push(`
|
|
794
794
|
/// Transfer ${m} (keyed item) from ${c} into this ${t}.
|
|
795
795
|
public(package) fun transfer_${c}_to_${t}_${m}(
|
|
796
796
|
${S} from: &mut ${F},
|
|
@@ -798,7 +798,7 @@ ${S} from: &mut ${F},
|
|
|
798
798
|
${i}: u64,
|
|
799
799
|
${I}
|
|
800
800
|
) {
|
|
801
|
-
let data = ${c}::remove_${m}_data(${x}from, ${i}${
|
|
801
|
+
let data = ${c}::remove_${m}_data(${x}from, ${i}${P});
|
|
802
802
|
set_${m}_data(to, ${i}, data);
|
|
803
803
|
}`)}else p.push(`
|
|
804
804
|
/// Transfer ${m} (fungible) from ${c} into this ${t}.
|
|
@@ -808,28 +808,28 @@ ${S} from: &mut ${F},
|
|
|
808
808
|
amount: u64,
|
|
809
809
|
${I}
|
|
810
810
|
) {
|
|
811
|
-
${c}::sub_${m}(${x}from, amount${
|
|
811
|
+
${c}::sub_${m}(${x}from, amount${P});
|
|
812
812
|
add_${m}(to, amount);
|
|
813
|
-
}`)}}return{imports
|
|
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}"`,_=
|
|
813
|
+
}`)}}return{imports:$,functions:p}}async function Ue(e,t){if(!e.objects||Object.keys(e.objects).length===0)return;console.log(`
|
|
814
|
+
\u{1F4E6} Starting Object Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.objects)){console.log(` \u2514\u2500 ${r}`);let d=W(r),l=`${d}Storage`,u=`b"${r}"`,_=it(r,o),$=o.accepts??[],p=[];for(let k of $){let T=n[k];if(!T||typeof T=="string")continue;let M=T;!M.fungible&&M.keys?.length?p.push(ct(r,k,M.keys[0])):p.push(at(r,k))}let{imports:c,functions:g}=ut(s,r,$,o.acceptsFrom??[],e),f=o.adminOnly?" assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);":"",C=`dubhe::dapp_service::ObjectStorage<${d}>`,a=`
|
|
815
815
|
public fun assert_${r}_id(storage: &${C}, expected: vector<u8>) {
|
|
816
816
|
assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);
|
|
817
817
|
}`,m=`
|
|
818
818
|
public fun entity_id(storage: &${C}): vector<u8> {
|
|
819
819
|
*dubhe::dapp_service::object_storage_entity_id(storage)
|
|
820
820
|
}`,j=Object.values(o.fields).some(k=>k==="string"||k==="String"||k==="vector<String>")?`
|
|
821
|
-
use std::ascii::String;`:"",w
|
|
821
|
+
use std::ascii::String;`:"",w=$.some(k=>{let T=n[k];return!T||typeof T=="string"?!1:!!T.keys?.length&&!T.fungible}),F=$.some(k=>{let T=n[k];return!T||typeof T=="string"?!1:!!T.fungible}),D=w,E=F,S=w,x=!!o.adminOnly,I=[D?` #[error]
|
|
822
822
|
const EFieldNotFound: vector<u8> = b"Field not found";`:"",E?` #[error]
|
|
823
823
|
const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",S?` #[error]
|
|
824
824
|
const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:"",` #[error]
|
|
825
825
|
const EWrongEntityId: vector<u8> = b"Wrong entity id";`,x?` #[error]
|
|
826
826
|
const ENoPermission: vector<u8> = b"Caller does not have permission";`:""].filter(Boolean).join(`
|
|
827
|
-
`),
|
|
827
|
+
`),P=c.length>0?`
|
|
828
828
|
`+c.join(`
|
|
829
829
|
`):"",i=`dubhe::dapp_service::ObjectStorage<${d}>`,y=`module ${s}::${r} {
|
|
830
830
|
use dubhe::dapp_service::DappStorage;
|
|
831
831
|
use ${s}::dapp_key;
|
|
832
|
-
use ${s}::dapp_key::DappKey;${j}${
|
|
832
|
+
use ${s}::dapp_key::DappKey;${j}${P}
|
|
833
833
|
|
|
834
834
|
// \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
835
|
${I}
|
|
@@ -855,7 +855,7 @@ ${p.join(`
|
|
|
855
855
|
`)}
|
|
856
856
|
|
|
857
857
|
// \u2500\u2500\u2500 acceptsFrom: cross-storage transfer functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
858
|
-
${
|
|
858
|
+
${g.join(`
|
|
859
859
|
`)}
|
|
860
860
|
|
|
861
861
|
// \u2500\u2500\u2500 Lifecycle entry functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
@@ -880,8 +880,8 @@ ${f}
|
|
|
880
880
|
);
|
|
881
881
|
}
|
|
882
882
|
}
|
|
883
|
-
`;await A(y,
|
|
884
|
-
\u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=
|
|
883
|
+
`;await A(y,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 Pe(e,t){if(!e.permits||Object.keys(e.permits).length===0)return;console.log(`
|
|
884
|
+
\u{1F4E6} Starting Scene Permit Generation...`);let s=e.name;for(let n of Object.keys(e.permits)){console.log(` \u2514\u2500 ${n}`);let r=dt(n),o=`b"${n}"`,d=`dubhe::dapp_service::ScenePermit<${r}>`,l=`module ${s}::${n} {
|
|
885
885
|
use dubhe::dapp_service::{Self, DappStorage};
|
|
886
886
|
use ${s}::dapp_key;
|
|
887
887
|
use ${s}::dapp_key::DappKey;
|
|
@@ -998,53 +998,53 @@ ${f}
|
|
|
998
998
|
);
|
|
999
999
|
}
|
|
1000
1000
|
}
|
|
1001
|
-
`;await A(l,
|
|
1002
|
-
public fun get_${u}(storage: &${r}): ${
|
|
1003
|
-
dubhe::dapp_system::get_scene_field<${n}, ${
|
|
1001
|
+
`;await A(l,pt.join(t,`${n}.move`),"formatAndWriteMove")}}import lt from"node:path";function Y(e){return e.split("_").map(t=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function $t(e){return e==="string"||e==="String"?"String":e}function X(e){return`dubhe::dapp_service::SceneStorage<${e}>`}function q(e,t){if(t.authorization.kind==="permit")return`${e.name}::${t.authorization.permit}::${Y(t.authorization.permit)}`}function Z(e,t){if(t.authorization.kind==="permit")return`dubhe::dapp_service::ScenePermit<${q(e,t)}>`}function gt(e,t,s){let n=Y(t),r=X(n),o=q(e,s),d=Z(e,s),l=[];for(let[u,_]of Object.entries(s.fields)){let $=$t(_);s.authorization.kind==="permit"&&o&&d?l.push(`
|
|
1002
|
+
public fun get_${u}(storage: &${r}): ${$} {
|
|
1003
|
+
dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
|
|
1004
1004
|
}
|
|
1005
1005
|
|
|
1006
1006
|
public(package) fun set_${u}(
|
|
1007
1007
|
permit: &${d},
|
|
1008
1008
|
storage: &mut ${r},
|
|
1009
|
-
value: ${
|
|
1009
|
+
value: ${$},
|
|
1010
1010
|
ctx: &TxContext,
|
|
1011
1011
|
) {
|
|
1012
|
-
dubhe::dapp_system::set_scene_field<DappKey, ${o}, ${n}, ${
|
|
1012
|
+
dubhe::dapp_system::set_scene_field<DappKey, ${o}, ${n}, ${$}>(
|
|
1013
1013
|
dapp_key::new(), permit, storage, b"${u}", value, ctx
|
|
1014
1014
|
);
|
|
1015
1015
|
}
|
|
1016
1016
|
|
|
1017
|
-
public(package) fun remove_${u}_system_maintenance(storage: &mut ${r}): ${
|
|
1018
|
-
dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${
|
|
1017
|
+
public(package) fun remove_${u}_system_maintenance(storage: &mut ${r}): ${$} {
|
|
1018
|
+
dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${$}>(
|
|
1019
1019
|
dapp_key::new(), storage, b"${u}"
|
|
1020
1020
|
)
|
|
1021
1021
|
}`):l.push(`
|
|
1022
|
-
public fun get_${u}(storage: &${r}): ${
|
|
1023
|
-
dubhe::dapp_system::get_scene_field<${n}, ${
|
|
1022
|
+
public fun get_${u}(storage: &${r}): ${$} {
|
|
1023
|
+
dubhe::dapp_system::get_scene_field<${n}, ${$}>(storage, b"${u}")
|
|
1024
1024
|
}
|
|
1025
1025
|
|
|
1026
|
-
public(package) fun set_${u}(storage: &mut ${r}, value: ${
|
|
1027
|
-
dubhe::dapp_system::set_scene_field_system<DappKey, ${n}, ${
|
|
1026
|
+
public(package) fun set_${u}(storage: &mut ${r}, value: ${$}) {
|
|
1027
|
+
dubhe::dapp_system::set_scene_field_system<DappKey, ${n}, ${$}>(
|
|
1028
1028
|
dapp_key::new(), storage, b"${u}", value
|
|
1029
1029
|
);
|
|
1030
1030
|
}
|
|
1031
1031
|
|
|
1032
|
-
public(package) fun remove_${u}(storage: &mut ${r}): ${
|
|
1033
|
-
dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${
|
|
1032
|
+
public(package) fun remove_${u}(storage: &mut ${r}): ${$} {
|
|
1033
|
+
dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${n}, ${$}>(
|
|
1034
1034
|
dapp_key::new(), storage, b"${u}"
|
|
1035
1035
|
)
|
|
1036
1036
|
}`)}return l.join(`
|
|
1037
|
-
`)}function N(e,t){let s=
|
|
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 de(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}
|
|
1043
|
-
);`}function
|
|
1043
|
+
);`}function _t(e,t,s,n,r){let o=q(e,t);return t.authorization.kind==="permit"&&o?`dubhe::dapp_system::remove_scene_field<DappKey, ${o}, ${s}, ${n}>(
|
|
1044
1044
|
dapp_key::new(), permit, storage, ${r}, ctx
|
|
1045
1045
|
)`:`dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${s}, ${n}>(
|
|
1046
1046
|
dapp_key::new(), storage, ${r}
|
|
1047
|
-
)`}function
|
|
1047
|
+
)`}function mt(e,t,s,n){let r=Y(t),o=X(r);return`
|
|
1048
1048
|
public fun get_${n}(storage: &${o}): u64 {
|
|
1049
1049
|
if (dubhe::dapp_system::has_scene_field<${r}, u64>(storage, b"${n}")) {
|
|
1050
1050
|
dubhe::dapp_system::get_scene_field<${r}, u64>(storage, b"${n}")
|
|
@@ -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
|
+
${de(e,s,r,"u64",`b"${n}"`,"current + amount")}
|
|
1060
1060
|
}
|
|
1061
1061
|
|
|
1062
1062
|
public(package) fun sub_${n}(
|
|
@@ -1065,8 +1065,8 @@ ${N(e,s)} storage: &mut ${o},
|
|
|
1065
1065
|
${ee(s)} ) {
|
|
1066
1066
|
let current = get_${n}(storage);
|
|
1067
1067
|
assert!(current >= amount, EInsufficientAmount);
|
|
1068
|
-
${
|
|
1069
|
-
}`}function
|
|
1068
|
+
${de(e,s,r,"u64",`b"${n}"`,"current - amount")}
|
|
1069
|
+
}`}function 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});
|
|
1072
1072
|
dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key)
|
|
@@ -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
|
+
${de(e,s,o,"vector<u8>","key","data")}
|
|
1088
1088
|
}
|
|
1089
1089
|
|
|
1090
1090
|
public(package) fun remove_${n}_data(
|
|
@@ -1093,29 +1093,29 @@ ${N(e,s)} storage: &mut ${d},
|
|
|
1093
1093
|
${ee(s)} ): vector<u8> {
|
|
1094
1094
|
let key = sui::bcs::to_bytes(&${r});
|
|
1095
1095
|
assert!(dubhe::dapp_system::has_scene_field<${o}, vector<u8>>(storage, key), EFieldNotFound);
|
|
1096
|
-
${
|
|
1097
|
-
}`}function
|
|
1096
|
+
${_t(e,s,o,"vector<u8>","key")}
|
|
1097
|
+
}`}function ft(e,t,s,n,r,o){let d=o.resources??{},l=o.objects??{},u=o.scenes??{},_=Y(t),$=X(_),p=[],c=[],g=Z(o,s),f=s.authorization.kind==="permit"&&g?` dest_permit: &${g},
|
|
1098
1098
|
`:"",C=s.authorization.kind==="permit"?"dest_permit, ":"",a=s.authorization.kind==="permit"?` ctx: &TxContext,
|
|
1099
|
-
`:"",m=s.authorization.kind==="permit"?", ctx":"";for(let h of r){let v=l[h]??u[h];if(!v)continue;let j=v.accepts??[],w=
|
|
1100
|
-
`:"",
|
|
1099
|
+
`:"",m=s.authorization.kind==="permit"?", ctx":"";for(let h of r){let v=l[h]??u[h];if(!v)continue;let j=v.accepts??[],w=Y(h);p.push(` use ${e}::${h};`);let F=!!u[h],D=`${e}::${h}::${w}`,E=F?`dubhe::dapp_service::SceneStorage<${D}>`:`dubhe::dapp_service::ObjectStorage<${D}>`,S=F?v:void 0,x=S?Z(o,S):void 0,I=S?.authorization.kind==="permit"&&x?` source_permit: &${x},
|
|
1100
|
+
`:"",P=S?.authorization.kind==="permit"?"source_permit, ":"",i=S?.authorization.kind==="permit"?", ctx":"",y=j.filter(k=>n.includes(k));for(let k of y){let T=d[k];if(!T||typeof T=="string")continue;let M=T;if(!M.fungible&&M.keys?.length){let b=M.keys[0];c.push(`
|
|
1101
1101
|
public(package) fun transfer_${h}_to_${t}_${k}(
|
|
1102
1102
|
${I}${f} from: &mut ${E},
|
|
1103
|
-
to: &mut ${
|
|
1103
|
+
to: &mut ${$},
|
|
1104
1104
|
${b}: u64,
|
|
1105
1105
|
${a} ) {
|
|
1106
|
-
let data = ${h}::remove_${k}_data(${
|
|
1106
|
+
let data = ${h}::remove_${k}_data(${P}from, ${b}${i});
|
|
1107
1107
|
set_${k}_data(${C}to, ${b}, data${m});
|
|
1108
1108
|
}`)}else c.push(`
|
|
1109
1109
|
public(package) fun transfer_${h}_to_${t}_${k}(
|
|
1110
1110
|
${I}${f} from: &mut ${E},
|
|
1111
|
-
to: &mut ${
|
|
1111
|
+
to: &mut ${$},
|
|
1112
1112
|
amount: u64,
|
|
1113
1113
|
${a} ) {
|
|
1114
|
-
${h}::sub_${k}(${
|
|
1114
|
+
${h}::sub_${k}(${P}from, amount${i});
|
|
1115
1115
|
add_${k}(${C}to, amount${m});
|
|
1116
|
-
}`)}}return{imports:p,functions:c}}async function
|
|
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=
|
|
1118
|
-
use std::ascii::String;`:"",m
|
|
1116
|
+
}`)}}return{imports:p,functions:c}}async function Le(e,t){if(!e.scenes||Object.keys(e.scenes).length===0)return;console.log(`
|
|
1117
|
+
\u{1F4E6} Starting Scene Storage Generation...`);let s=e.name,n=e.resources??{};for(let[r,o]of Object.entries(e.scenes)){console.log(` \u2514\u2500 ${r}`);let d=Y(r),l=`b"${r}"`,u=X(d),_=gt(e,r,o),$=o.accepts??[],p=[];for(let S of $){let x=n[S];if(!x||typeof x=="string")continue;let I=x;!I.fungible&&I.keys?.length?p.push(bt(e,r,o,S,I.keys[0])):p.push(mt(e,r,o,S))}let{imports:c,functions:g}=ft(s,r,o,$,o.acceptsFrom??[],e),a=Object.values(o.fields).some(S=>S==="string"||S==="String"||S==="vector<String>")?`
|
|
1118
|
+
use std::ascii::String;`:"",m=$.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.keys?.length&&!x.fungible}),h=$.some(S=>{let x=n[S];return!x||typeof x=="string"?!1:!!x.fungible}),v=[m?` #[error]
|
|
1119
1119
|
const EFieldNotFound: vector<u8> = b"Field not found";`:"",h?` #[error]
|
|
1120
1120
|
const EInsufficientAmount: vector<u8> = b"Insufficient amount";`:"",m?` #[error]
|
|
1121
1121
|
const EDuplicateItemId: vector<u8> = b"Duplicate item id";`:""].filter(Boolean).join(`
|
|
@@ -1124,13 +1124,13 @@ ${a} ) {
|
|
|
1124
1124
|
${v}
|
|
1125
1125
|
`:"",w=c.length>0?`
|
|
1126
1126
|
`+c.join(`
|
|
1127
|
-
`):"",F=
|
|
1127
|
+
`):"",F=Z(e,o),D=o.authorization.kind==="permit"&&F?`
|
|
1128
1128
|
public(package) fun new_${r}_with_permit(
|
|
1129
1129
|
dapp_storage: &DappStorage,
|
|
1130
1130
|
permit: &${F},
|
|
1131
1131
|
ctx: &mut TxContext,
|
|
1132
1132
|
): ${u} {
|
|
1133
|
-
dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${
|
|
1133
|
+
dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${q(e,o)}, ${d}>(
|
|
1134
1134
|
dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
|
|
1135
1135
|
)
|
|
1136
1136
|
}
|
|
@@ -1140,7 +1140,7 @@ ${v}
|
|
|
1140
1140
|
permit: &${F},
|
|
1141
1141
|
ctx: &mut TxContext,
|
|
1142
1142
|
) {
|
|
1143
|
-
dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${
|
|
1143
|
+
dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${q(e,o)}, ${d}>(
|
|
1144
1144
|
dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx
|
|
1145
1145
|
);
|
|
1146
1146
|
}`:`
|
|
@@ -1178,7 +1178,7 @@ ${p.join(`
|
|
|
1178
1178
|
`)}
|
|
1179
1179
|
|
|
1180
1180
|
// \u2500\u2500\u2500 acceptsFrom: cross-storage transfer functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
1181
|
-
${
|
|
1181
|
+
${g.join(`
|
|
1182
1182
|
`)}
|
|
1183
1183
|
|
|
1184
1184
|
// \u2500\u2500\u2500 SceneStorage lifecycle wrappers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
@@ -1196,7 +1196,7 @@ ${D}
|
|
|
1196
1196
|
);
|
|
1197
1197
|
}
|
|
1198
1198
|
}
|
|
1199
|
-
`;await A(E,
|
|
1199
|
+
`;await A(E,lt.join(t,`${r}.move`),"formatAndWriteMove")}}async function Re(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{existsSync as
|
|
1216
|
+
`;await A(s,t,"formatAndWriteMove")}import ze from"chalk";import{existsSync as yt,readFileSync as ht,writeFileSync as Be}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 He(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]=He(o);let n={};for(let[r,o]of Object.entries(e.scenes??{}))n[r]=He(o);return{version:1,resources:t,objects:s,scenes:n}}function le(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 R from"node:path";async 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 We(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(ze.yellow("[dubhe]")+` Could not parse ${ze.bold(s)}, skipping break-check.`),Be(s,JSON.stringify(n,null,2)+`
|
|
1225
|
+
`,"utf-8");return}le("resources",r.resources??{},n.resources),le("objects",r.objects??{},n.objects),le("scenes",r.scenes??{},n.scenes)}Be(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 Ye(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"}`),Ye(t),We(e,t),console.log(e);let r=R.join(e,"src",t.name);V(`${r}`)&&ae(`${r}/sources/codegen`),V(`${r}/Move.toml`)||await ye(t,e);let o=R.join(r,"sources","codegen","genesis.move");V(o)||await Te(t,o,n);let d=R.join(r,"sources","codegen","init_test.move");V(d)||await je(t,d);let l=R.join(r,"sources","codegen","dapp_key.move");V(l)||await Se(t,l);let u=R.join(r,"sources","scripts","deploy_hook.move");V(u)||await ve(t,u,n);let _=R.join(r,"sources","codegen","resources");await Me(t,_);let $=R.join(r,"sources","codegen","objects");await Ue(t,$);let p=R.join(r,"sources","codegen","permits");await Pe(t,p);let c=R.join(r,"sources","codegen","scenes");await Le(t,c);let g=R.join(r,"sources","codegen","enums");V(g)||await Ee(t,g),t.errors&&await De(t.name,t.errors,e);let f=R.join(r,"sources","codegen","user_storage_init.move");await Re(t,f),await we(t,e),await ke(t,e),console.log(`
|
|
1228
1228
|
\u2705 Code Generation Complete!
|
|
1229
|
-
`)}var
|
|
1229
|
+
`)}var Zs=xt;var Qs=e=>e;import{findUp as Ct}from"find-up";import $e from"path";import wt from"esbuild";var se=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"],ge="dubhe.config.example.mjs";async function cr(e){e=await Ve(e);try{return await wt.build({entryPoints:[e],format:"esm",outfile:ge,platform:"node",bundle:!0,packages:"external"}),e=await Ve(ge,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{Dt(ge,{force:!0})}}async function Ve(e,t){return e===void 0?e=await Et():$e.isAbsolute(e)||(e=$e.join(process.cwd(),e),e=$e.normalize(e)),t&&Tt.platform()==="win32"?jt(e).href:e}async function Et(){let e=await Ct(At);if(e===void 0)throw new se;return e}var Ot=(s=>(s.Event="event",s.Schema="schema",s))(Ot||{});export{Ot as SubscriptionKind,We as checkAndUpdateLock,xt as codegen,Qs as defineConfig,A as formatAndWriteMove,It as formatMove,Ue as generateObjects,Le as generateScenes,cr as loadConfig,Zs as schemaGen};
|
|
1230
1230
|
//# sourceMappingURL=index.js.map
|