@0xward/cultos-utils 1.0.5 → 1.0.6

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.
Files changed (2) hide show
  1. package/index.js +148 -4
  2. package/package.json +2 -2
package/index.js CHANGED
@@ -1,7 +1,151 @@
1
- // CultOS Utilities - AI meme coin generator framework for Stacks
1
+ // @0xward/cultos-utils
2
+ // AI-powered meme coin generator framework for the Stacks ecosystem (Bitcoin L2)
3
+ // SIP-10 compliant token metadata, viral factor scoring, and cult mechanics
4
+
5
+ const SIP10_STANDARD = "SIP-010";
6
+ const STACKS_ECOSYSTEM = "Stacks Bitcoin L2";
7
+ const DEFAULT_SUPPLY = "1000000000";
8
+ const MAX_TICKER_LENGTH = 8;
9
+ const MIN_TICKER_LENGTH = 2;
10
+ const MAX_NAME_LENGTH = 64;
11
+
12
+ const CULT_ARCHETYPES = {
13
+ degen: { viralMultiplier: 1.8, description: "High risk, high reward degenerate energy" },
14
+ meme: { viralMultiplier: 2.0, description: "Pure internet culture and meme propagation" },
15
+ oracle: { viralMultiplier: 1.5, description: "Mystical on-chain prophecy narrative" },
16
+ rebel: { viralMultiplier: 1.6, description: "Anti-establishment movement energy" },
17
+ cosmic: { viralMultiplier: 1.7, description: "Universal and transcendental branding" },
18
+ };
19
+
20
+ const TOKENOMICS_PRESETS = {
21
+ fair: { community: 80, team: 10, treasury: 10 },
22
+ stealth: { community: 95, team: 0, treasury: 5 },
23
+ vested: { community: 60, team: 20, treasury: 20 },
24
+ };
25
+
2
26
  class CultOSUtils {
3
- static generateMemeMetadata(name, ticker) {
4
- return { name: name, ticker: ticker, supply: "1000000000", sip10Standard: true, ecosystem: "Stacks Bitcoin L2" };
27
+ constructor(options = {}) {
28
+ this.ecosystem = options.ecosystem || STACKS_ECOSYSTEM;
29
+ this.standard = options.standard || SIP10_STANDARD;
30
+ this.version = "1.0.6";
31
+ }
32
+
33
+ _validateTicker(ticker) {
34
+ if (typeof ticker !== "string" || ticker.trim().length === 0) {
35
+ throw new Error("ticker must be a non-empty string.");
36
+ }
37
+ const clean = ticker.trim().toUpperCase();
38
+ if (clean.length < MIN_TICKER_LENGTH || clean.length > MAX_TICKER_LENGTH) {
39
+ throw new Error(
40
+ `ticker must be ${MIN_TICKER_LENGTH}–${MAX_TICKER_LENGTH} characters. Got: "${clean}" (${clean.length})`
41
+ );
42
+ }
43
+ if (!/^[A-Z0-9]+$/.test(clean)) {
44
+ throw new Error(`ticker must only contain uppercase letters and digits. Got: "${clean}"`);
45
+ }
46
+ return clean;
47
+ }
48
+
49
+ _validateName(name) {
50
+ if (typeof name !== "string" || name.trim().length === 0) {
51
+ throw new Error("name must be a non-empty string.");
52
+ }
53
+ if (name.trim().length > MAX_NAME_LENGTH) {
54
+ throw new Error(`name must not exceed ${MAX_NAME_LENGTH} characters.`);
55
+ }
56
+ return name.trim();
57
+ }
58
+
59
+ _validateSupply(supply) {
60
+ const s = String(supply || DEFAULT_SUPPLY).replace(/_/g, "");
61
+ if (!/^\d+$/.test(s) || BigInt(s) <= 0n) {
62
+ throw new Error(`supply must be a positive integer string. Got: "${supply}"`);
63
+ }
64
+ return s;
65
+ }
66
+
67
+ _computeViralScore(archetype, supply, nameLength) {
68
+ const base = CULT_ARCHETYPES[archetype]?.viralMultiplier || 1.0;
69
+ const supplyNum = Math.log10(parseFloat(supply) || 1);
70
+ const namePenalty = nameLength > 20 ? 0.9 : 1.0;
71
+ const raw = base * (supplyNum / 10) * namePenalty * 100;
72
+ return Math.min(Math.round(raw), 100);
73
+ }
74
+
75
+ static generateMemeMetadata(name, ticker, options = {}) {
76
+ const instance = new CultOSUtils(options);
77
+ return instance.generateMemeMetadata(name, ticker, options);
78
+ }
79
+
80
+ generateMemeMetadata(name, ticker, options = {}) {
81
+ const validName = this._validateName(name);
82
+ const validTicker = this._validateTicker(ticker);
83
+ const supply = this._validateSupply(options.supply);
84
+ const archetype = options.archetype || "meme";
85
+ const decimals = options.decimals ?? 6;
86
+ const preset = options.tokenomics || "fair";
87
+
88
+ if (!CULT_ARCHETYPES[archetype]) {
89
+ throw new Error(
90
+ `Unknown archetype: "${archetype}". Use: ${Object.keys(CULT_ARCHETYPES).join(", ")}.`
91
+ );
92
+ }
93
+ if (!TOKENOMICS_PRESETS[preset]) {
94
+ throw new Error(
95
+ `Unknown tokenomics preset: "${preset}". Use: ${Object.keys(TOKENOMICS_PRESETS).join(", ")}.`
96
+ );
97
+ }
98
+
99
+ const viralScore = this._computeViralScore(archetype, supply, validName.length);
100
+ const tokenomics = TOKENOMICS_PRESETS[preset];
101
+ const cultMeta = CULT_ARCHETYPES[archetype];
102
+
103
+ return {
104
+ name: validName,
105
+ ticker: validTicker,
106
+ supply,
107
+ decimals,
108
+ sip10Standard: this.standard,
109
+ ecosystem: this.ecosystem,
110
+ securedBy: "Bitcoin",
111
+ archetype,
112
+ archetypeDescription: cultMeta.description,
113
+ viralScore,
114
+ viralRating: viralScore >= 80 ? "Viral" : viralScore >= 50 ? "Growing" : "Niche",
115
+ tokenomics: {
116
+ preset,
117
+ communityPercent: tokenomics.community,
118
+ teamPercent: tokenomics.team,
119
+ treasuryPercent: tokenomics.treasury,
120
+ },
121
+ generatedAt: new Date().toISOString(),
122
+ sdkVersion: this.version,
123
+ };
124
+ }
125
+
126
+ computeViralFactor(metadata) {
127
+ if (!metadata || typeof metadata !== "object") {
128
+ throw new Error("metadata must be a valid object.");
129
+ }
130
+ if (!metadata.ticker || !metadata.name) {
131
+ throw new Error("metadata must include 'ticker' and 'name'.");
132
+ }
133
+ const archetype = metadata.archetype || "meme";
134
+ const supply = metadata.supply || DEFAULT_SUPPLY;
135
+ return this._computeViralScore(archetype, supply, metadata.name.length);
136
+ }
137
+
138
+ getCultArchetypes() {
139
+ return Object.entries(CULT_ARCHETYPES).map(([key, val]) => ({ id: key, ...val }));
140
+ }
141
+
142
+ getTokenomicsPresets() {
143
+ return Object.entries(TOKENOMICS_PRESETS).map(([key, val]) => ({ id: key, ...val }));
144
+ }
145
+
146
+ getVersion() {
147
+ return this.version;
5
148
  }
6
149
  }
7
- module.exports = { CultOSUtils };
150
+
151
+ module.exports = { CultOSUtils, CULT_ARCHETYPES, TOKENOMICS_PRESETS, SIP10_STANDARD };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xward/cultos-utils",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Futuristic AI-powered generator framework for viral internet-style cult meme coins in the Stacks ecosystem.",
5
5
  "main": "index.js",
6
6
  "keywords": [
@@ -21,4 +21,4 @@
21
21
  "url": "https://github.com/0xward/cultos-utils/issues"
22
22
  },
23
23
  "homepage": "https://www.npmjs.com/package/@0xward/cultos-utils#readme"
24
- }
24
+ }