@0xward/cultos-utils 1.0.5 → 1.0.7

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/LICENSE CHANGED
@@ -2,4 +2,20 @@ MIT License
2
2
 
3
3
  Copyright (c) 2026 0xward
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files, to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software... Full MIT Granted.
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
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.7";
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.7",
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": [
@@ -20,5 +20,10 @@
20
20
  "bugs": {
21
21
  "url": "https://github.com/0xward/cultos-utils/issues"
22
22
  },
23
- "homepage": "https://www.npmjs.com/package/@0xward/cultos-utils#readme"
23
+ "homepage": "https://www.npmjs.com/package/@0xward/cultos-utils#readme",
24
+ "files": [
25
+ "index.js",
26
+ "README.md",
27
+ "LICENSE"
28
+ ]
24
29
  }
@@ -1,66 +0,0 @@
1
- # This workflow uses actions that are not certified by GitHub.
2
- # They are provided by a third-party and are governed by
3
- # separate terms of service, privacy policy, and support
4
- # documentation.
5
-
6
- # This workflow lets you generate SLSA provenance file for your project.
7
- # The generation satisfies level 3 for the provenance requirements - see https://slsa.dev/spec/v0.1/requirements
8
- # The project is an initiative of the OpenSSF (openssf.org) and is developed at
9
- # https://github.com/slsa-framework/slsa-github-generator.
10
- # The provenance file can be verified using https://github.com/slsa-framework/slsa-verifier.
11
- # For more information about SLSA and how it improves the supply-chain, visit slsa.dev.
12
-
13
- name: SLSA generic generator
14
- on:
15
- workflow_dispatch:
16
- release:
17
- types: [created]
18
-
19
- jobs:
20
- build:
21
- runs-on: ubuntu-latest
22
- outputs:
23
- digests: ${{ steps.hash.outputs.digests }}
24
-
25
- steps:
26
- - uses: actions/checkout@v4
27
-
28
- # ========================================================
29
- #
30
- # Step 1: Build your artifacts.
31
- #
32
- # ========================================================
33
- - name: Build artifacts
34
- run: |
35
- # These are some amazing artifacts.
36
- echo "artifact1" > artifact1
37
- echo "artifact2" > artifact2
38
-
39
- # ========================================================
40
- #
41
- # Step 2: Add a step to generate the provenance subjects
42
- # as shown below. Update the sha256 sum arguments
43
- # to include all binaries that you generate
44
- # provenance for.
45
- #
46
- # ========================================================
47
- - name: Generate subject for provenance
48
- id: hash
49
- run: |
50
- set -euo pipefail
51
-
52
- # List the artifacts the provenance will refer to.
53
- files=$(ls artifact*)
54
- # Generate the subjects (base64 encoded).
55
- echo "hashes=$(sha256sum $files | base64 -w0)" >> "${GITHUB_OUTPUT}"
56
-
57
- provenance:
58
- needs: [build]
59
- permissions:
60
- actions: read # To read the workflow path.
61
- id-token: write # To sign the provenance.
62
- contents: write # To add assets to a release.
63
- uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.4.0
64
- with:
65
- base64-subjects: "${{ needs.build.outputs.digests }}"
66
- upload-assets: true # Optional: Upload to a new release
@@ -1,14 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="120" height="120">
2
- <style>
3
- .layer { fill: none; stroke: #888888; stroke-width: 2; transform-origin: center; }
4
- .l1 { animation: slide 3s ease-in-out infinite; }
5
- .l2 { animation: slide 3s ease-in-out infinite; animation-delay: 1s; }
6
- .l3 { animation: slide 3s ease-in-out infinite; animation-delay: 2s; }
7
- @keyframes slide { 0%, 100% { transform: translateY(0px) scale(0.9); opacity: 0.4; } 50% { transform: translateY(-5px) scale(1); opacity: 0.9; } }
8
- </style>
9
- <g>
10
- <polygon points="50,20 80,35 50,50 20,35" class="layer l1" />
11
- <polygon points="50,40 80,55 50,70 20,55" class="layer l2" />
12
- <polygon points="50,60 80,75 50,90 20,75" class="layer l3" />
13
- </g>
14
- </svg>
@@ -1,5 +0,0 @@
1
- const { CultOSUtils } = require("../index.js");
2
- console.log("🚀 Generating Cult Meme Coin Metadata on Stacks...");
3
- const meta = CultOSUtils.generateMemeMetadata("WAGMI Cult", "WAGMIC");
4
- console.log("Metadata Created:", meta);
5
- console.log("✅ [cultos-utils] Demo running successfully!");