@0xobelisk/sui-common 0.5.19 → 0.5.20

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.d.ts CHANGED
@@ -17,16 +17,17 @@ declare function formatAndWriteTypescript(output: string, fullOutputPath: string
17
17
  */
18
18
  declare function posixPath(path: string): string;
19
19
 
20
- type BaseType = "String" | "vector<String>" | "address" | "bool" | "u8" | "u64" | "u128" | "vector<address>" | "vector<bool>" | "vector<u8>" | "vector<vector<u8>>" | "vector<u64>" | "vector<u128>" | string;
20
+ type BaseType = "String" | "vector<String>" | "address" | "bool" | "u8" | "u32" | "u64" | "u128" | "vector<address>" | "vector<bool>" | "vector<u8>" | "vector<vector<u8>>" | "vector<u32>" | "vector<u64>" | "vector<u128>" | string;
21
21
  type StorageDataType = "Struct" | "Enum";
22
22
  type StorageMapType = "Map" | "Bag" | "Table";
23
23
  type Address = string;
24
24
  type Bool = boolean;
25
25
  type U8 = number;
26
+ type U32 = number;
26
27
  type U64 = number;
27
28
  type U128 = number;
28
29
  type Vector<T> = T[];
29
- type BaseValueType = String | Address | Bool | U8 | U64 | U128 | Vector<Address> | Vector<Bool> | Vector<U8> | Vector<Vector<U8>> | Vector<U64> | Vector<U128>;
30
+ type BaseValueType = String | Address | Bool | U8 | U32 | U64 | U128 | Vector<Address> | Vector<Bool> | Vector<U8> | Vector<Vector<U8>> | Vector<U64> | Vector<U128>;
30
31
  type SchemaData = {
31
32
  name: string;
32
33
  type?: StorageDataType;
@@ -35,14 +36,15 @@ type SchemaData = {
35
36
  type SchemaType = {
36
37
  data?: SchemaData[];
37
38
  structure: Record<string, string>;
39
+ events?: SchemaData[];
38
40
  };
39
41
  type DubheConfig = {
40
42
  name: string;
41
43
  description: string;
42
- systems: string[];
43
44
  schemas: Record<string, SchemaType>;
45
+ migration_enabled: boolean;
44
46
  };
45
- type MoveType = "string" | "vector<string>" | "String" | "vector<String>" | "address" | "bool" | "u8" | "u64" | "u128" | "vector<address>" | "vector<bool>" | "vector<u8>" | "vector<vector<u8>>" | "vector<u64>" | "vector<u128>";
47
+ type MoveType = "string" | "vector<string>" | "String" | "vector<String>" | "address" | "bool" | "u8" | "u32" | "u64" | "u128" | "vector<address>" | "vector<bool>" | "vector<u8>" | "vector<vector<u8>>" | "vector<u32>" | "vector<u64>" | "vector<u128>";
46
48
 
47
49
  declare function schemaGen(config: DubheConfig, srcPrefix?: string, network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet', frameworkId?: string): Promise<void>;
48
50
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import S from"prettier";import B from"prettier-plugin-move-js";async function A(e,t){let o;t&&(o=await S.resolveConfig(t));try{return S.format(e,{plugins:[B],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...o})}catch(r){let s;return r instanceof Error?s=r.message:s=r,console.log(`Error during output formatting: ${s}`),e}}async function C(e){return S.format(e,{parser:"typescript"})}import _ from"node:fs/promises";import j from"node:path";import M from"debug";var b=M("dubhe:common"),H=M("dubhe:common");b.log=console.debug.bind(console);H.log=console.error.bind(console);var y=b.extend("codegen"),z=b.extend("codegen");y.log=console.debug.bind(console);z.log=console.error.bind(console);async function m(e,t,o){let r=await A(e),s=` // Copyright (c) Obelisk Labs, Inc.
1
+ import w from"prettier";import X from"prettier-plugin-move-js";async function T(e,t){let r;t&&(r=await w.resolveConfig(t));try{return w.format(e,{plugins:[X],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...r})}catch(o){let s;return o instanceof Error?s=o.message:s=o,console.log(`Error during output formatting: ${s}`),e}}async function M(e){return w.format(e,{parser:"typescript"})}import S from"node:fs/promises";import W from"node:path";import j from"debug";var _=j("dubhe:common"),Y=j("dubhe:common");_.log=console.debug.bind(console);Y.log=console.error.bind(console);var y=_.extend("codegen"),q=_.extend("codegen");y.log=console.debug.bind(console);q.log=console.error.bind(console);async function m(e,t,r){let o=await T(e),s=` // Copyright (c) Obelisk Labs, Inc.
2
2
  // SPDX-License-Identifier: MIT
3
3
  #[allow(unused_use)]
4
4
 
@@ -6,184 +6,198 @@ import S from"prettier";import B from"prettier-plugin-move-js";async function A(
6
6
 
7
7
  `,n=`#[allow(lint(share_owned))]
8
8
 
9
- `,i=s+r;t.includes(".toml")||t.includes("system")?i=r:t.includes("deploy_hook")&&(i=n+r),await _.mkdir(j.dirname(t),{recursive:!0}),await _.writeFile(t,i),y(`${o}: ${t}`)}async function be(e,t,o){let r=await C(e);await _.mkdir(j.dirname(t),{recursive:!0}),await _.writeFile(t,r),y(`${o}: ${t}`)}function _e(e){return e.replace(/\\/g,"/")}import{existsSync as w}from"fs";import l from"fs";function v(e){l.existsSync(e)&&(l.readdirSync(e).forEach(t=>{let o=`${e}/${t}`;l.lstatSync(o).isDirectory()?v(o):l.unlinkSync(o)}),l.rmdirSync(e))}function T(e){return Object.entries(e).map(([t,o])=>`${t}`).join(",")}function W(e){return`(${Object.entries(e).map(([t,o])=>`${o}`)})`}function d(e){return Object.entries(e).map(([t,o])=>`${t}: ${o}`)}function G(e){return Object.entries(e).map(([t,o])=>`self.${t}`)}import{existsSync as N}from"fs";async function O(e,t){console.log(`
10
- \u2699\uFE0F Starting System Generation...`),e.systems.map(async o=>{if(console.log(` \u251C\u2500 Generating system: ${o}`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/system/${o}.move`),!N(`${t}/contracts/${e.name}/sources/system/${o}.move`)){let r=`module ${e.name}::${o}_system {
11
-
12
- }
13
- `;await m(r,`${t}/contracts/${e.name}/sources/system/${o}.move`,"formatAndWriteMove")}}),console.log(`\u2705 System Generation Complete
14
- `)}async function R(e,t,o){console.log(`
15
- \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let r=`[package]
9
+ `,p=s+o;t.includes(".toml")||t.includes("system")||t.includes("migrate")?p=o:t.includes("deploy_hook")&&(p=n+o),await S.mkdir(W.dirname(t),{recursive:!0}),await S.writeFile(t,p),y(`${r}: ${t}`)}async function ve(e,t,r){let o=await M(e);await S.mkdir(W.dirname(t),{recursive:!0}),await S.writeFile(t,o),y(`${r}: ${t}`)}function ke(e){return e.replace(/\\/g,"/")}import{existsSync as A}from"fs";import g from"fs";function k(e){g.existsSync(e)&&(g.readdirSync(e).forEach(t=>{let r=`${e}/${t}`;g.lstatSync(r).isDirectory()?k(r):g.unlinkSync(r)}),g.rmdirSync(e))}function f(e){return Object.entries(e).map(([t,r])=>`${t}`).join(",")}function G(e){return`(${Object.entries(e).map(([t,r])=>`${r}`)})`}function l(e){return Object.entries(e).map(([t,r])=>`${t}: ${r}`)}function R(e){return Object.entries(e).map(([t,r])=>`self.${t}`)}async function H(e,t,r){console.log(`
10
+ \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let o=`[package]
16
11
  name = "${e.name}"
17
12
  version = "0.0.1"
18
13
  edition = "2024.beta"
19
14
 
20
15
  [dependencies]
21
16
  Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.36.2" }
22
- Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "packages/dubhe-framework", rev = "main" }
17
+ Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "release-dubhe-v1.0.0-rc1" }
23
18
 
24
19
  [addresses]
25
20
  sui = "0x2"
26
- dubhe = "${o}"
21
+ dubhe = "${r}"
27
22
  ${e.name} = "0x0"
28
- `;await m(r,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
29
- `)}function p(e){return e.split("_").map((t,o)=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Q(e,t){return Object.entries(t).map(([o,r])=>`public(package) fun set_${o}(self: &mut ${e}, ${o}: ${r}) {
30
- self.${o} = ${o};
23
+ `;await m(o,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
24
+ `)}function u(e){return e.split("_").map((t,r)=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function J(e,t){return Object.entries(t).map(([r,o])=>`public(package) fun set_${r}(self: &mut ${e}, ${r}: ${o}) {
25
+ self.${r} = ${r};
31
26
  }`).join(`
32
- `)}function X(e,t){return`public(package) fun set(self: &mut ${e}, ${d(t)}) {
33
- ${Object.entries(t).map(([o])=>`self.${o} = ${o};`).join(`
27
+ `)}function P(e,t){return`public(package) fun set(self: &mut ${e}, ${l(t)}) {
28
+ ${Object.entries(t).map(([r])=>`self.${r} = ${r};`).join(`
34
29
  `)}
35
- }`}function Y(e,t){return`public fun get(self: &${e}): ${W(t)} {
36
- (${G(t)})
37
- }`}function Z(e,t){return Object.entries(t).map(([o,r])=>`public fun get_${o}(self: &${e}): ${r} {
38
- self.${o}
30
+ }`}function ee(e,t){return`public fun get(self: &${e}): ${G(t)} {
31
+ (${R(t)})
32
+ }`}function te(e,t){return Object.entries(t).map(([r,o])=>`public fun get_${r}(self: &${e}): ${o} {
33
+ self.${r}
39
34
  }`).join(`
40
- `)}function u(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function E(e,t,o){console.log(`
41
- \u{1F4E6} Starting Schema Data Generation...`);for(let r in t){let s=t[r];if(s.data){console.log(` \u251C\u2500 Processing schema: ${r}`);for(let n of s.data){console.log(` \u2514\u2500 Generating ${n.name} ${Array.isArray(n.fields)?"(enum)":"(struct)"}`);let i="",c=s.data.filter(a=>Array.isArray(a.fields)).map(a=>a.name);Array.isArray(n.fields)?i=`module ${e}::${r}_${u(n.name)} {
35
+ `)}function d(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function O(e,t,r){console.log(`
36
+ \u{1F4E6} Starting Schema Data Generation...`);for(let o in t){let s=t[o];if(s.data){console.log(` \u251C\u2500 Processing schema: ${o}`);for(let n of s.data){console.log(` \u2514\u2500 Generating ${n.name} ${Array.isArray(n.fields)?"(enum)":"(struct)"}`);let p="",i=s.data.filter(a=>Array.isArray(a.fields)).map(a=>a.name);Array.isArray(n.fields)?p=`module ${e}::${o}_${d(n.name)} {
42
37
  public enum ${n.name} has copy, drop , store {
43
38
  ${n.fields}
44
39
  }
45
40
 
46
- ${n.fields.map(a=>`public fun new_${u(a)}(): ${n.name} {
41
+ ${n.fields.map(a=>`public fun new_${d(a)}(): ${n.name} {
47
42
  ${n.name}::${a}
48
- }`).join("")}`:i=`module ${e}::${r}_${u(n.name)} {
43
+ }`).join("")}`:p=`module ${e}::${o}_${d(n.name)} {
49
44
  use std::ascii::String;
50
- ${c.map(a=>`use ${e}::${r}_${u(a)}::${a};`).join(`
45
+ ${i.map(a=>`use ${e}::${o}_${d(a)}::${a};`).join(`
51
46
  `)}
52
47
 
53
48
  public struct ${n.name} has copy, drop , store {
54
- ${d(n.fields)}
49
+ ${l(n.fields)}
55
50
  }
56
51
 
57
- public fun new(${d(n.fields)}): ${n.name} {
52
+ public fun new(${l(n.fields)}): ${n.name} {
58
53
  ${n.name} {
59
- ${T(n.fields)}
54
+ ${f(n.fields)}
60
55
  }
61
56
  }
62
57
 
63
- ${Y(n.name,n.fields)}
64
- ${Z(n.name,n.fields)}
65
- ${Q(n.name,n.fields)}
66
- ${X(n.name,n.fields)}
67
- }`,await m(i,`${o}/contracts/${e}/sources/codegen/schemas/${r}_${u(n.name)}.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Data Generation Complete
68
- `)}function q(e,t,o){return o.data?o.data.map(r=>`use ${e}::${t}_${u(r.name)}::${r.name};`).join(`
69
- `):""}async function F(e,t,o){console.log(`
70
- \u{1F528} Starting Schema Structure Generation...`);for(let r in t){console.log(` \u251C\u2500 Generating schema: ${r}`),console.log(` \u251C\u2500 Output path: ${o}/contracts/${e}/sources/codegen/schemas/${r}.move`),console.log(` \u2514\u2500 Structure fields: ${Object.keys(t[r].structure).length}`);let s=t[r],n=`module ${e}::${r}_schema {
58
+ ${ee(n.name,n.fields)}
59
+ ${te(n.name,n.fields)}
60
+ ${J(n.name,n.fields)}
61
+ ${P(n.name,n.fields)}
62
+ }`,await m(p,`${r}/contracts/${e}/sources/codegen/schemas/${o}_${d(n.name)}.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Data Generation Complete
63
+ `)}function re(e,t,r){return r.data?r.data.map(o=>`use ${e}::${t}_${d(o.name)}::${o.name};`).join(`
64
+ `):""}async function z(e,t,r,o){console.log(`
65
+ \u{1F528} Starting Schema Structure Generation...`);for(let s in t){console.log(` \u251C\u2500 Generating schema: ${s}`),console.log(` \u251C\u2500 Output path: ${r}/contracts/${e}/sources/codegen/schemas/${s}.move`),console.log(` \u2514\u2500 Structure fields: ${Object.keys(t[s].structure).length}`);let n=t[s],p=`module ${e}::${s}_schema {
71
66
  use std::ascii::String;
67
+ use std::ascii::string;
68
+ use sui::package::UpgradeCap;
72
69
  use std::type_name;
73
70
  use dubhe::dapps_system;
71
+ use dubhe::storage_migrate;
74
72
  use dubhe::dapps_schema::Dapps;
75
73
  use dubhe::storage_value::{Self, StorageValue};
76
74
  use dubhe::storage_map::{Self, StorageMap};
77
75
  use dubhe::storage_double_map::{Self, StorageDoubleMap};
78
76
  use ${e}::dapp_key::DappKey;
79
- ${q(e,r,s)}
77
+ use sui::dynamic_field as df;
78
+ ${re(e,s,n)}
80
79
 
81
- public struct ${p(r)} has key, store {
82
- id: UID,
83
- ${d(s.structure)}
84
- }
80
+ public struct ${u(s)} has key, store {
81
+ id: UID
82
+ }
85
83
 
86
- ${Object.entries(s.structure).map(([i,c])=>`public fun borrow_${i}(self: &${p(r)}) : &${c} {
87
- &self.${i}
84
+ ${Object.entries(n.structure).map(([i,a])=>`public fun borrow_${i}(self: &${u(s)}) : &${a} {
85
+ storage_migrate::borrow_field(&self.id, b"${i}")
88
86
  }
89
87
 
90
- public(package) fun borrow_mut_${i}(self: &mut ${p(r)}): &mut ${c} {
91
- &mut self.${i}
88
+ public(package) fun borrow_mut_${i}(self: &mut ${u(s)}): &mut ${a} {
89
+ storage_migrate::borrow_mut_field(&mut self.id, b"${i}")
92
90
  }
93
91
  `).join("")}
94
92
 
95
93
 
96
- public fun register(dapps: &mut Dapps, ctx: &mut TxContext): ${p(r)} {
97
- let package_id = dapps_system::current_package_id<DappKey>();
98
- assert!(dapps.borrow_metadata().contains_key(package_id), 0);
99
- assert!(dapps.borrow_admin().get(package_id) == ctx.sender(), 0);
100
- let schema = type_name::get<${p(r)}>().into_string();
101
- assert!(!dapps.borrow_schemas().get(package_id).contains(&schema), 0);
102
- dapps_system::add_schema<${p(r)}>(dapps, package_id, ctx);
103
- ${p(r)} {
104
- id: object::new(ctx),
105
- ${Object.entries(s.structure).map(([i,c])=>{let a="";return c.includes("StorageValue")?a="storage_value::new()":c.includes("StorageMap")?a="storage_map::new()":c.includes("StorageDoubleMap")&&(a="storage_double_map::new()"),`${i}: ${a},`}).join(" ")}
106
- }
94
+ public(package) fun create(ctx: &mut TxContext): ${u(s)} {
95
+ let mut id = object::new(ctx);
96
+ ${Object.entries(n.structure).map(([i,a])=>{let c="";return a.includes("StorageValue")?c="storage_value::new()":a.includes("StorageMap")?c="storage_map::new()":a.includes("StorageDoubleMap")&&(c="storage_double_map::new()"),`storage_migrate::add_field<${a}>(&mut id, b"${i}", ${c});`}).join("")}
97
+
98
+ ${u(s)} { id }
107
99
  }
108
100
 
101
+ ${o?`public fun migrate(_${s}: &mut ${u(s)}, _cap: &UpgradeCap) { }`:""}
109
102
 
103
+
110
104
  // ======================================== View Functions ========================================
111
- ${Object.entries(s.structure).map(([i,c])=>{let a=c.match(/<(.+)>/)[1].split(",").map(L=>L.trim()),g=[],$="",f="",x="";return c.includes("StorageValue")?(g=[],$=`${a[0]}`,f="try_get()"):c.includes("StorageMap")?(g=[`key: ${a[0]}`],$=`${a[1]}`,f="try_get(key)",x=`public fun get_${i}_keys(self: &${p(r)}) : vector<${a[0]}> {
112
- self.${i}.keys()
105
+ ${Object.entries(n.structure).map(([i,a])=>{let c=a.match(/<(.+)>/)[1].split(",").map(Z=>Z.trim()),$=[],h="",b="",v="";return a.includes("StorageValue")?($=[],h=`${c[0]}`,b="try_get()"):a.includes("StorageMap")?($=[`key: ${c[0]}`],h=`${c[1]}`,b="try_get(key)",v=`public fun get_${i}_keys(self: &${u(s)}) : vector<${c[0]}> {
106
+ self.borrow_${i}().keys()
113
107
  }
114
108
 
115
- public fun get_${i}_values(self: &${p(r)}) : vector<${a[1]}> {
116
- self.${i}.values()
117
- }`):c.includes("StorageDoubleMap")&&(g=[`key1: ${a[0]}`,`key2: ${a[1]}`],$=`${a[2]}`,f="try_get(key1, key2)",x=`public fun get_${i}_keys(self: &${p(r)}) : (vector<${a[0]}>, vector<${a[1]}>) {
118
- self.${i}.keys()
109
+ public fun get_${i}_values(self: &${u(s)}) : vector<${c[1]}> {
110
+ self.borrow_${i}().values()
111
+ }`):a.includes("StorageDoubleMap")&&($=[`key1: ${c[0]}`,`key2: ${c[1]}`],h=`${c[2]}`,b="try_get(key1, key2)",v=`public fun get_${i}_keys(self: &${u(s)}) : (vector<${c[0]}>, vector<${c[1]}>) {
112
+ self.borrow_${i}().keys()
119
113
  }
120
114
 
121
- public fun get_${i}_values(self: &${p(r)}) : vector<${a[2]}> {
122
- self.${i}.values()
123
- }`),`public fun get_${i}(self: &${p(r)}, ${g}) : Option<${$}> {
124
- self.${i}.${f}
115
+ public fun get_${i}_values(self: &${u(s)}) : vector<${c[2]}> {
116
+ self.borrow_${i}().values()
117
+ }`),`public fun get_${i}(self: &${u(s)}, ${$}) : Option<${h}> {
118
+ self.borrow_${i}().${b}
125
119
  }
126
- `+x}).join("")}
120
+ `+v}).join("")}
127
121
  // =========================================================================================================
128
122
 
129
123
 
130
- }`;await m(n,`${o}/contracts/${e}/sources/codegen/schemas/${r}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Structure Generation Complete
131
- `)}import{existsSync as J}from"fs";async function K(e,t){if(console.log(`
132
- \u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/script/deploy_hook.move`),!J(`${t}/contracts/${e.name}/sources/script/deploy_hook.move`)){let o=`module ${e.name}::deploy_hook {
124
+ }`;await m(p,`${r}/contracts/${e}/sources/codegen/schemas/${s}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Structure Generation Complete
125
+ `)}import{existsSync as E}from"fs";async function U(e,t){if(console.log(`
126
+ \u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/script/deploy_hook.move`),!E(`${t}/contracts/${e.name}/sources/script/deploy_hook.move`)){let r=`module ${e.name}::deploy_hook {
133
127
  use dubhe::dapps_schema::Dapps;
134
128
  use dubhe::dapps_system;
135
- use ${e.name}::dapp_key::DappKey;
136
- use std::ascii;
129
+ use ${e.name}::schema_hub::SchemaHub;
130
+ use std::ascii::string;
137
131
  use sui::clock::Clock;
132
+ use sui::package::UpgradeCap;
138
133
  use sui::transfer::public_share_object;
139
- #[test_only]
140
- use dubhe::dapps_schema;
134
+ ${Object.keys(e.schemas).map(o=>`use ${e.name}::${o}_schema::${u(o)};`).join(`
135
+ `)}
141
136
  #[test_only]
142
137
  use sui::clock;
143
138
  #[test_only]
144
139
  use sui::test_scenario;
145
140
  #[test_only]
141
+ use sui::package;
142
+ #[test_only]
143
+ use ${e.name}::schema_hub;
144
+ #[test_only]
145
+ use dubhe::dapps_schema;
146
+ #[test_only]
146
147
  use sui::test_scenario::Scenario;
147
148
 
148
- public entry fun run(dapps: &mut Dapps, clock: &Clock, ctx: &mut TxContext) {
149
+ public entry fun run(schema_hub: &mut SchemaHub, dapps: &mut Dapps, cap: &UpgradeCap, clock: &Clock, ctx: &mut TxContext) {
149
150
  // Register the dapp to dubhe.
150
- dapps_system::register<DappKey>(
151
- dapps,
152
- ascii::string(b"${e.name}"),
153
- ascii::string(b"${e.description}"),
154
- clock,
155
- ctx
156
- );
157
- ${Object.keys(e.schemas).map(r=>`let ${r} = ${e.name}::${r}_schema::register(dapps, ctx);`).join(`
151
+ dapps_system::register(dapps,cap,string(b"${e.name}"),string(b"${e.description}"),clock,ctx);
152
+ // Create schemas
153
+ ${Object.keys(e.schemas).map(o=>`let ${o} = ${e.name}::${o}_schema::create(ctx);`).join(`
158
154
  `)}
159
155
  // Logic that needs to be automated once the contract is deployed
156
+
160
157
 
158
+
161
159
 
162
- // Share the dapp object with the public
163
- ${Object.keys(e.schemas).map(r=>`public_share_object(${r});`).join(`
160
+
161
+ // Authorize schemas and public share objects
162
+ ${Object.keys(e.schemas).map(o=>`
163
+ schema_hub.authorize_schema<${u(o)}>();
164
+ public_share_object(${o});
165
+ `).join(`
164
166
  `)}
165
167
  }
166
168
 
167
169
  #[test_only]
168
- public fun deploy_hook_for_testing(): (Scenario, Dapps) {
169
- let mut scenario = test_scenario::begin(@0xA);
170
- {
170
+ public fun deploy_hook_for_testing(): (Scenario, SchemaHub, Dapps) {
171
+ let mut scenario = test_scenario::begin(@0xA);
172
+ {
171
173
  let ctx = test_scenario::ctx(&mut scenario);
172
174
  dapps_schema::init_dapps_for_testing(ctx);
175
+ schema_hub::init_schema_hub_for_testing(ctx);
173
176
  test_scenario::next_tx(&mut scenario,@0xA);
174
177
  };
175
- let mut dapps = test_scenario::take_shared<Dapps>(&scenario);
176
- let ctx = test_scenario::ctx(&mut scenario);
177
- let clock = clock::create_for_testing(ctx);
178
- run(&mut dapps, &clock, ctx);
179
- clock::destroy_for_testing(clock);
180
- test_scenario::next_tx(&mut scenario,@0xA);
181
- (scenario, dapps)
178
+ let mut dapps = test_scenario::take_shared<Dapps>(&scenario);
179
+ let mut schema_hub = test_scenario::take_shared<SchemaHub>(&scenario);
180
+ let ctx = test_scenario::ctx(&mut scenario);
181
+ let clock = clock::create_for_testing(ctx);
182
+ let upgrade_cap = package::test_publish(@0x42.to_id(), ctx);
183
+ run(&mut schema_hub, &mut dapps, &upgrade_cap, &clock, ctx);
184
+
185
+ clock::destroy_for_testing(clock);
186
+ upgrade_cap.make_immutable();
187
+ test_scenario::next_tx(&mut scenario,@0xA);
188
+ (scenario, schema_hub, dapps)
182
189
  }
183
190
  }
184
- `;await m(o,`${t}/contracts/${e.name}/sources/script/deploy_hook.move`,"formatAndWriteMove")}console.log(`\u2705 Deploy Hook Generation Complete
185
- `)}async function I(e,t){console.log(`
186
- \u{1F511} Starting DappKey Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/codegen/dapp_key.move`);let o=`module ${e.name}::dapp_key {
191
+ `;await m(r,`${t}/contracts/${e.name}/sources/script/deploy_hook.move`,"formatAndWriteMove")}console.log(`\u2705 Deploy Hook Generation Complete
192
+ `)}async function F(e,t){if(!E(`${t}/contracts/${e.name}/sources/script/migrate.move`)){let r=`module ${e.name}::migrate {
193
+ const ON_CHAIN_VERSION: u32 = 0;
194
+
195
+ public fun on_chain_version(): u32 {
196
+ ON_CHAIN_VERSION
197
+ }
198
+ }
199
+ `;await m(r,`${t}/contracts/${e.name}/sources/script/migrate.move`,"formatAndWriteMove")}}async function L(e,t){console.log(`
200
+ \u{1F511} Starting DappKey Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/codegen/dapp_key.move`);let r=`module ${e.name}::dapp_key {
187
201
  /// Authorization token for the app.
188
202
  public struct DappKey has drop {}
189
203
 
@@ -191,9 +205,77 @@ ${e.name} = "0x0"
191
205
  DappKey { }
192
206
  }
193
207
  }
194
- `;await m(o,`${t}/contracts/${e.name}/sources/codegen/dapp_key.move`,"formatAndWriteMove"),console.log(`\u2705 DappKey Generation Complete
195
- `)}function U(e){switch(e){case"testnet":return"0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28";case"localnet":return"0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28";default:return"0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28"}}async function ze(e,t,o,r){console.log(`
196
- \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u251C\u2500 Name: ${e.name}`),console.log(` \u251C\u2500 Description: ${e.description||"No description provided"}`),console.log(` \u251C\u2500 Network: ${o||"testnet"}`),console.log(` \u2514\u2500 Framework ID: ${r||U(o??"testnet")}
197
- `);let s=t??process.cwd();r=r||U(o??"testnet"),w(`${s}/contracts/${e.name}`)&&v(`${s}/contracts/${e.name}/sources/codegen`),w(`${s}/contracts/${e.name}/Move.toml`)||await R(e,s,r),w(`${s}/contracts/${e.name}/sources/script/deploy_hook.move`)||await K(e,s),await O(e,s),await E(e.name,e.schemas,s),await F(e.name,e.schemas,s),await I(e,s),console.log(`\u2705 Schema Generation Process Complete!
198
- `)}import{findUp as P}from"find-up";import k from"path";import ee from"esbuild";var h=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as te}from"fs";import{pathToFileURL as re}from"url";import oe from"os";var ne=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],D="dubhe.config.example.mjs";async function tt(e){e=await V(e);try{return await ee.build({entryPoints:[e],format:"esm",outfile:D,platform:"node",bundle:!0,packages:"external"}),e=await V(D,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{te(D,{force:!0})}}async function V(e,t){return e===void 0?e=await se():k.isAbsolute(e)||(e=k.join(process.cwd(),e),e=k.normalize(e)),t&&oe.platform()==="win32"?re(e).href:e}async function se(){let e=await P(ne);if(e===void 0)throw new h;return e}export{m as formatAndWriteMove,be as formatAndWriteTypescript,A as formatMove,C as formatTypescript,tt as loadConfig,_e as posixPath,V as resolveConfigPath,ze as schemaGen};
208
+ `;await m(r,`${t}/contracts/${e.name}/sources/codegen/dapp_key.move`,"formatAndWriteMove"),console.log(`\u2705 DappKey Generation Complete
209
+ `)}function I(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function K(e,t,r){console.log(`
210
+ \u{1F4E6} Starting Schema Event Generation...`);for(let o in t){let s=t[o];if(s.events){console.log(` \u251C\u2500 Processing schema: ${o}`);for(let n of s.events){console.log(` \u2514\u2500 Generating ${n.name} ${Array.isArray(n.fields)?"(enum)":"(struct)"}`);let p=`module ${e}::${o}_${I(n.name)}_event {
211
+ use sui::event;
212
+ use std::ascii::String;
213
+ public struct ${n.name}Event has copy, drop {
214
+ ${l(n.fields)}
215
+ }
216
+
217
+ public fun new(${l(n.fields)}): ${n.name}Event {
218
+ ${n.name}Event {
219
+ ${f(n.fields)}
220
+ }
221
+ }
222
+
223
+ public fun emit(${l(n.fields)}) {
224
+ event::emit(${n.name}Event {
225
+ ${f(n.fields)}
226
+ });
227
+ }`;await m(p,`${r}/contracts/${e}/sources/codegen/events/${o}_${I(n.name)}_event.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Event Generation Complete
228
+ `)}import{existsSync as oe}from"fs";import se from"node:fs/promises";async function B(e,t){console.log(`
229
+ \u2699\uFE0F Starting System Generation...`),console.log(" \u251C\u2500 Generating systems"),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/systems`),oe(`${t}/contracts/${e.name}/sources/systems`)||await se.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0}),console.log(`\u2705 System Generation Complete
230
+ `)}async function V(e,t){console.log(`
231
+ \u{1F511} Starting DappKey Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/codegen/schema_hub.move`);let r=`module ${e.name}::schema_hub {
232
+ use sui::transfer::public_share_object;
233
+ use sui::dynamic_field as df;
234
+
235
+ public struct SchemaHub has key, store {
236
+ id: UID,
237
+ admin: address,
238
+ }
239
+
240
+ public struct SchemaTypeWapper<phantom Schema: key + store> has copy, store, drop {}
241
+
242
+ /// Authorize an schema to access protected features of the SchemaHub.
243
+ public(package) fun authorize_schema<Schema: key + store>(self: &mut SchemaHub) {
244
+ df::add(&mut self.id, SchemaTypeWapper<Schema> {}, true);
245
+ }
246
+
247
+ /// Deauthorize an schema by removing its authorization key.
248
+ public(package) fun deauthorize_schema<Schema: key + store>(self: &mut SchemaHub) {
249
+ df::remove<SchemaTypeWapper<Schema>, bool>(&mut self.id, SchemaTypeWapper<Schema> {});
250
+ }
251
+
252
+ /// Check if an schema is authorized to access protected features of
253
+ /// the SchemaHub.
254
+ public fun is_schema_authorized<Schema: key + store>(self: &SchemaHub): bool {
255
+ df::exists_(&self.id, SchemaTypeWapper<Schema> {})
256
+ }
257
+
258
+ /// Assert that an schema is authorized to access protected features of
259
+ /// the SchemaHub. Aborts with \`EAppNotAuthorized\` if not.
260
+ public fun ensure_schema_authorized<Schema: key + store>(self: &SchemaHub) {
261
+ assert!(self.is_schema_authorized<Schema>(), 0);
262
+ }
263
+
264
+ fun init(ctx: &mut TxContext) {
265
+ public_share_object(SchemaHub {
266
+ id: object::new(ctx),
267
+ admin: ctx.sender(),
268
+ });
269
+ }
270
+
271
+ #[test_only]
272
+ public fun init_schema_hub_for_testing(ctx: &mut TxContext) {
273
+ init(ctx);
274
+ }
275
+ }
276
+ `;await m(r,`${t}/contracts/${e.name}/sources/codegen/schema_hub.move`,"formatAndWriteMove"),console.log(`\u2705 DappKey Generation Complete
277
+ `)}function N(e){switch(e){case"testnet":return"0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6";case"localnet":return"0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6";default:return"0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6"}}async function at(e,t,r,o){console.log(`
278
+ \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u251C\u2500 Name: ${e.name}`),console.log(` \u251C\u2500 Description: ${e.description||"No description provided"}`),console.log(` \u251C\u2500 Network: ${r||"testnet"}`),console.log(` \u2514\u2500 Framework ID: ${o||N(r??"testnet")}
279
+ `);let s=t??process.cwd();o=o||N(r??"testnet"),A(`${s}/contracts/${e.name}`)&&k(`${s}/contracts/${e.name}/sources/codegen`),A(`${s}/contracts/${e.name}/Move.toml`)||await H(e,s,o),A(`${s}/contracts/${e.name}/sources/script/deploy_hook.move`)||await U(e,s),await O(e.name,e.schemas,s),await z(e.name,e.schemas,s,e.migration_enabled),await K(e.name,e.schemas,s),await L(e,s),await V(e,s),await B(e,s),e.migration_enabled&&await F(e,s),console.log(`\u2705 Schema Generation Process Complete!
280
+ `)}import{findUp as ne}from"find-up";import C from"path";import ae from"esbuild";var x=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as ie}from"fs";import{pathToFileURL as ce}from"url";import me from"os";var ue=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],D="dubhe.config.example.mjs";async function $t(e){e=await Q(e);try{return await ae.build({entryPoints:[e],format:"esm",outfile:D,platform:"node",bundle:!0,packages:"external"}),e=await Q(D,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{ie(D,{force:!0})}}async function Q(e,t){return e===void 0?e=await pe():C.isAbsolute(e)||(e=C.join(process.cwd(),e),e=C.normalize(e)),t&&me.platform()==="win32"?ce(e).href:e}async function pe(){let e=await ne(ue);if(e===void 0)throw new x;return e}export{m as formatAndWriteMove,ve as formatAndWriteTypescript,T as formatMove,M as formatTypescript,$t as loadConfig,ke as posixPath,Q as resolveConfigPath,at as schemaGen};
199
281
  //# sourceMappingURL=index.js.map