@0xobelisk/sui-common 0.5.21 → 0.5.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9,16 +9,15 @@ import v from"prettier";import Z from"prettier-plugin-move-js";async function D(
9
9
  `,a=n+r;t.includes(".toml")||t.includes("system")||t.includes("migrate")?a=r:t.includes("deploy_hook")&&(a=s+r),await y.mkdir(j.dirname(t),{recursive:!0}),await y.writeFile(t,a),_(`${o}: ${t}`)}async function xe(e,t,o){let r=await T(e);await y.mkdir(j.dirname(t),{recursive:!0}),await y.writeFile(t,r),_(`${o}: ${t}`)}function we(e){return e.replace(/\\/g,"/")}import{existsSync as k}from"fs";import d from"fs";function w(e){d.existsSync(e)&&(d.readdirSync(e).forEach(t=>{let o=`${e}/${t}`;d.lstatSync(o).isDirectory()?w(o):d.unlinkSync(o)}),d.rmdirSync(e))}function g(e){return Object.entries(e).map(([t,o])=>`${t}`).join(",")}function W(e){return`(${Object.entries(e).map(([t,o])=>`${o}`)})`}function p(e){return Object.entries(e).map(([t,o])=>`${t}: ${o}`)}function G(e){return Object.entries(e).map(([t,o])=>`self.${t}`)}async function R(e,t,o){console.log(`
10
10
  \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let r=`[package]
11
11
  name = "${e.name}"
12
- version = "0.0.1"
13
- edition = "2024.beta"
12
+ version = "1.0.0"
13
+ edition = "2024"
14
14
 
15
15
  [dependencies]
16
- Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.36.2" }
17
- Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "release-dubhe-v1.0.0-rc1" }
16
+ Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.38.3" }
17
+ Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "dubhe-testnet-v1.0.0" }
18
18
 
19
19
  [addresses]
20
20
  sui = "0x2"
21
- dubhe = "${o}"
22
21
  ${e.name} = "0x0"
23
22
  `;await m(r,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
24
23
  `)}function u(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}) {
@@ -123,13 +122,15 @@ ${e.name} = "0x0"
123
122
 
124
123
 
125
124
  }`;await m(s,`${o}/contracts/${e}/sources/codegen/schemas/${r}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Structure Generation Complete
126
- `)}import{existsSync as z}from"fs";async function E(e,t){if(console.log(`
127
- \u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/script/deploy_hook.move`),!z(`${t}/contracts/${e.name}/sources/script/deploy_hook.move`)){let o=`module ${e.name}::deploy_hook {
125
+ `)}import{existsSync as U}from"fs";async function z(e,t){if(console.log(`
126
+ \u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`),!U(`${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`)){let o=`module ${e.name}::deploy_hook {
128
127
  use dubhe::dapps_schema::Dapps;
129
128
  use dubhe::dapps_system;
130
129
  use ${e.name}::schema_hub::SchemaHub;
131
130
  use std::ascii::string;
132
131
  use sui::clock::Clock;
132
+ use sui::sui::SUI;
133
+ use sui::coin::Coin;
133
134
  use sui::package::UpgradeCap;
134
135
  use sui::transfer::public_share_object;
135
136
  ${Object.keys(e.schemas).map(r=>`use ${e.name}::${r}_schema::${u(r)};`).join(`
@@ -137,6 +138,8 @@ ${e.name} = "0x0"
137
138
  #[test_only]
138
139
  use sui::clock;
139
140
  #[test_only]
141
+ use sui::coin;
142
+ #[test_only]
140
143
  use sui::test_scenario;
141
144
  #[test_only]
142
145
  use sui::package;
@@ -147,9 +150,9 @@ ${e.name} = "0x0"
147
150
  #[test_only]
148
151
  use sui::test_scenario::Scenario;
149
152
 
150
- public entry fun run(schema_hub: &mut SchemaHub, dapps: &mut Dapps, cap: &UpgradeCap, clock: &Clock, ctx: &mut TxContext) {
153
+ public entry fun run(schema_hub: &mut SchemaHub, dapps: &mut Dapps, cap: &UpgradeCap, clock: &Clock, coin: Coin<SUI>, ctx: &mut TxContext) {
151
154
  // Register the dapp to dubhe.
152
- dapps_system::register(dapps,cap,string(b"${e.name}"),string(b"${e.description}"),clock,ctx);
155
+ dapps_system::register(dapps,cap,string(b"${e.name}"),string(b"${e.description}"),clock,coin,ctx);
153
156
  // Create schemas
154
157
  ${Object.keys(e.schemas).map(r=>`let ${r} = ${e.name}::${r}_schema::create(ctx);`).join(`
155
158
  `)}
@@ -181,7 +184,8 @@ ${e.name} = "0x0"
181
184
  let ctx = test_scenario::ctx(&mut scenario);
182
185
  let clock = clock::create_for_testing(ctx);
183
186
  let upgrade_cap = package::test_publish(@0x42.to_id(), ctx);
184
- run(&mut schema_hub, &mut dapps, &upgrade_cap, &clock, ctx);
187
+ let coin = coin::mint_for_testing<SUI>(1_000_000_000, ctx);
188
+ run(&mut schema_hub, &mut dapps, &upgrade_cap, &clock, coin, ctx);
185
189
 
186
190
  clock::destroy_for_testing(clock);
187
191
  upgrade_cap.make_immutable();
@@ -189,15 +193,15 @@ ${e.name} = "0x0"
189
193
  (scenario, schema_hub, dapps)
190
194
  }
191
195
  }
192
- `;await m(o,`${t}/contracts/${e.name}/sources/script/deploy_hook.move`,"formatAndWriteMove")}console.log(`\u2705 Deploy Hook Generation Complete
193
- `)}async function U(e,t){if(!z(`${t}/contracts/${e.name}/sources/script/migrate.move`)){let o=`module ${e.name}::migrate {
196
+ `;await m(o,`${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`,"formatAndWriteMove")}console.log(`\u2705 Deploy Hook Generation Complete
197
+ `)}async function E(e,t){if(!U(`${t}/contracts/${e.name}/sources/scripts/migrate.move`)){let o=`module ${e.name}::migrate {
194
198
  const ON_CHAIN_VERSION: u32 = 0;
195
199
 
196
200
  public fun on_chain_version(): u32 {
197
201
  ON_CHAIN_VERSION
198
202
  }
199
203
  }
200
- `;await m(o,`${t}/contracts/${e.name}/sources/script/migrate.move`,"formatAndWriteMove")}}async function F(e,t){console.log(`
204
+ `;await m(o,`${t}/contracts/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function F(e,t){console.log(`
201
205
  \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 {
202
206
  /// Authorization token for the app.
203
207
  public struct DappKey has drop {}
@@ -207,8 +211,8 @@ ${e.name} = "0x0"
207
211
  }
208
212
  }
209
213
  `;await m(o,`${t}/contracts/${e.name}/sources/codegen/dapp_key.move`,"formatAndWriteMove"),console.log(`\u2705 DappKey Generation Complete
210
- `)}function L(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function I(e,t,o){console.log(`
211
- \u{1F4E6} Starting Schema Event Generation...`);for(let r in t){let n=t[r];if(n.events){console.log(` \u251C\u2500 Processing schema: ${r}`);for(let s of n.events){console.log(` \u2514\u2500 Generating ${s.name} ${Array.isArray(s.fields)?"(enum)":"(struct)"}`);let a=`module ${e}::${r}_${L(s.name)}_event {
214
+ `)}function I(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function L(e,t,o){console.log(`
215
+ \u{1F4E6} Starting Schema Event Generation...`);for(let r in t){let n=t[r];if(n.events){console.log(` \u251C\u2500 Processing schema: ${r}`);for(let s of n.events){console.log(` \u2514\u2500 Generating ${s.name} ${Array.isArray(s.fields)?"(enum)":"(struct)"}`);let a=`module ${e}::${r}_${I(s.name)}_event {
212
216
  use sui::event;
213
217
  use std::ascii::String;
214
218
  public struct ${s.name}Event has copy, drop {
@@ -225,7 +229,7 @@ ${e.name} = "0x0"
225
229
  event::emit(${s.name}Event {
226
230
  ${g(s.fields)}
227
231
  });
228
- }`;await m(a,`${o}/contracts/${e}/sources/codegen/events/${r}_${L(s.name)}_event.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Event Generation Complete
232
+ }`;await m(a,`${o}/contracts/${e}/sources/codegen/events/${r}_${I(s.name)}_event.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Event Generation Complete
229
233
  `)}import{existsSync as re}from"fs";import oe from"node:fs/promises";async function K(e,t){console.log(`
230
234
  \u2699\uFE0F Starting System Generation...`),console.log(" \u251C\u2500 Generating systems"),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/systems`),re(`${t}/contracts/${e.name}/sources/systems`)||await oe.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0}),console.log(`\u2705 System Generation Complete
231
235
  `)}async function B(e,t){console.log(`
@@ -277,6 +281,6 @@ ${e.name} = "0x0"
277
281
  `;await m(o,`${t}/contracts/${e.name}/sources/codegen/schema_hub.move`,"formatAndWriteMove"),console.log(`\u2705 DappKey Generation Complete
278
282
  `)}function V(e){switch(e){case"testnet":return"0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6";case"localnet":return"0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6";default:return"0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6"}}async function nt(e,t,o,r){console.log(`
279
283
  \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||V(o??"testnet")}
280
- `);let n=t??process.cwd();r=r||V(o??"testnet"),k(`${n}/contracts/${e.name}`)&&w(`${n}/contracts/${e.name}/sources/codegen`),k(`${n}/contracts/${e.name}/Move.toml`)||await R(e,n,r),k(`${n}/contracts/${e.name}/sources/script/deploy_hook.move`)||await E(e,n),await H(e.name,e.schemas,n),await O(e.name,e.schemas,n),await I(e.name,e.schemas,n),await F(e,n),await B(e,n),await K(e,n),await U(e,n),console.log(`\u2705 Schema Generation Process Complete!
284
+ `);let n=t??process.cwd();r=r||V(o??"testnet"),k(`${n}/contracts/${e.name}`)&&w(`${n}/contracts/${e.name}/sources/codegen`),k(`${n}/contracts/${e.name}/Move.toml`)||await R(e,n,r),k(`${n}/contracts/${e.name}/sources/script/deploy_hook.move`)||await z(e,n),await H(e.name,e.schemas,n),await O(e.name,e.schemas,n),await L(e.name,e.schemas,n),await F(e,n),await B(e,n),await K(e,n),await E(e,n),console.log(`\u2705 Schema Generation Process Complete!
281
285
  `)}import{findUp as se}from"find-up";import A from"path";import ne from"esbuild";var S=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as ae}from"fs";import{pathToFileURL as ie}from"url";import ce from"os";var me=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],C="dubhe.config.example.mjs";async function ft(e){e=await N(e);try{return await ne.build({entryPoints:[e],format:"esm",outfile:C,platform:"node",bundle:!0,packages:"external"}),e=await N(C,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{ae(C,{force:!0})}}async function N(e,t){return e===void 0?e=await ue():A.isAbsolute(e)||(e=A.join(process.cwd(),e),e=A.normalize(e)),t&&ce.platform()==="win32"?ie(e).href:e}async function ue(){let e=await se(me);if(e===void 0)throw new S;return e}export{m as formatAndWriteMove,xe as formatAndWriteTypescript,D as formatMove,T as formatTypescript,ft as loadConfig,we as posixPath,N as resolveConfigPath,nt as schemaGen};
282
286
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateEvent.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateSchemaHub.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(\n\tcontent: string,\n\tprettierConfigPath?: string\n): Promise<string> {\n\tlet config;\n\tif (prettierConfigPath) {\n\t\tconfig = await prettier.resolveConfig(prettierConfigPath);\n\t}\n\ttry {\n\t\treturn prettier.format(content, {\n\t\t\tplugins: [prettierPluginMove],\n\t\t\tparser: 'move-parse',\n\t\t\tprintWidth: 120,\n\t\t\tsemi: true,\n\t\t\ttabWidth: 2,\n\t\t\tuseTabs: false,\n\t\t\tbracketSpacing: true,\n\t\t\t...config,\n\t\t});\n\t} catch (error) {\n\t\tlet message;\n\t\tif (error instanceof Error) {\n\t\t\tmessage = error.message;\n\t\t} else {\n\t\t\tmessage = error;\n\t\t}\n\t\tconsole.log(`Error during output formatting: ${message}`);\n\t\treturn content;\n\t}\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n\treturn prettier.format(content, {\n\t\tparser: 'typescript',\n\t});\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { formatMove, formatTypescript } from \"./format\";\nimport { debug } from \"../debug\";\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix =\n` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: MIT\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `\n\n let deployHookPrefix = `#[allow(lint(share_owned))]\n \n `\n\n let code = schemaPrefix + formattedOutput\n\n if (fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\") || fullOutputPath.includes(\"migrate\")) {\n code = formattedOutput\n } else if (fullOutputPath.includes(\"deploy_hook\")) {\n code = deployHookPrefix + formattedOutput\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string,\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"dubhe:common\");\nexport const error = createDebug(\"dubhe:common\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"codegen\");\nexport const error = parentDebug.extend(\"codegen\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n","import { SchemaType, DubheConfig } from '../../types';\nimport { rmdirSync, existsSync } from 'fs';\nimport { deleteFolderRecursive } from './common';\nimport { generateToml } from './generateToml';\nimport { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\nimport { generateSchemaEvent } from './generateEvent';\nimport { generateSystem } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\n\nfunction matchFrameworkId(\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n): string {\n switch (network) {\n case 'testnet':\n return '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n case 'localnet':\n return '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n default:\n return '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n }\n}\n\nexport async function schemaGen(\n config: DubheConfig,\n srcPrefix?: string,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n frameworkId?: string,\n) {\n console.log('\\nšŸš€ Starting Schema Generation Process...');\n console.log('šŸ“‹ Project Configuration:');\n console.log(` ā”œā”€ Name: ${config.name}`);\n console.log(\n ` ā”œā”€ Description: ${config.description || 'No description provided'}`,\n );\n console.log(` ā”œā”€ Network: ${network || 'testnet'}`);\n console.log(\n ` └─ Framework ID: ${\n frameworkId || matchFrameworkId(network ?? 'testnet')\n }\\n`,\n );\n\n const path = srcPrefix ?? process.cwd();\n\n frameworkId = frameworkId || matchFrameworkId(network ?? 'testnet');\n\n if (existsSync(`${path}/contracts/${config.name}`)) {\n deleteFolderRecursive(\n `${path}/contracts/${config.name}/sources/codegen`,\n );\n }\n\n if (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n await generateToml(config, path, frameworkId);\n }\n\n if (\n !existsSync(\n `${path}/contracts/${config.name}/sources/script/deploy_hook.move`,\n )\n ) {\n await generateDeployHook(config, path);\n }\n\n await generateSchemaData(config.name, config.schemas, path);\n await generateSchemaStructure(config.name, config.schemas, path);\n await generateSchemaEvent(config.name, config.schemas, path);\n await generateDappKey(config, path);\n await generateSchemaHub(config, path);\n await generateSystem(config, path);\n await generateMigrate(config, path);\n\n console.log('āœ… Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n\tif (fs.existsSync(path)) {\n\t\tfs.readdirSync(path).forEach(file => {\n\t\t\tconst curPath = `${path}/${file}`;\n\t\t\tif (fs.lstatSync(curPath).isDirectory()) {\n\t\t\t\tdeleteFolderRecursive(curPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(curPath);\n\t\t\t}\n\t\t});\n\t\tfs.rmdirSync(path);\n\t}\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n\treturn input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(\n\tvalues: Record<string, string> | string\n): string {\n\treturn Object.entries(values)\n\t\t.map(([key, _]) => `${key}`)\n\t\t.join(',');\n}\n\nfunction isAddress(str: string): boolean {\n\tconst regex = /^0x[a-fA-F0-9]+$/;\n\treturn regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(\n\tvalues: Record<string, string>\n): string {\n\treturn `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(\n\tvalues: Record<string, string>\n): string[] {\n\treturn Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(\n\tvalues: Record<string, string>,\n): string[] {\n\treturn Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(\n\tconfig: DubheConfig,\n\tsrcPrefix: string,\n\tframeworkId: string\n) {\n\tconsole.log('\\nšŸ“„ Starting Move.toml Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/Move.toml`\n\t);\n\n\tlet code = `[package]\nname = \"${config.name}\"\nversion = \"0.0.1\"\nedition = \"2024.beta\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.36.2\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"release-dubhe-v1.0.0-rc1\" }\n\n[addresses]\nsui = \"0x2\"\ndubhe = \"${frameworkId}\"\n${config.name} = \"0x0\"\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/Move.toml`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… Move.toml Generation Complete\\n');\n}\n","import { BaseType, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nexport function capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nexport function renderSetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>,\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([key, type]) =>\n\t\t\t\t`public(package) fun set_${key}(self: &mut ${schemaName}, ${key}: ${type}) {\n self.${key} = ${key};\n }`,\n\t\t)\n\t\t.join('\\n');\n}\n\nexport function renderSetFunc(\n\tschemaName: string,\n\tfields: Record<string, string>,\n): string {\n\treturn `public(package) fun set(self: &mut ${schemaName}, ${getStructAttrsWithType(\n\t\tfields,\n\t)}) {\n ${Object.entries(fields)\n\t\t.map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n\t\t.join('\\n')}\n }`;\n}\n\nexport function renderGetAllFunc(\n\tschemaName: string,\n\tfields: Record<string, string>,\n): string {\n\treturn `public fun get(self: &${schemaName}): ${getStructTypes(fields)} {\n (${getStructAttrsQuery(fields)})\n }`;\n}\n\nexport function renderGetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>,\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([\n\t\t\t\t key,\n\t\t\t\t type,\n\t\t\t ]) => `public fun get_${key}(self: &${schemaName}): ${type} {\n self.${key}\n }`,\n\t\t)\n\t\t.join('\\n');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaData(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string,\n) {\n\tconsole.log('\\nšŸ“¦ Starting Schema Data Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.data) {\n\t\t\tconsole.log(` ā”œā”€ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.data) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tlet code = '';\n\n\t\t\t\tconst enumNames = schema.data\n\t\t\t\t\t.filter(item => Array.isArray(item.fields))\n\t\t\t\t\t.map(item => item.name);\n\n\t\t\t\tif (Array.isArray(item.fields)) {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name,\n\t\t\t\t\t)} {\n public enum ${item.name} has copy, drop , store {\n ${item.fields}\n }\n \n ${item.fields\n\t\t\t\t\t\t.map((field: string) => {\n\t\t\t\t\t\t\treturn `public fun new_${convertToSnakeCase(\n\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t)}(): ${item.name} {\n ${item.name}::${field}\n }`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}`;\n\t\t\t\t} else {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name,\n\t\t\t\t\t)} {\n use std::ascii::String;\n ${enumNames\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\tname =>\n\t\t\t\t\t\t\t\t`use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)}::${name};`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join('\\n')}\n\n public struct ${item.name} has copy, drop , store {\n ${getStructAttrsWithType(item.fields)}\n }\n \n public fun new(${getStructAttrsWithType(\n\t\t\t\t\t\titem.fields,\n\t\t\t\t\t)}): ${item.name} {\n ${item.name} {\n ${getStructAttrs(item.fields)}\n }\n }\n \n ${renderGetAllFunc(item.name, item.fields)}\n ${renderGetAttrsFunc(item.name, item.fields)}\n ${renderSetAttrsFunc(item.name, item.fields)}\n ${renderSetFunc(item.name, item.fields)}\n }`;\n\t\t\t\t}\n\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name,\n\t\t\t\t\t)}.move`,\n\t\t\t\t\t'formatAndWriteMove',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconsole.log('āœ… Schema Data Generation Complete\\n');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tschemaName: string,\n\tschema: SchemaType,\n) {\n\tif (schema.data) {\n\t\treturn schema.data\n\t\t\t.map(item => {\n\t\t\t\treturn `use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\titem.name,\n\t\t\t\t)}::${item.name};`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport async function generateSchemaStructure(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string,\n) {\n\tconsole.log('\\nšŸ”Ø Starting Schema Structure Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconsole.log(` ā”œā”€ Generating schema: ${schemaName}`);\n\t\tconsole.log(\n\t\t\t` ā”œā”€ Output path: ${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` └─ Structure fields: ${\n\t\t\t\tObject.keys(schemas[schemaName].structure).length\n\t\t\t}`,\n\t\t);\n\t\tconst schema = schemas[schemaName];\n\t\tconst schemaMoudle = `module ${projectName}::${schemaName}_schema {\n use std::ascii::String;\n use std::ascii::string;\n use sui::package::UpgradeCap;\n use std::type_name;\n use dubhe::dapps_system;\n use dubhe::storage_migrate;\n use dubhe::dapps_schema::Dapps;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use ${projectName}::dapp_key::DappKey;\n use sui::dynamic_field as df;\n ${generateImport(projectName, schemaName, schema)}\n\n public struct ${capitalizeAndRemoveUnderscores(\n\t\t\tschemaName,\n\t\t)} has key, store {\n id: UID\n\t\t\t\t\t\t\t\t\t\t\t} \n \n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\treturn `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(\n\t\t\t\t\tschemaName,\n\t\t\t\t)}) : &${value} {\n storage_migrate::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun borrow_mut_${key}(self: &mut ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\tschemaName,\n\t\t\t\t)}): &mut ${value} {\n storage_migrate::borrow_mut_field(&mut self.id, b\"${key}\")\n }\n `;\n\t\t\t})\n\t\t\t.join('')} \n \n \n public(package) fun create(ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(\n\t\t\tschemaName,\n\t\t)} {\n let mut id = object::new(ctx);\n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\tlet storage_type = '';\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tstorage_type = `storage_value::new()`;\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tstorage_type = `storage_map::new()`;\n\t\t\t\t} else if (\n\t\t\t\t\tvalue.includes('StorageDoubleMap')\n\t\t\t\t) {\n\t\t\t\t\tstorage_type = `storage_double_map::new()`;\n\t\t\t\t}\n\t\t\t\treturn `storage_migrate::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`;\n\t\t\t})\n\t\t\t.join('')}\n \n ${capitalizeAndRemoveUnderscores(schemaName)} { id }\n }\n \n public fun migrate(_${schemaName}: &mut ${capitalizeAndRemoveUnderscores(schemaName)}, _cap: &UpgradeCap) { }\n\n \n \n // ======================================== View Functions ========================================\n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tlet all_types = value.match(/<(.+)>/)[1].split(',').map(type => type.trim());\n\t\t\t\tlet para_key: string[] = [];\n\t\t\t\tlet para_value = '';\n\t\t\t\tlet borrow_key = '';\n\t\t\t\tlet extra_code = '';\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tpara_key = [];\n\t\t\t\t\tpara_value = `${all_types[0]}`;\n\t\t\t\t\tborrow_key = 'try_get()';\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tpara_key = [`key: ${all_types[0]}`];\n\t\t\t\t\tpara_value = `${all_types[1]}`;\n\t\t\t\t\tborrow_key = 'try_get(key)';\n\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[0]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[1]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t} else if (value.includes('StorageDoubleMap')) {\n\t\t\t\t\tpara_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`];\n\t\t\t\t\tpara_value = `${all_types[2]}`;\n\t\t\t\t\tborrow_key = 'try_get(key1, key2)';\n\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : (vector<${all_types[0]}>, vector<${all_types[1]}>) {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[2]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${para_key}) : Option<${para_value}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().${borrow_key}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t` + extra_code;\n\t\t\t})\n\t\t\t.join('')} \n // =========================================================================================================\n \n \n }`;\n\t\tawait formatAndWriteMove(\n\t\t\tschemaMoudle,\n\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t\t'formatAndWriteMove',\n\t\t);\n\t}\n\tconsole.log('āœ… Schema Structure Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateDeployHook(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ“ Starting Deploy Hook Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t);\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::deploy_hook {\n use dubhe::dapps_schema::Dapps;\n use dubhe::dapps_system;\n use ${config.name}::schema_hub::SchemaHub;\n use std::ascii::string;\n use sui::clock::Clock;\n use sui::package::UpgradeCap;\n use sui::transfer::public_share_object;\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\treturn `use ${config.name}::${schemaName}_schema::${capitalizeAndRemoveUnderscores(schemaName)};`}).join('\\n')\n\t\t}\n #[test_only]\n use sui::clock;\n #[test_only]\n use sui::test_scenario;\n #[test_only]\n use sui::package;\n #[test_only]\n use ${config.name}::schema_hub; \n #[test_only]\n use dubhe::dapps_schema;\n #[test_only]\n use sui::test_scenario::Scenario;\n\n public entry fun run(schema_hub: &mut SchemaHub, dapps: &mut Dapps, cap: &UpgradeCap, clock: &Clock, ctx: &mut TxContext) {\n // Register the dapp to dubhe.\n dapps_system::register(dapps,cap,string(b\"${config.name}\"),string(b\"${config.description}\"),clock,ctx);\n // Create schemas\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\treturn `let ${schemaName} = ${config.name}::${schemaName}_schema::create(ctx);`;\n\t\t\t}).join('\\n')}\n // Logic that needs to be automated once the contract is deployed\n\t\t\t\t${`\\n`}\n\t\t\t\t${`\\n`}\n\t\t\t\t\n // Authorize schemas and public share objects\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\t return `\n\t\t\t\t schema_hub.authorize_schema<${capitalizeAndRemoveUnderscores(schemaName)}>();\n\t\t\t\t public_share_object(${schemaName});\n\t\t\t\t `;\n\t\t\t}).join('\\n')}\n }\n\n #[test_only]\n public fun deploy_hook_for_testing(): (Scenario, SchemaHub, Dapps) {\n let mut scenario = test_scenario::begin(@0xA);\n {\n let ctx = test_scenario::ctx(&mut scenario);\n dapps_schema::init_dapps_for_testing(ctx);\n schema_hub::init_schema_hub_for_testing(ctx);\n test_scenario::next_tx(&mut scenario,@0xA);\n };\n let mut dapps = test_scenario::take_shared<Dapps>(&scenario);\n let mut schema_hub = test_scenario::take_shared<SchemaHub>(&scenario);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n let upgrade_cap = package::test_publish(@0x42.to_id(), ctx);\n run(&mut schema_hub, &mut dapps, &upgrade_cap, &clock, ctx);\n\n clock::destroy_for_testing(clock);\n upgrade_cap.make_immutable();\n test_scenario::next_tx(&mut scenario,@0xA);\n (scenario, schema_hub, dapps)\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('āœ… Deploy Hook Generation Complete\\n');\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 0;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ”‘ Starting DappKey Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`\n\t);\n\n\tlet code = `module ${config.name}::dapp_key {\n\\t/// Authorization token for the app.\n\\tpublic struct DappKey has drop {}\n\n\\tpublic(package) fun new(): DappKey {\n\\t\\tDappKey { }\n\\t}\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… DappKey Generation Complete\\n');\n}\n","import { BaseType, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaEvent(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string\n) {\n\tconsole.log('\\nšŸ“¦ Starting Schema Event Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.events) {\n\t\t\tconsole.log(` ā”œā”€ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.events) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`\n\t\t\t\t);\n\n\t\t\t\tlet\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(item.name)}_event {\n\t\t\t\t\t\tuse sui::event;\n\t\t\t\t\t\tuse std::ascii::String;\n public struct ${item.name}Event has copy, drop {\n ${getStructAttrsWithType(item.fields as Record<string, string>)}\n }\n \n public fun new(${getStructAttrsWithType(item.fields as Record<string, string>)}): ${item.name}Event {\n ${item.name}Event {\n ${getStructAttrs(item.fields as Record<string, string>)}\n }\n }\n \n public fun emit(${getStructAttrsWithType(item.fields as Record<string, string>)}) {\n event::emit(${item.name}Event {\n ${getStructAttrs(item.fields as Record<string, string>)}\n });\n }`;\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/events/${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)}_event.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconsole.log('āœ… Schema Event Generation Complete\\n');\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystem(config: DubheConfig, srcPrefix: string) {\n\tconsole.log('\\nāš™ļø Starting System Generation...');\n\t\tconsole.log(` ā”œā”€ Generating systems`);\n\t\tconsole.log(\n\t\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t);\n\n\t\tif (\n\t\t\t!existsSync(\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t\t)\n\t\t) {\n\t\t\tawait fs.mkdir(`${srcPrefix}/contracts/${config.name}/sources/systems`, { recursive: true })\n\t\t}\n\tconsole.log('āœ… System Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateSchemaHub(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ”‘ Starting DappKey Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`\n\t);\n\n\tlet code = `module ${config.name}::schema_hub {\n use sui::transfer::public_share_object;\n use sui::dynamic_field as df;\n\n public struct SchemaHub has key, store {\n id: UID,\n admin: address,\n }\n \n public struct SchemaTypeWapper<phantom Schema: key + store> has copy, store, drop {}\n\n /// Authorize an schema to access protected features of the SchemaHub.\n public(package) fun authorize_schema<Schema: key + store>(self: &mut SchemaHub) {\n df::add(&mut self.id, SchemaTypeWapper<Schema> {}, true);\n }\n\n /// Deauthorize an schema by removing its authorization key.\n public(package) fun deauthorize_schema<Schema: key + store>(self: &mut SchemaHub) {\n df::remove<SchemaTypeWapper<Schema>, bool>(&mut self.id, SchemaTypeWapper<Schema> {});\n }\n\n /// Check if an schema is authorized to access protected features of\n /// the SchemaHub.\n public fun is_schema_authorized<Schema: key + store>(self: &SchemaHub): bool {\n df::exists_(&self.id, SchemaTypeWapper<Schema> {})\n }\n\n /// Assert that an schema is authorized to access protected features of\n /// the SchemaHub. Aborts with \\`EAppNotAuthorized\\` if not.\n public fun ensure_schema_authorized<Schema: key + store>(self: &SchemaHub) {\n assert!(self.is_schema_authorized<Schema>(), 0);\n }\n\n fun init(ctx: &mut TxContext) {\n public_share_object(SchemaHub {\n id: object::new(ctx),\n admin: ctx.sender(),\n });\n }\n\n #[test_only]\n public fun init_schema_hub_for_testing(ctx: &mut TxContext) {\n init(ctx);\n }\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… DappKey Generation Complete\\n');\n}\n","import { findUp } from \"find-up\";\nimport path from \"path\";\nimport esbuild from \"esbuild\";\nimport { NotInsideProjectError } from \"./errors\";\nimport { rmSync } from \"fs\";\nimport { pathToFileURL } from \"url\";\nimport os from \"os\";\n\n// In order of preference files are checked\nconst configFiles = [\n \"dubhe.config.js\",\n \"dubhe.config.mjs\",\n \"dubhe.config.ts\",\n \"dubhe.config.mts\",\n];\nconst TEMP_CONFIG = \"dubhe.config.example.mjs\";\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: \"esm\",\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: \"node\",\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: \"external\",\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(\n configPath: string | undefined,\n toFileURL?: boolean\n) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === \"win32\"\n ? pathToFileURL(configPath).href\n : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","\nexport class NotInsideProjectError extends Error {\nname = \"NotInsideProjectError\";\nmessage = \"You are not inside a Dubhe project\";\n}"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","deployHookPrefix","code","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","generateToml","config","srcPrefix","frameworkId","code","formatAndWriteMove","capitalizeAndRemoveUnderscores","input","word","index","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","generateSchemaData","projectName","schemas","path","schema","item","code","enumNames","field","name","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","extra_code","existsSync","generateDeployHook","config","srcPrefix","existsSync","code","schemaName","capitalizeAndRemoveUnderscores","formatAndWriteMove","generateMigrate","generateDappKey","config","srcPrefix","code","formatAndWriteMove","convertToSnakeCase","input","generateSchemaEvent","projectName","schemas","path","schemaName","schema","item","code","getStructAttrsWithType","getStructAttrs","formatAndWriteMove","existsSync","fs","generateSystem","config","srcPrefix","generateSchemaHub","config","srcPrefix","code","formatAndWriteMove","matchFrameworkId","network","schemaGen","config","srcPrefix","frameworkId","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSchemaData","generateSchemaStructure","generateSchemaEvent","generateDappKey","generateSchemaHub","generateSystem","generateMigrate","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError"]}
1
+ {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateEvent.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateSchemaHub.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(\n\tcontent: string,\n\tprettierConfigPath?: string\n): Promise<string> {\n\tlet config;\n\tif (prettierConfigPath) {\n\t\tconfig = await prettier.resolveConfig(prettierConfigPath);\n\t}\n\ttry {\n\t\treturn prettier.format(content, {\n\t\t\tplugins: [prettierPluginMove],\n\t\t\tparser: 'move-parse',\n\t\t\tprintWidth: 120,\n\t\t\tsemi: true,\n\t\t\ttabWidth: 2,\n\t\t\tuseTabs: false,\n\t\t\tbracketSpacing: true,\n\t\t\t...config,\n\t\t});\n\t} catch (error) {\n\t\tlet message;\n\t\tif (error instanceof Error) {\n\t\t\tmessage = error.message;\n\t\t} else {\n\t\t\tmessage = error;\n\t\t}\n\t\tconsole.log(`Error during output formatting: ${message}`);\n\t\treturn content;\n\t}\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n\treturn prettier.format(content, {\n\t\tparser: 'typescript',\n\t});\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { formatMove, formatTypescript } from \"./format\";\nimport { debug } from \"../debug\";\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix =\n` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: MIT\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `\n\n let deployHookPrefix = `#[allow(lint(share_owned))]\n \n `\n\n let code = schemaPrefix + formattedOutput\n\n if (fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\") || fullOutputPath.includes(\"migrate\")) {\n code = formattedOutput\n } else if (fullOutputPath.includes(\"deploy_hook\")) {\n code = deployHookPrefix + formattedOutput\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string,\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"dubhe:common\");\nexport const error = createDebug(\"dubhe:common\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"codegen\");\nexport const error = parentDebug.extend(\"codegen\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n","import { SchemaType, DubheConfig } from '../../types';\nimport { rmdirSync, existsSync } from 'fs';\nimport { deleteFolderRecursive } from './common';\nimport { generateToml } from './generateToml';\nimport { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\nimport { generateSchemaEvent } from './generateEvent';\nimport { generateSystem } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\n\nfunction matchFrameworkId(\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n): string {\n switch (network) {\n case 'testnet':\n return '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n case 'localnet':\n return '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n default:\n return '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n }\n}\n\nexport async function schemaGen(\n config: DubheConfig,\n srcPrefix?: string,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n frameworkId?: string,\n) {\n console.log('\\nšŸš€ Starting Schema Generation Process...');\n console.log('šŸ“‹ Project Configuration:');\n console.log(` ā”œā”€ Name: ${config.name}`);\n console.log(\n ` ā”œā”€ Description: ${config.description || 'No description provided'}`,\n );\n console.log(` ā”œā”€ Network: ${network || 'testnet'}`);\n console.log(\n ` └─ Framework ID: ${\n frameworkId || matchFrameworkId(network ?? 'testnet')\n }\\n`,\n );\n\n const path = srcPrefix ?? process.cwd();\n\n frameworkId = frameworkId || matchFrameworkId(network ?? 'testnet');\n\n if (existsSync(`${path}/contracts/${config.name}`)) {\n deleteFolderRecursive(\n `${path}/contracts/${config.name}/sources/codegen`,\n );\n }\n\n if (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n await generateToml(config, path, frameworkId);\n }\n\n if (\n !existsSync(\n `${path}/contracts/${config.name}/sources/script/deploy_hook.move`,\n )\n ) {\n await generateDeployHook(config, path);\n }\n\n await generateSchemaData(config.name, config.schemas, path);\n await generateSchemaStructure(config.name, config.schemas, path);\n await generateSchemaEvent(config.name, config.schemas, path);\n await generateDappKey(config, path);\n await generateSchemaHub(config, path);\n await generateSystem(config, path);\n await generateMigrate(config, path);\n\n console.log('āœ… Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n\tif (fs.existsSync(path)) {\n\t\tfs.readdirSync(path).forEach(file => {\n\t\t\tconst curPath = `${path}/${file}`;\n\t\t\tif (fs.lstatSync(curPath).isDirectory()) {\n\t\t\t\tdeleteFolderRecursive(curPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(curPath);\n\t\t\t}\n\t\t});\n\t\tfs.rmdirSync(path);\n\t}\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n\treturn input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(\n\tvalues: Record<string, string> | string\n): string {\n\treturn Object.entries(values)\n\t\t.map(([key, _]) => `${key}`)\n\t\t.join(',');\n}\n\nfunction isAddress(str: string): boolean {\n\tconst regex = /^0x[a-fA-F0-9]+$/;\n\treturn regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(\n\tvalues: Record<string, string>\n): string {\n\treturn `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(\n\tvalues: Record<string, string>\n): string[] {\n\treturn Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(\n\tvalues: Record<string, string>,\n): string[] {\n\treturn Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(\n\tconfig: DubheConfig,\n\tsrcPrefix: string,\n\tframeworkId: string\n) {\n\tconsole.log('\\nšŸ“„ Starting Move.toml Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/Move.toml`\n\t);\n\n\tlet code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.38.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"dubhe-testnet-v1.0.0\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x0\"\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/Move.toml`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… Move.toml Generation Complete\\n');\n}\n","import { BaseType, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nexport function capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nexport function renderSetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>,\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([key, type]) =>\n\t\t\t\t`public(package) fun set_${key}(self: &mut ${schemaName}, ${key}: ${type}) {\n self.${key} = ${key};\n }`,\n\t\t)\n\t\t.join('\\n');\n}\n\nexport function renderSetFunc(\n\tschemaName: string,\n\tfields: Record<string, string>,\n): string {\n\treturn `public(package) fun set(self: &mut ${schemaName}, ${getStructAttrsWithType(\n\t\tfields,\n\t)}) {\n ${Object.entries(fields)\n\t\t.map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n\t\t.join('\\n')}\n }`;\n}\n\nexport function renderGetAllFunc(\n\tschemaName: string,\n\tfields: Record<string, string>,\n): string {\n\treturn `public fun get(self: &${schemaName}): ${getStructTypes(fields)} {\n (${getStructAttrsQuery(fields)})\n }`;\n}\n\nexport function renderGetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>,\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([\n\t\t\t\t key,\n\t\t\t\t type,\n\t\t\t ]) => `public fun get_${key}(self: &${schemaName}): ${type} {\n self.${key}\n }`,\n\t\t)\n\t\t.join('\\n');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaData(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string,\n) {\n\tconsole.log('\\nšŸ“¦ Starting Schema Data Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.data) {\n\t\t\tconsole.log(` ā”œā”€ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.data) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tlet code = '';\n\n\t\t\t\tconst enumNames = schema.data\n\t\t\t\t\t.filter(item => Array.isArray(item.fields))\n\t\t\t\t\t.map(item => item.name);\n\n\t\t\t\tif (Array.isArray(item.fields)) {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name,\n\t\t\t\t\t)} {\n public enum ${item.name} has copy, drop , store {\n ${item.fields}\n }\n \n ${item.fields\n\t\t\t\t\t\t.map((field: string) => {\n\t\t\t\t\t\t\treturn `public fun new_${convertToSnakeCase(\n\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t)}(): ${item.name} {\n ${item.name}::${field}\n }`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}`;\n\t\t\t\t} else {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name,\n\t\t\t\t\t)} {\n use std::ascii::String;\n ${enumNames\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\tname =>\n\t\t\t\t\t\t\t\t`use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)}::${name};`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join('\\n')}\n\n public struct ${item.name} has copy, drop , store {\n ${getStructAttrsWithType(item.fields)}\n }\n \n public fun new(${getStructAttrsWithType(\n\t\t\t\t\t\titem.fields,\n\t\t\t\t\t)}): ${item.name} {\n ${item.name} {\n ${getStructAttrs(item.fields)}\n }\n }\n \n ${renderGetAllFunc(item.name, item.fields)}\n ${renderGetAttrsFunc(item.name, item.fields)}\n ${renderSetAttrsFunc(item.name, item.fields)}\n ${renderSetFunc(item.name, item.fields)}\n }`;\n\t\t\t\t}\n\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name,\n\t\t\t\t\t)}.move`,\n\t\t\t\t\t'formatAndWriteMove',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconsole.log('āœ… Schema Data Generation Complete\\n');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tschemaName: string,\n\tschema: SchemaType,\n) {\n\tif (schema.data) {\n\t\treturn schema.data\n\t\t\t.map(item => {\n\t\t\t\treturn `use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\titem.name,\n\t\t\t\t)}::${item.name};`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport async function generateSchemaStructure(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string,\n) {\n\tconsole.log('\\nšŸ”Ø Starting Schema Structure Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconsole.log(` ā”œā”€ Generating schema: ${schemaName}`);\n\t\tconsole.log(\n\t\t\t` ā”œā”€ Output path: ${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` └─ Structure fields: ${\n\t\t\t\tObject.keys(schemas[schemaName].structure).length\n\t\t\t}`,\n\t\t);\n\t\tconst schema = schemas[schemaName];\n\t\tconst schemaMoudle = `module ${projectName}::${schemaName}_schema {\n use std::ascii::String;\n use std::ascii::string;\n use sui::package::UpgradeCap;\n use std::type_name;\n use dubhe::dapps_system;\n use dubhe::storage_migrate;\n use dubhe::dapps_schema::Dapps;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use ${projectName}::dapp_key::DappKey;\n use sui::dynamic_field as df;\n ${generateImport(projectName, schemaName, schema)}\n\n public struct ${capitalizeAndRemoveUnderscores(\n\t\t\tschemaName,\n\t\t)} has key, store {\n id: UID\n\t\t\t\t\t\t\t\t\t\t\t} \n \n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\treturn `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(\n\t\t\t\t\tschemaName,\n\t\t\t\t)}) : &${value} {\n storage_migrate::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun borrow_mut_${key}(self: &mut ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\tschemaName,\n\t\t\t\t)}): &mut ${value} {\n storage_migrate::borrow_mut_field(&mut self.id, b\"${key}\")\n }\n `;\n\t\t\t})\n\t\t\t.join('')} \n \n \n public(package) fun create(ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(\n\t\t\tschemaName,\n\t\t)} {\n let mut id = object::new(ctx);\n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\tlet storage_type = '';\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tstorage_type = `storage_value::new()`;\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tstorage_type = `storage_map::new()`;\n\t\t\t\t} else if (\n\t\t\t\t\tvalue.includes('StorageDoubleMap')\n\t\t\t\t) {\n\t\t\t\t\tstorage_type = `storage_double_map::new()`;\n\t\t\t\t}\n\t\t\t\treturn `storage_migrate::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`;\n\t\t\t})\n\t\t\t.join('')}\n \n ${capitalizeAndRemoveUnderscores(schemaName)} { id }\n }\n \n public fun migrate(_${schemaName}: &mut ${capitalizeAndRemoveUnderscores(schemaName)}, _cap: &UpgradeCap) { }\n\n \n \n // ======================================== View Functions ========================================\n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tlet all_types = value.match(/<(.+)>/)[1].split(',').map(type => type.trim());\n\t\t\t\tlet para_key: string[] = [];\n\t\t\t\tlet para_value = '';\n\t\t\t\tlet borrow_key = '';\n\t\t\t\tlet extra_code = '';\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tpara_key = [];\n\t\t\t\t\tpara_value = `${all_types[0]}`;\n\t\t\t\t\tborrow_key = 'try_get()';\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tpara_key = [`key: ${all_types[0]}`];\n\t\t\t\t\tpara_value = `${all_types[1]}`;\n\t\t\t\t\tborrow_key = 'try_get(key)';\n\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[0]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[1]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t} else if (value.includes('StorageDoubleMap')) {\n\t\t\t\t\tpara_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`];\n\t\t\t\t\tpara_value = `${all_types[2]}`;\n\t\t\t\t\tborrow_key = 'try_get(key1, key2)';\n\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : (vector<${all_types[0]}>, vector<${all_types[1]}>) {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[2]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${para_key}) : Option<${para_value}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().${borrow_key}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t` + extra_code;\n\t\t\t})\n\t\t\t.join('')} \n // =========================================================================================================\n \n \n }`;\n\t\tawait formatAndWriteMove(\n\t\t\tschemaMoudle,\n\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t\t'formatAndWriteMove',\n\t\t);\n\t}\n\tconsole.log('āœ… Schema Structure Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateDeployHook(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ“ Starting Deploy Hook Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`\n\t);\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::deploy_hook {\n use dubhe::dapps_schema::Dapps;\n use dubhe::dapps_system;\n use ${config.name}::schema_hub::SchemaHub;\n use std::ascii::string;\n use sui::clock::Clock;\n use sui::sui::SUI;\n use sui::coin::Coin;\n use sui::package::UpgradeCap;\n use sui::transfer::public_share_object;\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\treturn `use ${config.name}::${schemaName}_schema::${capitalizeAndRemoveUnderscores(schemaName)};`}).join('\\n')\n\t\t}\n #[test_only]\n use sui::clock;\n #[test_only]\n use sui::coin;\n #[test_only]\n use sui::test_scenario;\n #[test_only]\n use sui::package;\n #[test_only]\n use ${config.name}::schema_hub; \n #[test_only]\n use dubhe::dapps_schema;\n #[test_only]\n use sui::test_scenario::Scenario;\n\n public entry fun run(schema_hub: &mut SchemaHub, dapps: &mut Dapps, cap: &UpgradeCap, clock: &Clock, coin: Coin<SUI>, ctx: &mut TxContext) {\n // Register the dapp to dubhe.\n dapps_system::register(dapps,cap,string(b\"${config.name}\"),string(b\"${config.description}\"),clock,coin,ctx);\n // Create schemas\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\treturn `let ${schemaName} = ${config.name}::${schemaName}_schema::create(ctx);`;\n\t\t\t}).join('\\n')}\n // Logic that needs to be automated once the contract is deployed\n\t\t\t\t${`\\n`}\n\t\t\t\t${`\\n`}\n\t\t\t\t\n // Authorize schemas and public share objects\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\t return `\n\t\t\t\t schema_hub.authorize_schema<${capitalizeAndRemoveUnderscores(schemaName)}>();\n\t\t\t\t public_share_object(${schemaName});\n\t\t\t\t `;\n\t\t\t}).join('\\n')}\n }\n\n #[test_only]\n public fun deploy_hook_for_testing(): (Scenario, SchemaHub, Dapps) {\n let mut scenario = test_scenario::begin(@0xA);\n {\n let ctx = test_scenario::ctx(&mut scenario);\n dapps_schema::init_dapps_for_testing(ctx);\n schema_hub::init_schema_hub_for_testing(ctx);\n test_scenario::next_tx(&mut scenario,@0xA);\n };\n let mut dapps = test_scenario::take_shared<Dapps>(&scenario);\n let mut schema_hub = test_scenario::take_shared<SchemaHub>(&scenario);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n let upgrade_cap = package::test_publish(@0x42.to_id(), ctx);\n let coin = coin::mint_for_testing<SUI>(1_000_000_000, ctx);\n run(&mut schema_hub, &mut dapps, &upgrade_cap, &clock, coin, ctx);\n\n clock::destroy_for_testing(clock);\n upgrade_cap.make_immutable();\n test_scenario::next_tx(&mut scenario,@0xA);\n (scenario, schema_hub, dapps)\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('āœ… Deploy Hook Generation Complete\\n');\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 0;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ”‘ Starting DappKey Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`\n\t);\n\n\tlet code = `module ${config.name}::dapp_key {\n\\t/// Authorization token for the app.\n\\tpublic struct DappKey has drop {}\n\n\\tpublic(package) fun new(): DappKey {\n\\t\\tDappKey { }\n\\t}\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… DappKey Generation Complete\\n');\n}\n","import { BaseType, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaEvent(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string\n) {\n\tconsole.log('\\nšŸ“¦ Starting Schema Event Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.events) {\n\t\t\tconsole.log(` ā”œā”€ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.events) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`\n\t\t\t\t);\n\n\t\t\t\tlet\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(item.name)}_event {\n\t\t\t\t\t\tuse sui::event;\n\t\t\t\t\t\tuse std::ascii::String;\n public struct ${item.name}Event has copy, drop {\n ${getStructAttrsWithType(item.fields as Record<string, string>)}\n }\n \n public fun new(${getStructAttrsWithType(item.fields as Record<string, string>)}): ${item.name}Event {\n ${item.name}Event {\n ${getStructAttrs(item.fields as Record<string, string>)}\n }\n }\n \n public fun emit(${getStructAttrsWithType(item.fields as Record<string, string>)}) {\n event::emit(${item.name}Event {\n ${getStructAttrs(item.fields as Record<string, string>)}\n });\n }`;\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/events/${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)}_event.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconsole.log('āœ… Schema Event Generation Complete\\n');\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystem(config: DubheConfig, srcPrefix: string) {\n\tconsole.log('\\nāš™ļø Starting System Generation...');\n\t\tconsole.log(` ā”œā”€ Generating systems`);\n\t\tconsole.log(\n\t\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t);\n\n\t\tif (\n\t\t\t!existsSync(\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t\t)\n\t\t) {\n\t\t\tawait fs.mkdir(`${srcPrefix}/contracts/${config.name}/sources/systems`, { recursive: true })\n\t\t}\n\tconsole.log('āœ… System Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateSchemaHub(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ”‘ Starting DappKey Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`\n\t);\n\n\tlet code = `module ${config.name}::schema_hub {\n use sui::transfer::public_share_object;\n use sui::dynamic_field as df;\n\n public struct SchemaHub has key, store {\n id: UID,\n admin: address,\n }\n \n public struct SchemaTypeWapper<phantom Schema: key + store> has copy, store, drop {}\n\n /// Authorize an schema to access protected features of the SchemaHub.\n public(package) fun authorize_schema<Schema: key + store>(self: &mut SchemaHub) {\n df::add(&mut self.id, SchemaTypeWapper<Schema> {}, true);\n }\n\n /// Deauthorize an schema by removing its authorization key.\n public(package) fun deauthorize_schema<Schema: key + store>(self: &mut SchemaHub) {\n df::remove<SchemaTypeWapper<Schema>, bool>(&mut self.id, SchemaTypeWapper<Schema> {});\n }\n\n /// Check if an schema is authorized to access protected features of\n /// the SchemaHub.\n public fun is_schema_authorized<Schema: key + store>(self: &SchemaHub): bool {\n df::exists_(&self.id, SchemaTypeWapper<Schema> {})\n }\n\n /// Assert that an schema is authorized to access protected features of\n /// the SchemaHub. Aborts with \\`EAppNotAuthorized\\` if not.\n public fun ensure_schema_authorized<Schema: key + store>(self: &SchemaHub) {\n assert!(self.is_schema_authorized<Schema>(), 0);\n }\n\n fun init(ctx: &mut TxContext) {\n public_share_object(SchemaHub {\n id: object::new(ctx),\n admin: ctx.sender(),\n });\n }\n\n #[test_only]\n public fun init_schema_hub_for_testing(ctx: &mut TxContext) {\n init(ctx);\n }\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… DappKey Generation Complete\\n');\n}\n","import { findUp } from \"find-up\";\nimport path from \"path\";\nimport esbuild from \"esbuild\";\nimport { NotInsideProjectError } from \"./errors\";\nimport { rmSync } from \"fs\";\nimport { pathToFileURL } from \"url\";\nimport os from \"os\";\n\n// In order of preference files are checked\nconst configFiles = [\n \"dubhe.config.js\",\n \"dubhe.config.mjs\",\n \"dubhe.config.ts\",\n \"dubhe.config.mts\",\n];\nconst TEMP_CONFIG = \"dubhe.config.example.mjs\";\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: \"esm\",\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: \"node\",\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: \"external\",\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(\n configPath: string | undefined,\n toFileURL?: boolean\n) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === \"win32\"\n ? pathToFileURL(configPath).href\n : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","\nexport class NotInsideProjectError extends Error {\nname = \"NotInsideProjectError\";\nmessage = \"You are not inside a Dubhe project\";\n}"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","deployHookPrefix","code","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","generateToml","config","srcPrefix","frameworkId","code","formatAndWriteMove","capitalizeAndRemoveUnderscores","input","word","index","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","generateSchemaData","projectName","schemas","path","schema","item","code","enumNames","field","name","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","extra_code","existsSync","generateDeployHook","config","srcPrefix","existsSync","code","schemaName","capitalizeAndRemoveUnderscores","formatAndWriteMove","generateMigrate","generateDappKey","config","srcPrefix","code","formatAndWriteMove","convertToSnakeCase","input","generateSchemaEvent","projectName","schemas","path","schemaName","schema","item","code","getStructAttrsWithType","getStructAttrs","formatAndWriteMove","existsSync","fs","generateSystem","config","srcPrefix","generateSchemaHub","config","srcPrefix","code","formatAndWriteMove","matchFrameworkId","network","schemaGen","config","srcPrefix","frameworkId","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSchemaData","generateSchemaStructure","generateSchemaEvent","generateDappKey","generateSchemaHub","generateSystem","generateMigrate","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xobelisk/sui-common",
3
- "version": "0.5.21",
3
+ "version": "0.5.22",
4
4
  "description": "Common low level logic shared between packages",
5
5
  "keywords": [
6
6
  "sui",
@@ -9,12 +9,12 @@ export async function generateDeployHook(
9
9
  ) {
10
10
  console.log('\nšŸ“ Starting Deploy Hook Generation...');
11
11
  console.log(
12
- ` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`
12
+ ` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`
13
13
  );
14
14
 
15
15
  if (
16
16
  !existsSync(
17
- `${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`
17
+ `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`
18
18
  )
19
19
  ) {
20
20
  let code = `module ${config.name}::deploy_hook {
@@ -23,6 +23,8 @@ export async function generateDeployHook(
23
23
  use ${config.name}::schema_hub::SchemaHub;
24
24
  use std::ascii::string;
25
25
  use sui::clock::Clock;
26
+ use sui::sui::SUI;
27
+ use sui::coin::Coin;
26
28
  use sui::package::UpgradeCap;
27
29
  use sui::transfer::public_share_object;
28
30
  ${Object.keys(config.schemas).map(schemaName => {
@@ -31,6 +33,8 @@ export async function generateDeployHook(
31
33
  #[test_only]
32
34
  use sui::clock;
33
35
  #[test_only]
36
+ use sui::coin;
37
+ #[test_only]
34
38
  use sui::test_scenario;
35
39
  #[test_only]
36
40
  use sui::package;
@@ -41,9 +45,9 @@ export async function generateDeployHook(
41
45
  #[test_only]
42
46
  use sui::test_scenario::Scenario;
43
47
 
44
- public entry fun run(schema_hub: &mut SchemaHub, dapps: &mut Dapps, cap: &UpgradeCap, clock: &Clock, ctx: &mut TxContext) {
48
+ public entry fun run(schema_hub: &mut SchemaHub, dapps: &mut Dapps, cap: &UpgradeCap, clock: &Clock, coin: Coin<SUI>, ctx: &mut TxContext) {
45
49
  // Register the dapp to dubhe.
46
- dapps_system::register(dapps,cap,string(b"${config.name}"),string(b"${config.description}"),clock,ctx);
50
+ dapps_system::register(dapps,cap,string(b"${config.name}"),string(b"${config.description}"),clock,coin,ctx);
47
51
  // Create schemas
48
52
  ${Object.keys(config.schemas).map(schemaName => {
49
53
  return `let ${schemaName} = ${config.name}::${schemaName}_schema::create(ctx);`;
@@ -75,7 +79,8 @@ export async function generateDeployHook(
75
79
  let ctx = test_scenario::ctx(&mut scenario);
76
80
  let clock = clock::create_for_testing(ctx);
77
81
  let upgrade_cap = package::test_publish(@0x42.to_id(), ctx);
78
- run(&mut schema_hub, &mut dapps, &upgrade_cap, &clock, ctx);
82
+ let coin = coin::mint_for_testing<SUI>(1_000_000_000, ctx);
83
+ run(&mut schema_hub, &mut dapps, &upgrade_cap, &clock, coin, ctx);
79
84
 
80
85
  clock::destroy_for_testing(clock);
81
86
  upgrade_cap.make_immutable();
@@ -86,7 +91,7 @@ export async function generateDeployHook(
86
91
  `;
87
92
  await formatAndWriteMove(
88
93
  code,
89
- `${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`,
94
+ `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`,
90
95
  'formatAndWriteMove'
91
96
  );
92
97
  }
@@ -96,7 +101,7 @@ export async function generateDeployHook(
96
101
  export async function generateMigrate(config: DubheConfig, srcPrefix: string) {
97
102
  if (
98
103
  !existsSync(
99
- `${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`
104
+ `${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`
100
105
  )
101
106
  ) {
102
107
  let code = `module ${config.name}::migrate {
@@ -109,7 +114,7 @@ export async function generateMigrate(config: DubheConfig, srcPrefix: string) {
109
114
  `;
110
115
  await formatAndWriteMove(
111
116
  code,
112
- `${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`,
117
+ `${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`,
113
118
  'formatAndWriteMove'
114
119
  );
115
120
  }
@@ -13,16 +13,15 @@ export async function generateToml(
13
13
 
14
14
  let code = `[package]
15
15
  name = "${config.name}"
16
- version = "0.0.1"
17
- edition = "2024.beta"
16
+ version = "1.0.0"
17
+ edition = "2024"
18
18
 
19
19
  [dependencies]
20
- Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.36.2" }
21
- Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "release-dubhe-v1.0.0-rc1" }
20
+ Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.38.3" }
21
+ Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "dubhe-testnet-v1.0.0" }
22
22
 
23
23
  [addresses]
24
24
  sui = "0x2"
25
- dubhe = "${frameworkId}"
26
25
  ${config.name} = "0x0"
27
26
  `;
28
27
  await formatAndWriteMove(