number-guess-sdk 1.0.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.
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # number-guess-sdk
2
+
3
+ TypeScript SDK bundled inside the Number Guess app repository for interacting with the Number Guess contract on Stacks.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install number-guess-sdk
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import { getLeaderboard, getTotalGuesses, createGuessCall } from "number-guess-sdk";
15
+
16
+ const total = await getTotalGuesses();
17
+ const leaderboard = await getLeaderboard();
18
+ const tx = createGuessCall(42);
19
+ ```
20
+
21
+ ## License
22
+
23
+ MIT
24
+ ## Core Methods
25
+
26
+ - `getTotalGuesses()`
27
+ - `getTotalWins()`
28
+ - `getUserGuesses(address)`
29
+ - `getUserWins(address)`
30
+ - `getUserLastGuess(address)`
31
+ - `getUserLastTarget(address)`
32
+ - `createGuessCall(value)`
@@ -0,0 +1,23 @@
1
+ import type { NumberGuessConfig, LeaderEntry, ReadOnlyResponse, GuessCall } from "./types";
2
+ export declare const DEFAULT_CONFIG: Required<NumberGuessConfig>;
3
+ export declare function callReadOnly(functionName: string, args?: string[], config?: NumberGuessConfig): Promise<ReadOnlyResponse>;
4
+ export declare function getTotalGuesses(config?: NumberGuessConfig): Promise<number>;
5
+ export declare function getTotalWins(config?: NumberGuessConfig): Promise<number>;
6
+ export declare function getUserGuesses(userAddress: string, config?: NumberGuessConfig): Promise<number>;
7
+ export declare function getUserWins(userAddress: string, config?: NumberGuessConfig): Promise<number>;
8
+ export declare function getUserLastGuess(userAddress: string, config?: NumberGuessConfig): Promise<number>;
9
+ export declare function getUserLastTarget(userAddress: string, config?: NumberGuessConfig): Promise<number>;
10
+ export declare function getLeaderboard(config?: NumberGuessConfig): Promise<LeaderEntry[]>;
11
+ export declare function createGuessCall(value: number, config?: NumberGuessConfig): GuessCall;
12
+ export declare class NumberGuessClient {
13
+ private readonly config;
14
+ constructor(config?: NumberGuessConfig);
15
+ getTotalGuesses(): Promise<number>;
16
+ getTotalWins(): Promise<number>;
17
+ getUserGuesses(userAddress: string): Promise<number>;
18
+ getUserWins(userAddress: string): Promise<number>;
19
+ getUserLastGuess(userAddress: string): Promise<number>;
20
+ getUserLastTarget(userAddress: string): Promise<number>;
21
+ getLeaderboard(): Promise<LeaderEntry[]>;
22
+ createGuessCall(value: number): GuessCall;
23
+ }
package/dist/client.js ADDED
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NumberGuessClient = exports.DEFAULT_CONFIG = void 0;
4
+ exports.callReadOnly = callReadOnly;
5
+ exports.getTotalGuesses = getTotalGuesses;
6
+ exports.getTotalWins = getTotalWins;
7
+ exports.getUserGuesses = getUserGuesses;
8
+ exports.getUserWins = getUserWins;
9
+ exports.getUserLastGuess = getUserLastGuess;
10
+ exports.getUserLastTarget = getUserLastTarget;
11
+ exports.getLeaderboard = getLeaderboard;
12
+ exports.createGuessCall = createGuessCall;
13
+ const network_1 = require("@stacks/network");
14
+ const transactions_1 = require("@stacks/transactions");
15
+ exports.DEFAULT_CONFIG = {
16
+ contractAddress: "SP1Q7YR67R6WGP28NXDJD1WZ11REPAAXRJJ3V6RKM",
17
+ contractName: "number-guess",
18
+ apiBase: "https://api.mainnet.hiro.so",
19
+ network: network_1.STACKS_MAINNET,
20
+ };
21
+ function resolveConfig(overrides = {}) {
22
+ return { ...exports.DEFAULT_CONFIG, ...overrides };
23
+ }
24
+ function serializeCvToHex(cv) {
25
+ const serialized = (0, transactions_1.serializeCV)(cv);
26
+ if (typeof serialized === "string") {
27
+ return serialized.startsWith("0x") ? serialized : `0x${serialized}`;
28
+ }
29
+ return `0x${Buffer.from(serialized).toString("hex")}`;
30
+ }
31
+ function extractNumericValue(result) {
32
+ const clarityValue = (0, transactions_1.hexToCV)(result);
33
+ const parsed = (0, transactions_1.cvToValue)(clarityValue, true);
34
+ return Number(parsed && typeof parsed === "object" && "value" in parsed
35
+ ? parsed.value ?? 0
36
+ : parsed ?? 0);
37
+ }
38
+ function normalizeLeaderboardValue(raw) {
39
+ const entries = Array.isArray(raw) ? raw : [];
40
+ return entries
41
+ .map(item => {
42
+ const entry = item && typeof item === "object" && "value" in item
43
+ ? item.value
44
+ : item;
45
+ const record = entry;
46
+ return {
47
+ who: String(record?.who && typeof record.who === "object" ? record.who.value ?? "" : record?.who ?? ""),
48
+ wins: Number(record?.wins && typeof record.wins === "object"
49
+ ? record.wins.value ?? 0
50
+ : record?.wins ?? 0),
51
+ };
52
+ })
53
+ .filter(entry => entry.who && entry.wins > 0);
54
+ }
55
+ async function callReadOnly(functionName, args = [], config = {}) {
56
+ const resolved = resolveConfig(config);
57
+ const response = await fetch(`${resolved.apiBase}/v2/contracts/call-read/${resolved.contractAddress}/${resolved.contractName}/${functionName}`, {
58
+ method: "POST",
59
+ headers: { "Content-Type": "application/json" },
60
+ body: JSON.stringify({
61
+ sender: resolved.contractAddress,
62
+ arguments: args,
63
+ }),
64
+ });
65
+ if (!response.ok) {
66
+ throw new Error(`Read-only call failed with status ${response.status}`);
67
+ }
68
+ return response.json();
69
+ }
70
+ async function getTotalGuesses(config = {}) {
71
+ const data = await callReadOnly("get-total-guesses", [], config);
72
+ return data.okay && data.result ? extractNumericValue(data.result) : 0;
73
+ }
74
+ async function getTotalWins(config = {}) {
75
+ const data = await callReadOnly("get-total-wins", [], config);
76
+ return data.okay && data.result ? extractNumericValue(data.result) : 0;
77
+ }
78
+ async function getUserGuesses(userAddress, config = {}) {
79
+ const principalArg = serializeCvToHex((0, transactions_1.principalCV)(userAddress));
80
+ const data = await callReadOnly("get-user-guesses", [principalArg], config);
81
+ return data.okay && data.result ? extractNumericValue(data.result) : 0;
82
+ }
83
+ async function getUserWins(userAddress, config = {}) {
84
+ const principalArg = serializeCvToHex((0, transactions_1.principalCV)(userAddress));
85
+ const data = await callReadOnly("get-user-wins", [principalArg], config);
86
+ return data.okay && data.result ? extractNumericValue(data.result) : 0;
87
+ }
88
+ async function getUserLastGuess(userAddress, config = {}) {
89
+ const principalArg = serializeCvToHex((0, transactions_1.principalCV)(userAddress));
90
+ const data = await callReadOnly("get-user-last-guess", [principalArg], config);
91
+ return data.okay && data.result ? extractNumericValue(data.result) : 0;
92
+ }
93
+ async function getUserLastTarget(userAddress, config = {}) {
94
+ const principalArg = serializeCvToHex((0, transactions_1.principalCV)(userAddress));
95
+ const data = await callReadOnly("get-user-last-target", [principalArg], config);
96
+ return data.okay && data.result ? extractNumericValue(data.result) : 0;
97
+ }
98
+ async function getLeaderboard(config = {}) {
99
+ const data = await callReadOnly("get-leaderboard", [], config);
100
+ if (!data.okay || !data.result) {
101
+ return [];
102
+ }
103
+ const clarityValue = (0, transactions_1.hexToCV)(data.result);
104
+ const parsed = (0, transactions_1.cvToValue)(clarityValue, true);
105
+ return normalizeLeaderboardValue(parsed);
106
+ }
107
+ function createGuessCall(value, config = {}) {
108
+ const resolved = resolveConfig(config);
109
+ return {
110
+ contractAddress: resolved.contractAddress,
111
+ contractName: resolved.contractName,
112
+ functionName: "guess",
113
+ functionArgs: [(0, transactions_1.uintCV)(Math.max(1, Math.min(100, Math.floor(value))))],
114
+ postConditionMode: transactions_1.PostConditionMode.Deny,
115
+ postConditions: [],
116
+ network: resolved.network,
117
+ };
118
+ }
119
+ class NumberGuessClient {
120
+ constructor(config = {}) {
121
+ this.config = resolveConfig(config);
122
+ }
123
+ getTotalGuesses() {
124
+ return getTotalGuesses(this.config);
125
+ }
126
+ getTotalWins() {
127
+ return getTotalWins(this.config);
128
+ }
129
+ getUserGuesses(userAddress) {
130
+ return getUserGuesses(userAddress, this.config);
131
+ }
132
+ getUserWins(userAddress) {
133
+ return getUserWins(userAddress, this.config);
134
+ }
135
+ getUserLastGuess(userAddress) {
136
+ return getUserLastGuess(userAddress, this.config);
137
+ }
138
+ getUserLastTarget(userAddress) {
139
+ return getUserLastTarget(userAddress, this.config);
140
+ }
141
+ getLeaderboard() {
142
+ return getLeaderboard(this.config);
143
+ }
144
+ createGuessCall(value) {
145
+ return createGuessCall(value, this.config);
146
+ }
147
+ }
148
+ exports.NumberGuessClient = NumberGuessClient;
@@ -0,0 +1,2 @@
1
+ export type { NumberGuessConfig, LeaderEntry, ReadOnlyResponse, GuessCall } from "./types";
2
+ export { DEFAULT_CONFIG, NumberGuessClient, callReadOnly, getTotalGuesses, getTotalWins, getUserGuesses, getUserWins, getUserLastGuess, getUserLastTarget, getLeaderboard, createGuessCall, } from "./client";
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGuessCall = exports.getLeaderboard = exports.getUserLastTarget = exports.getUserLastGuess = exports.getUserWins = exports.getUserGuesses = exports.getTotalWins = exports.getTotalGuesses = exports.callReadOnly = exports.NumberGuessClient = exports.DEFAULT_CONFIG = void 0;
4
+ var client_1 = require("./client");
5
+ Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return client_1.DEFAULT_CONFIG; } });
6
+ Object.defineProperty(exports, "NumberGuessClient", { enumerable: true, get: function () { return client_1.NumberGuessClient; } });
7
+ Object.defineProperty(exports, "callReadOnly", { enumerable: true, get: function () { return client_1.callReadOnly; } });
8
+ Object.defineProperty(exports, "getTotalGuesses", { enumerable: true, get: function () { return client_1.getTotalGuesses; } });
9
+ Object.defineProperty(exports, "getTotalWins", { enumerable: true, get: function () { return client_1.getTotalWins; } });
10
+ Object.defineProperty(exports, "getUserGuesses", { enumerable: true, get: function () { return client_1.getUserGuesses; } });
11
+ Object.defineProperty(exports, "getUserWins", { enumerable: true, get: function () { return client_1.getUserWins; } });
12
+ Object.defineProperty(exports, "getUserLastGuess", { enumerable: true, get: function () { return client_1.getUserLastGuess; } });
13
+ Object.defineProperty(exports, "getUserLastTarget", { enumerable: true, get: function () { return client_1.getUserLastTarget; } });
14
+ Object.defineProperty(exports, "getLeaderboard", { enumerable: true, get: function () { return client_1.getLeaderboard; } });
15
+ Object.defineProperty(exports, "createGuessCall", { enumerable: true, get: function () { return client_1.createGuessCall; } });
@@ -0,0 +1,26 @@
1
+ import type { StacksNetwork } from "@stacks/network";
2
+ import type { ClarityValue, PostCondition, PostConditionMode } from "@stacks/transactions";
3
+ export interface NumberGuessConfig {
4
+ contractAddress?: string;
5
+ contractName?: string;
6
+ apiBase?: string;
7
+ network?: StacksNetwork;
8
+ }
9
+ export interface LeaderEntry {
10
+ who: string;
11
+ wins: number;
12
+ }
13
+ export interface ReadOnlyResponse {
14
+ okay?: boolean;
15
+ result?: string;
16
+ cause?: string;
17
+ }
18
+ export interface GuessCall {
19
+ contractAddress: string;
20
+ contractName: string;
21
+ functionName: "guess";
22
+ functionArgs: ClarityValue[];
23
+ postConditionMode: PostConditionMode;
24
+ postConditions: PostCondition[];
25
+ network: StacksNetwork;
26
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "number-guess-sdk",
3
+ "version": "1.0.0",
4
+ "description": "TypeScript SDK for interacting with the Number Guess smart contract on Stacks blockchain",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "prepublishOnly": "npm run build"
13
+ },
14
+ "keywords": [
15
+ "stacks",
16
+ "blockchain",
17
+ "number-guess",
18
+ "guessing-game",
19
+ "sdk",
20
+ "smart-contract",
21
+ "web3",
22
+ "dapp",
23
+ "stacks-blockchain",
24
+ "typescript",
25
+ "on-chain",
26
+ "prediction-game",
27
+ "number-game"
28
+ ],
29
+ "author": "brventonbeshers-ship-it",
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/brventonbeshers-ship-it/number-guess.git",
34
+ "directory": "sdk"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/brventonbeshers-ship-it/number-guess/issues"
38
+ },
39
+ "homepage": "https://github.com/brventonbeshers-ship-it/number-guess/tree/main/sdk#readme",
40
+ "engines": {
41
+ "node": ">=18.0.0"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "dependencies": {
47
+ "@stacks/network": "^7.3.1",
48
+ "@stacks/transactions": "^7.3.1"
49
+ },
50
+ "devDependencies": {
51
+ "typescript": "^5.0.0"
52
+ }
53
+ }