@dotdm/contracts 0.1.0

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.
@@ -0,0 +1,293 @@
1
+ import { execSync } from "child_process";
2
+ import { existsSync, readFileSync } from "fs";
3
+ import { resolve } from "path";
4
+ /**
5
+ * Get workspace metadata from Cargo's resolver.
6
+ * This is 100% reliable - it uses Cargo's own dependency resolution.
7
+ */
8
+ function getCargoMetadata(rootDir) {
9
+ const manifestPath = resolve(rootDir, "Cargo.toml");
10
+ const output = execSync(`cargo metadata --format-version 1 --manifest-path "${manifestPath}" --no-deps`, { cwd: rootDir, encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
11
+ return JSON.parse(output);
12
+ }
13
+ /**
14
+ * Check if a package is a PVM contract by checking its dependencies.
15
+ * A PVM contract has pvm_contract as a normal (non-dev, non-build) dependency.
16
+ */
17
+ function isPvmContract(pkg) {
18
+ return pkg.dependencies.some((d) => d.name === "pvm_contract" && (d.kind === null || d.kind === "normal"));
19
+ }
20
+ /**
21
+ * Read CDM package name from post-build .cdm.json file.
22
+ * Returns null if contract has no CDM annotation or hasn't been built yet.
23
+ *
24
+ * The .cdm.json file is generated by cargo-pvm-contract during compilation
25
+ * by extracting the __PVM_CDM symbol from the compiled ELF.
26
+ */
27
+ export function readCdmPackage(rootDir, crateName) {
28
+ const cdmPath = resolve(rootDir, `target/${crateName}.release.cdm.json`);
29
+ if (!existsSync(cdmPath))
30
+ return null;
31
+ try {
32
+ const data = JSON.parse(readFileSync(cdmPath, "utf-8"));
33
+ return data.cdmPackage ?? null;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * Detect all PVM contracts in a workspace using cargo metadata.
41
+ *
42
+ * This replaces the old regex-based detection with Cargo's own resolver:
43
+ * - Workspace members come from cargo metadata (not recursive file scanning)
44
+ * - PVM contract detection uses resolved dependency graph (not string matching)
45
+ * - Inter-contract dependencies come from Cargo.toml (not regex on source)
46
+ * - CDM package names come from .cdm.json files (not regex on source)
47
+ */
48
+ export function detectContracts(rootDir) {
49
+ const meta = getCargoMetadata(rootDir);
50
+ const workspacePkgIds = new Set(meta.workspace_members);
51
+ // Filter to workspace members that are PVM contracts
52
+ const pvmPackages = meta.packages.filter((pkg) => workspacePkgIds.has(pkg.id) && isPvmContract(pkg));
53
+ // Build set of known contract crate names for filtering deps
54
+ const contractNames = new Set(pvmPackages.map((p) => p.name));
55
+ return pvmPackages.map((pkg) => {
56
+ // Get inter-contract dependencies from Cargo's dependency list
57
+ // Only include normal dependencies that are also PVM contracts in this workspace
58
+ const deps = pkg.dependencies
59
+ .filter((d) => (d.kind === null || d.kind === "normal") && contractNames.has(d.name))
60
+ .map((d) => d.name);
61
+ const manifestDir = resolve(pkg.manifest_path, "..");
62
+ return {
63
+ name: pkg.name,
64
+ cdmPackage: readCdmPackage(rootDir, pkg.name),
65
+ description: pkg.description,
66
+ authors: pkg.authors,
67
+ homepage: pkg.homepage,
68
+ repository: pkg.repository,
69
+ readmePath: pkg.readme ? resolve(manifestDir, pkg.readme) : findReadme(manifestDir),
70
+ path: manifestDir,
71
+ dependsOnCrates: deps,
72
+ };
73
+ });
74
+ }
75
+ /**
76
+ * Build a dependency graph from contract info.
77
+ */
78
+ export function buildDependencyGraph(contracts) {
79
+ const graph = new Map();
80
+ const knownCrates = new Set(contracts.map((c) => c.name));
81
+ for (const contract of contracts) {
82
+ const validDeps = contract.dependsOnCrates.filter((dep) => knownCrates.has(dep));
83
+ graph.set(contract.name, validDeps);
84
+ }
85
+ return graph;
86
+ }
87
+ /**
88
+ * Topological sort using Kahn's algorithm.
89
+ * Returns nodes in dependency order (dependencies come first).
90
+ */
91
+ export function toposort(graph) {
92
+ const inDegree = new Map();
93
+ const dependents = new Map();
94
+ for (const [node, deps] of graph) {
95
+ if (!inDegree.has(node)) {
96
+ inDegree.set(node, 0);
97
+ }
98
+ if (!dependents.has(node)) {
99
+ dependents.set(node, []);
100
+ }
101
+ for (const dep of deps) {
102
+ if (!inDegree.has(dep)) {
103
+ inDegree.set(dep, 0);
104
+ }
105
+ if (!dependents.has(dep)) {
106
+ dependents.set(dep, []);
107
+ }
108
+ }
109
+ }
110
+ for (const [node, deps] of graph) {
111
+ inDegree.set(node, deps.length);
112
+ for (const dep of deps) {
113
+ dependents.get(dep).push(node);
114
+ }
115
+ }
116
+ const queue = [];
117
+ for (const [node, degree] of inDegree) {
118
+ if (degree === 0) {
119
+ queue.push(node);
120
+ }
121
+ }
122
+ queue.sort();
123
+ const result = [];
124
+ while (queue.length > 0) {
125
+ queue.sort();
126
+ const node = queue.shift();
127
+ result.push(node);
128
+ for (const dependent of dependents.get(node) || []) {
129
+ const newDegree = inDegree.get(dependent) - 1;
130
+ inDegree.set(dependent, newDegree);
131
+ if (newDegree === 0) {
132
+ queue.push(dependent);
133
+ }
134
+ }
135
+ }
136
+ if (result.length !== inDegree.size) {
137
+ const remaining = [...inDegree.entries()]
138
+ .filter(([_, degree]) => degree > 0)
139
+ .map(([node]) => node);
140
+ throw new Error(`Circular dependency detected involving: ${remaining.join(", ")}`);
141
+ }
142
+ return result;
143
+ }
144
+ /**
145
+ * Topological sort (layered) using modified Kahn's algorithm.
146
+ * Collects ALL zero-in-degree nodes at each iteration as a layer.
147
+ * Each layer can be processed in parallel.
148
+ */
149
+ export function toposortLayers(graph) {
150
+ const inDegree = new Map();
151
+ const dependents = new Map();
152
+ for (const [node, deps] of graph) {
153
+ if (!inDegree.has(node))
154
+ inDegree.set(node, 0);
155
+ if (!dependents.has(node))
156
+ dependents.set(node, []);
157
+ for (const dep of deps) {
158
+ if (!inDegree.has(dep))
159
+ inDegree.set(dep, 0);
160
+ if (!dependents.has(dep))
161
+ dependents.set(dep, []);
162
+ }
163
+ }
164
+ for (const [node, deps] of graph) {
165
+ inDegree.set(node, deps.length);
166
+ for (const dep of deps) {
167
+ dependents.get(dep).push(node);
168
+ }
169
+ }
170
+ let queue = [];
171
+ for (const [node, degree] of inDegree) {
172
+ if (degree === 0)
173
+ queue.push(node);
174
+ }
175
+ const layers = [];
176
+ let processed = 0;
177
+ while (queue.length > 0) {
178
+ queue.sort();
179
+ layers.push([...queue]);
180
+ processed += queue.length;
181
+ const nextQueue = [];
182
+ for (const node of queue) {
183
+ for (const dependent of dependents.get(node) || []) {
184
+ const newDegree = inDegree.get(dependent) - 1;
185
+ inDegree.set(dependent, newDegree);
186
+ if (newDegree === 0) {
187
+ nextQueue.push(dependent);
188
+ }
189
+ }
190
+ }
191
+ queue = nextQueue;
192
+ }
193
+ if (processed !== inDegree.size) {
194
+ const remaining = [...inDegree.entries()].filter(([_, d]) => d > 0).map(([n]) => n);
195
+ throw new Error(`Circular dependency detected involving: ${remaining.join(", ")}`);
196
+ }
197
+ // TEMPORARY PATCH: Force sequential deployment (one contract per layer) to work
198
+ // around bulletin chain issues with parallel submissions. Remove this once the
199
+ // bulletin nonce/parallel submission issue is resolved.
200
+ return layers.flatMap((layer) => layer.map((contract) => [contract]));
201
+ }
202
+ /**
203
+ * Create a mapping from crate name to CDM package name.
204
+ */
205
+ export function createCrateToPackageMap(contracts) {
206
+ const map = new Map();
207
+ for (const contract of contracts) {
208
+ if (contract.cdmPackage) {
209
+ map.set(contract.name, contract.cdmPackage);
210
+ }
211
+ }
212
+ return map;
213
+ }
214
+ /**
215
+ * Detect contracts and determine deployment order based on dependencies.
216
+ * Uses cargo metadata for reliable workspace and dependency resolution.
217
+ */
218
+ export function detectDeploymentOrder(rootDir) {
219
+ const contracts = detectContracts(rootDir);
220
+ const graph = buildDependencyGraph(contracts);
221
+ const sortedCrates = toposort(graph);
222
+ const crateToPackage = createCrateToPackageMap(contracts);
223
+ const sortedPackages = sortedCrates.map((crate) => crateToPackage.get(crate) || null);
224
+ const crateToContract = new Map(contracts.map((c) => [c.name, c]));
225
+ const sortedContracts = sortedCrates.map((crate) => crateToContract.get(crate));
226
+ return {
227
+ crateNames: sortedCrates,
228
+ cdmPackages: sortedPackages,
229
+ contracts: sortedContracts,
230
+ };
231
+ }
232
+ /**
233
+ * Detect contracts and determine layered deployment order.
234
+ * Each layer contains contracts that can be deployed in parallel.
235
+ */
236
+ export function detectDeploymentOrderLayered(rootDir) {
237
+ const contracts = detectContracts(rootDir);
238
+ const graph = buildDependencyGraph(contracts);
239
+ const layers = toposortLayers(graph);
240
+ const cdmPackageMap = new Map();
241
+ const contractMap = new Map();
242
+ for (const contract of contracts) {
243
+ contractMap.set(contract.name, contract);
244
+ if (contract.cdmPackage) {
245
+ cdmPackageMap.set(contract.name, contract.cdmPackage);
246
+ }
247
+ }
248
+ return { layers, contractMap, cdmPackageMap };
249
+ }
250
+ function findReadme(dir) {
251
+ for (const name of ["README.md", "README.txt", "README", "readme.md"]) {
252
+ const p = resolve(dir, name);
253
+ if (existsSync(p))
254
+ return p;
255
+ }
256
+ return null;
257
+ }
258
+ export function getGitRemoteUrl(rootDir) {
259
+ try {
260
+ let url = execSync("git remote get-url origin", {
261
+ cwd: rootDir,
262
+ encoding: "utf-8",
263
+ stdio: ["pipe", "pipe", "pipe"],
264
+ }).trim();
265
+ // Convert SSH to HTTPS
266
+ if (url.startsWith("git@")) {
267
+ url = url.replace(/^git@([^:]+):/, "https://$1/");
268
+ }
269
+ // Strip .git suffix
270
+ url = url.replace(/\.git$/, "");
271
+ return url;
272
+ }
273
+ catch {
274
+ return null;
275
+ }
276
+ }
277
+ export function readReadmeContent(readmePath) {
278
+ if (!readmePath || !existsSync(readmePath))
279
+ return "";
280
+ try {
281
+ const content = readFileSync(readmePath, "utf-8");
282
+ const MAX_SIZE = 512 * 1024;
283
+ if (content.length > MAX_SIZE) {
284
+ console.warn(`Warning: README truncated to 512KB (was ${content.length} bytes)`);
285
+ return content.slice(0, MAX_SIZE);
286
+ }
287
+ return content;
288
+ }
289
+ catch {
290
+ return "";
291
+ }
292
+ }
293
+ //# sourceMappingURL=detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.js","sourceRoot":"","sources":["../src/detection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAwE/B;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CACnB,sDAAsD,YAAY,aAAa,EAC/E,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvE,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAiB;IACpC,OAAO,GAAG,CAAC,YAAY,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAC/E,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,SAAiB;IAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,SAAS,mBAAmB,CAAC,CAAC;IACzE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC3C,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAExD,qDAAqD;IACrD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CACpC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAC7D,CAAC;IAEF,6DAA6D;IAC7D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9D,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3B,+DAA+D;QAC/D,iFAAiF;QACjF,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACpF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAExB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAErD,OAAO;YACH,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC;YAC7C,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;YACnF,IAAI,EAAE,WAAW;YACjB,eAAe,EAAE,IAAI;SACxB,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAyB;IAC1D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAElE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACjF,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,KAA4B;IACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE/C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAC/B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,EAAE,CAAC;IAEb,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,GAAG,CAAC,CAAC;YAC/C,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACnC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;aACpC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,2CAA2C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAA4B;IACvD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE/C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAC/B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,MAAM,KAAK,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACxB,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;QAE1B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,GAAG,CAAC,CAAC;gBAC/C,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACnC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBAClB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9B,CAAC;YACL,CAAC;QACL,CAAC;QACD,KAAK,GAAG,SAAS,CAAC;IACtB,CAAC;IAED,IAAI,SAAS,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,2CAA2C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,gFAAgF;IAChF,+EAA+E;IAC/E,wDAAwD;IACxD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAyB;IAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACjD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,cAAc,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;IAEtF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,CAAC;IAEjF,OAAO;QACH,UAAU,EAAE,YAAY;QACxB,WAAW,EAAE,cAAc;QAC3B,SAAS,EAAE,eAAe;KAC7B,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAe;IACxD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEpD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC3B,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC3C,IAAI,CAAC;QACD,IAAI,GAAG,GAAG,QAAQ,CAAC,2BAA2B,EAAE;YAC5C,GAAG,EAAE,OAAO;YACZ,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,uBAAuB;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QACtD,CAAC;QACD,oBAAoB;QACpB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,GAAG,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAyB;IACvD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACtD,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,2CAA2C,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;YACjF,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { type ContractInfo, type DeploymentOrder, type DeploymentOrderLayered, detectContracts, buildDependencyGraph, toposort, toposortLayers, createCrateToPackageMap, detectDeploymentOrder, detectDeploymentOrderLayered, readCdmPackage, getGitRemoteUrl, readReadmeContent, } from "./detection";
2
+ export { type BuildResult, type BuildProgressCallback, pvmContractBuild, pvmContractBuildAsync, } from "./builder";
3
+ export { type AbiParam, type AbiEntry, type Metadata, ContractDeployer, } from "./deployer";
4
+ export { MetadataPublisher } from "./publisher";
5
+ export { getRegistryContract, type RegistryContract, RegistryManager, } from "./registry";
6
+ export { computeCid } from "./cid";
7
+ export { GAS_LIMIT, STORAGE_DEPOSIT_LIMIT, CONTRACTS_REGISTRY_CRATE } from "@dotdm/utils";
8
+ export { getCdmRoot, getContractDir, type SaveContractOptions, saveContract, resolveContractAbiPath, } from "./store";
9
+ export { type CdmJsonTarget, type CdmJson, computeTargetHash, readCdmJson, writeCdmJson, } from "./cdm-json";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC5B,cAAc,EACd,eAAe,EACf,iBAAiB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,gBAAgB,EAChB,qBAAqB,GACxB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACH,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,gBAAgB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACH,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,eAAe,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAE1F,OAAO,EACH,UAAU,EACV,cAAc,EACd,KAAK,mBAAmB,EACxB,YAAY,EACZ,sBAAsB,GACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,GACf,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { detectContracts, buildDependencyGraph, toposort, toposortLayers, createCrateToPackageMap, detectDeploymentOrder, detectDeploymentOrderLayered, readCdmPackage, getGitRemoteUrl, readReadmeContent, } from "./detection";
2
+ export { pvmContractBuild, pvmContractBuildAsync, } from "./builder";
3
+ export { ContractDeployer, } from "./deployer";
4
+ export { MetadataPublisher } from "./publisher";
5
+ export { getRegistryContract, RegistryManager, } from "./registry";
6
+ export { computeCid } from "./cid";
7
+ export { GAS_LIMIT, STORAGE_DEPOSIT_LIMIT, CONTRACTS_REGISTRY_CRATE } from "@dotdm/utils";
8
+ export { getCdmRoot, getContractDir, saveContract, resolveContractAbiPath, } from "./store";
9
+ export { computeTargetHash, readCdmJson, writeCdmJson, } from "./cdm-json";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC5B,cAAc,EACd,eAAe,EACf,iBAAiB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAGH,gBAAgB,EAChB,qBAAqB,GACxB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAIH,gBAAgB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACH,mBAAmB,EAEnB,eAAe,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAE1F,OAAO,EACH,UAAU,EACV,cAAc,EAEd,YAAY,EACZ,sBAAsB,GACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAGH,iBAAiB,EACjB,WAAW,EACX,YAAY,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { TypedApi } from "polkadot-api";
2
+ import { Bulletin } from "@polkadot-api/descriptors";
3
+ import { prepareSigner } from "@dotdm/env";
4
+ import type { Metadata } from "./deployer";
5
+ export declare class MetadataPublisher {
6
+ signer: ReturnType<typeof prepareSigner>;
7
+ bulletinApi: TypedApi<Bulletin>;
8
+ constructor(signer: ReturnType<typeof prepareSigner>, api: TypedApi<Bulletin>);
9
+ publish(metadata: Metadata): Promise<{
10
+ cid: string;
11
+ blockNumber: number;
12
+ txHash: string;
13
+ blockHash: string;
14
+ }>;
15
+ /**
16
+ * Publish metadata for multiple contracts in a single Utility.batch_all transaction.
17
+ */
18
+ publishBatch(metadataList: Metadata[]): Promise<{
19
+ cids: string[];
20
+ blockNumber: number;
21
+ txHash: string;
22
+ blockHash: string;
23
+ }>;
24
+ }
25
+ //# sourceMappingURL=publisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../src/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAU,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,iBAAiB;IACnB,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACzC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAE3B,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAKvE,OAAO,CACT,QAAQ,EAAE,QAAQ,GACnB,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IA4BnF;;OAEG;IACG,YAAY,CACd,YAAY,EAAE,QAAQ,EAAE,GACzB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAyDzF"}
@@ -0,0 +1,84 @@
1
+ import { Binary } from "polkadot-api";
2
+ import { CID } from "multiformats/cid";
3
+ import { stringifyBigInt } from "@dotdm/utils";
4
+ export class MetadataPublisher {
5
+ signer;
6
+ bulletinApi;
7
+ constructor(signer, api) {
8
+ this.signer = signer;
9
+ this.bulletinApi = api;
10
+ }
11
+ async publish(metadata) {
12
+ const jsonString = JSON.stringify(metadata);
13
+ const data = Binary.fromText(jsonString);
14
+ const result = await this.bulletinApi.tx.TransactionStorage.store({
15
+ data,
16
+ }).signAndSubmit(this.signer);
17
+ const storedEvents = this.bulletinApi.event.TransactionStorage.Stored.filter(result.events);
18
+ if (storedEvents.length === 0) {
19
+ throw new Error("Metadata publishing failed - no Stored event found");
20
+ }
21
+ const { cid: cidBytes } = storedEvents[0];
22
+ if (!cidBytes) {
23
+ throw new Error("Metadata publishing failed - no CID in Stored event");
24
+ }
25
+ // cidBytes is a Binary (Vec<u8> from the chain) containing serialized CIDv1
26
+ const cid = CID.decode(cidBytes.asBytes());
27
+ return {
28
+ cid: cid.toString(),
29
+ blockNumber: result.block.number,
30
+ txHash: result.txHash,
31
+ blockHash: result.block.hash,
32
+ };
33
+ }
34
+ /**
35
+ * Publish metadata for multiple contracts in a single Utility.batch_all transaction.
36
+ */
37
+ async publishBatch(metadataList) {
38
+ if (metadataList.length === 0)
39
+ return { cids: [], blockNumber: 0, txHash: "", blockHash: "" };
40
+ if (metadataList.length === 1) {
41
+ const result = await this.publish(metadataList[0]);
42
+ return {
43
+ cids: [result.cid],
44
+ blockNumber: result.blockNumber,
45
+ txHash: result.txHash,
46
+ blockHash: result.blockHash,
47
+ };
48
+ }
49
+ const txs = metadataList.map((metadata) => {
50
+ const jsonString = JSON.stringify(metadata);
51
+ const data = Binary.fromText(jsonString);
52
+ return this.bulletinApi.tx.TransactionStorage.store({ data });
53
+ });
54
+ const calls = await Promise.all(txs.map(async (tx) => {
55
+ const call = tx.decodedCall;
56
+ return call instanceof Promise ? await call : call;
57
+ }));
58
+ const result = await this.bulletinApi.tx.Utility.batch_all({
59
+ calls,
60
+ }).signAndSubmit(this.signer);
61
+ const failures = this.bulletinApi.event.System.ExtrinsicFailed.filter(result.events);
62
+ if (failures.length > 0) {
63
+ throw new Error(`Batch metadata publish failed: ${stringifyBigInt(failures[0])}`);
64
+ }
65
+ const storedEvents = this.bulletinApi.event.TransactionStorage.Stored.filter(result.events);
66
+ if (storedEvents.length !== metadataList.length) {
67
+ throw new Error(`Expected ${metadataList.length} Stored events, got ${storedEvents.length}`);
68
+ }
69
+ const cids = storedEvents.map((event) => {
70
+ const { cid: cidBytes } = event;
71
+ if (!cidBytes) {
72
+ throw new Error("Metadata publishing failed - no CID in Stored event");
73
+ }
74
+ return CID.decode(cidBytes.asBytes()).toString();
75
+ });
76
+ return {
77
+ cids,
78
+ blockNumber: result.block.number,
79
+ txHash: result.txHash,
80
+ blockHash: result.block.hash,
81
+ };
82
+ }
83
+ }
84
+ //# sourceMappingURL=publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.js","sourceRoot":"","sources":["../src/publisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import { PolkadotClient, TypedApi } from "polkadot-api";
2
+ import { AssetHub } from "@polkadot-api/descriptors";
3
+ import { prepareSigner } from "@dotdm/env";
4
+ export declare function getRegistryContract(client: PolkadotClient, addr: string): import("@polkadot-api/sdk-ink").ContractSdk<import("polkadot-api/ink").InkDescriptors<{}, {
5
+ publishLatest: {
6
+ message: {
7
+ "contract_name": string;
8
+ "contract_address": import("polkadot-api").HexString;
9
+ "metadata_uri": string;
10
+ };
11
+ response: {};
12
+ };
13
+ getAddress: {
14
+ message: {
15
+ "contract_name": string;
16
+ };
17
+ response: {
18
+ "isSome": boolean;
19
+ "value": import("polkadot-api").HexString;
20
+ };
21
+ };
22
+ getMetadataUri: {
23
+ message: {
24
+ "contract_name": string;
25
+ };
26
+ response: {
27
+ "isSome": boolean;
28
+ "value": string;
29
+ };
30
+ };
31
+ getAddressAtVersion: {
32
+ message: {
33
+ "contract_name": string;
34
+ "version": number;
35
+ };
36
+ response: {
37
+ "isSome": boolean;
38
+ "value": import("polkadot-api").HexString;
39
+ };
40
+ };
41
+ getMetadataUriAtVersion: {
42
+ message: {
43
+ "contract_name": string;
44
+ "version": number;
45
+ };
46
+ response: {
47
+ "isSome": boolean;
48
+ "value": string;
49
+ };
50
+ };
51
+ getContractNameAt: {
52
+ message: {
53
+ "index": number;
54
+ };
55
+ response: string;
56
+ };
57
+ getOwner: {
58
+ message: {
59
+ "contract_name": string;
60
+ };
61
+ response: import("polkadot-api").HexString;
62
+ };
63
+ getVersionCount: {
64
+ message: {
65
+ "contract_name": string;
66
+ };
67
+ response: number;
68
+ };
69
+ getContractCount: {
70
+ message: {};
71
+ response: number;
72
+ };
73
+ }, {
74
+ new: {
75
+ message: {};
76
+ response: {};
77
+ };
78
+ }, never>>;
79
+ export type RegistryContract = ReturnType<typeof getRegistryContract>;
80
+ export declare class RegistryManager {
81
+ signer: ReturnType<typeof prepareSigner>;
82
+ api: TypedApi<AssetHub>;
83
+ client: PolkadotClient;
84
+ registry: RegistryContract;
85
+ constructor(signer: ReturnType<typeof prepareSigner>, api: TypedApi<AssetHub>, client: PolkadotClient, registryAddress: string);
86
+ /**
87
+ * Register a contract in the contracts registry via ink SDK.
88
+ */
89
+ register(cdmPackage: string, contractAddr: string, metadataUri?: string): Promise<{
90
+ txHash: string;
91
+ blockHash: string;
92
+ }>;
93
+ /**
94
+ * Register multiple contracts in a single Utility.batch_all transaction.
95
+ */
96
+ registerBatch(entries: {
97
+ cdmPackage: string;
98
+ contractAddr: string;
99
+ metadataUri: string;
100
+ }[]): Promise<{
101
+ txHash: string;
102
+ blockHash: string;
103
+ }>;
104
+ }
105
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAa,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAGvE;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,qBAAa,eAAe;IACjB,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACzC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;gBAG9B,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EACxC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,EACvB,MAAM,EAAE,cAAc,EACtB,eAAe,EAAE,MAAM;IAQ3B;;OAEG;IACG,QAAQ,CACV,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,WAAW,GAAE,MAAW,GACzB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBjD;;OAEG;IACG,aAAa,CACf,OAAO,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACvB,EAAE,GACJ,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CA2CpD"}
@@ -0,0 +1,74 @@
1
+ import { contracts } from "@polkadot-api/descriptors";
2
+ import { createInkSdk } from "@polkadot-api/sdk-ink";
3
+ import { stringifyBigInt, GAS_LIMIT, STORAGE_DEPOSIT_LIMIT } from "@dotdm/utils";
4
+ export function getRegistryContract(client, addr) {
5
+ const inkSdk = createInkSdk(client);
6
+ return inkSdk.getContract(contracts.contractsRegistry, addr);
7
+ }
8
+ export class RegistryManager {
9
+ signer;
10
+ api;
11
+ client;
12
+ registry;
13
+ constructor(signer, api, client, registryAddress) {
14
+ this.signer = signer;
15
+ this.api = api;
16
+ this.client = client;
17
+ this.registry = getRegistryContract(client, registryAddress);
18
+ }
19
+ /**
20
+ * Register a contract in the contracts registry via ink SDK.
21
+ */
22
+ async register(cdmPackage, contractAddr, metadataUri = "") {
23
+ const result = await this.registry
24
+ .send("publishLatest", {
25
+ data: {
26
+ contract_name: cdmPackage,
27
+ contract_address: contractAddr,
28
+ metadata_uri: metadataUri,
29
+ },
30
+ gasLimit: {
31
+ ref_time: GAS_LIMIT.refTime,
32
+ proof_size: GAS_LIMIT.proofSize,
33
+ },
34
+ storageDepositLimit: STORAGE_DEPOSIT_LIMIT,
35
+ })
36
+ .signAndSubmit(this.signer);
37
+ return { txHash: result.txHash, blockHash: result.block.hash };
38
+ }
39
+ /**
40
+ * Register multiple contracts in a single Utility.batch_all transaction.
41
+ */
42
+ async registerBatch(entries) {
43
+ if (entries.length === 0)
44
+ return { txHash: "", blockHash: "" };
45
+ if (entries.length === 1) {
46
+ return this.register(entries[0].cdmPackage, entries[0].contractAddr, entries[0].metadataUri);
47
+ }
48
+ const txs = entries.map((entry) => this.registry.send("publishLatest", {
49
+ data: {
50
+ contract_name: entry.cdmPackage,
51
+ contract_address: entry.contractAddr,
52
+ metadata_uri: entry.metadataUri,
53
+ },
54
+ gasLimit: {
55
+ ref_time: GAS_LIMIT.refTime,
56
+ proof_size: GAS_LIMIT.proofSize,
57
+ },
58
+ storageDepositLimit: STORAGE_DEPOSIT_LIMIT,
59
+ }));
60
+ const calls = await Promise.all(txs.map(async (tx) => {
61
+ const call = tx.decodedCall;
62
+ return call instanceof Promise ? await call : call;
63
+ }));
64
+ const result = await this.api.tx.Utility.batch_all({
65
+ calls,
66
+ }).signAndSubmit(this.signer);
67
+ const failures = this.api.event.System.ExtrinsicFailed.filter(result.events);
68
+ if (failures.length > 0) {
69
+ throw new Error(`Batch register failed: ${stringifyBigInt(failures[0])}`);
70
+ }
71
+ return { txHash: result.txHash, blockHash: result.block.hash };
72
+ }
73
+ }
74
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}