@signals-protocol/v1-sdk 1.5.1 → 1.7.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/dist/index.d.ts CHANGED
@@ -6,8 +6,9 @@
6
6
  export { CLMSRSDK } from "./clmsr-sdk";
7
7
  export { CLMSRSDK as SignalsSDK } from "./clmsr-sdk";
8
8
  export { WADAmount, USDCAmount, Quantity, Tick, MarketDistributionRaw, MarketRaw, Market, MarketDistribution, Position, mapMarket, mapDistribution, OpenCostResult, IncreaseCostResult, DecreaseProceedsResult, CloseProceedsResult, ClaimResult, QuantityFromCostResult, QuantityFromProceedsResult, PositionValueResult, FeeInfo, ValidationError, CalculationError, } from "./types";
9
+ export { MarketOracleConfig, BTC_ORACLE_CONFIG, encodeFeedId } from "./oracle";
9
10
  export * as MathUtils from "./utils/math";
10
11
  export { toWAD, toMicroUSDC } from "./clmsr-sdk";
11
12
  export { createCLMSRSDK, createSignalsSDK } from "./clmsr-sdk";
12
13
  export * from "./share";
13
- export declare const VERSION = "1.5.1";
14
+ export declare const VERSION = "1.7.0";
package/dist/index.js CHANGED
@@ -41,7 +41,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
41
41
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
42
42
  };
43
43
  Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.VERSION = exports.createSignalsSDK = exports.createCLMSRSDK = exports.toMicroUSDC = exports.toWAD = exports.MathUtils = exports.CalculationError = exports.ValidationError = exports.mapDistribution = exports.mapMarket = exports.SignalsSDK = exports.CLMSRSDK = void 0;
44
+ exports.VERSION = exports.createSignalsSDK = exports.createCLMSRSDK = exports.toMicroUSDC = exports.toWAD = exports.MathUtils = exports.encodeFeedId = exports.BTC_ORACLE_CONFIG = exports.CalculationError = exports.ValidationError = exports.mapDistribution = exports.mapMarket = exports.SignalsSDK = exports.CLMSRSDK = void 0;
45
45
  // Export main SDK class
46
46
  var clmsr_sdk_1 = require("./clmsr-sdk");
47
47
  Object.defineProperty(exports, "CLMSRSDK", { enumerable: true, get: function () { return clmsr_sdk_1.CLMSRSDK; } });
@@ -55,6 +55,10 @@ Object.defineProperty(exports, "mapDistribution", { enumerable: true, get: funct
55
55
  // Errors
56
56
  Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return types_1.ValidationError; } });
57
57
  Object.defineProperty(exports, "CalculationError", { enumerable: true, get: function () { return types_1.CalculationError; } });
58
+ // Export oracle config helpers
59
+ var oracle_1 = require("./oracle");
60
+ Object.defineProperty(exports, "BTC_ORACLE_CONFIG", { enumerable: true, get: function () { return oracle_1.BTC_ORACLE_CONFIG; } });
61
+ Object.defineProperty(exports, "encodeFeedId", { enumerable: true, get: function () { return oracle_1.encodeFeedId; } });
58
62
  // Export utility functions
59
63
  exports.MathUtils = __importStar(require("./utils/math"));
60
64
  // Convenience functions
@@ -67,4 +71,4 @@ Object.defineProperty(exports, "createSignalsSDK", { enumerable: true, get: func
67
71
  // Share image VNode templates
68
72
  __exportStar(require("./share"), exports);
69
73
  // Version (keep in sync with package.json)
70
- exports.VERSION = "1.5.1";
74
+ exports.VERSION = "1.7.0";
@@ -0,0 +1,11 @@
1
+ export interface MarketOracleConfig {
2
+ feedId: `0x${string}`;
3
+ feedDecimals: number;
4
+ tickScale: bigint;
5
+ }
6
+ export declare function encodeFeedId(symbol: string): `0x${string}`;
7
+ export declare const BTC_ORACLE_CONFIG: {
8
+ readonly feedId: `0x${string}`;
9
+ readonly feedDecimals: 8;
10
+ readonly tickScale: 1000000n;
11
+ };
package/dist/oracle.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BTC_ORACLE_CONFIG = void 0;
4
+ exports.encodeFeedId = encodeFeedId;
5
+ const types_1 = require("./types");
6
+ const BYTES32_SIZE = 32;
7
+ const HEX_BYTE_LENGTH = 2;
8
+ const encoder = new TextEncoder();
9
+ function encodeFeedId(symbol) {
10
+ if (symbol.length === 0) {
11
+ throw new types_1.ValidationError("symbol must be non-empty");
12
+ }
13
+ const bytes = encoder.encode(symbol);
14
+ if (bytes.length > BYTES32_SIZE) {
15
+ throw new types_1.ValidationError("symbol exceeds 32 bytes");
16
+ }
17
+ const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(HEX_BYTE_LENGTH, "0")).join("");
18
+ return `0x${hex.padEnd(BYTES32_SIZE * HEX_BYTE_LENGTH, "0")}`;
19
+ }
20
+ exports.BTC_ORACLE_CONFIG = {
21
+ feedId: encodeFeedId("BTC"),
22
+ feedDecimals: 8,
23
+ tickScale: 1000000n,
24
+ };
@@ -0,0 +1,2 @@
1
+ export { buildProfileContextVNode } from "./profile-context-image";
2
+ export type { ProfileContextImageInput, ProfileContextTier } from "./types";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProfileContextVNode = void 0;
4
+ var profile_context_image_1 = require("./profile-context-image");
5
+ Object.defineProperty(exports, "buildProfileContextVNode", { enumerable: true, get: function () { return profile_context_image_1.buildProfileContextVNode; } });
@@ -0,0 +1,3 @@
1
+ import type { SatoriNode } from "../share/types";
2
+ import type { ProfileContextImageInput } from "./types";
3
+ export declare function buildProfileContextVNode(input: ProfileContextImageInput): SatoriNode;
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProfileContextVNode = buildProfileContextVNode;
4
+ const h_1 = require("../share/h");
5
+ const assets_1 = require("../share/assets");
6
+ const avatar_1 = require("../share/avatar");
7
+ const tier_theme_shared_1 = require("../share/tier-theme-shared");
8
+ const tier_badges_1 = require("./tier-badges");
9
+ const CARD_WIDTH = 1200;
10
+ const CARD_HEIGHT = 630;
11
+ const PAGE_BG = "#eef7ff";
12
+ const PRIMARY = "#1444c2";
13
+ const INK = "#242424";
14
+ const INK_MUTED = "#737373";
15
+ const AVATAR_BG = "#ffffff";
16
+ const AVATAR_BORDER = "#d9e6f5";
17
+ const AVATAR_SIZE = 240;
18
+ const HERO_LEFT = 80;
19
+ const HERO_RIGHT = 80;
20
+ const HERO_GAP = 48;
21
+ const IDENTITY_WIDTH = CARD_WIDTH - HERO_LEFT - HERO_RIGHT - AVATAR_SIZE - HERO_GAP;
22
+ function shortenAddress(address) {
23
+ const normalized = address.trim();
24
+ return `${normalized.slice(0, 6)}…${normalized.slice(-4)}`;
25
+ }
26
+ function resolveHandle(realHandle) {
27
+ const resolved = realHandle?.trim();
28
+ return resolved ? resolved : null;
29
+ }
30
+ function ellipsizeLongHandle(handle) {
31
+ if (handle.length <= 32)
32
+ return handle;
33
+ return `${handle.slice(0, 16)}…${handle.slice(-14)}`;
34
+ }
35
+ function buildIdentityText(input) {
36
+ const address = shortenAddress(input.address);
37
+ const handle = resolveHandle(input.realHandle);
38
+ if (!handle) {
39
+ return {
40
+ handle: address,
41
+ addressLine: null,
42
+ isAddressFallback: true,
43
+ sourceLength: address.length,
44
+ };
45
+ }
46
+ return {
47
+ handle: ellipsizeLongHandle(handle),
48
+ addressLine: address,
49
+ isAddressFallback: false,
50
+ sourceLength: handle.length,
51
+ };
52
+ }
53
+ function getHandleFontSize(identity) {
54
+ if (identity.isAddressFallback)
55
+ return 88;
56
+ if (identity.sourceLength <= 14)
57
+ return 116;
58
+ if (identity.sourceLength <= 20)
59
+ return 96;
60
+ if (identity.sourceLength <= 26)
61
+ return 80;
62
+ if (identity.sourceLength <= 32)
63
+ return 64;
64
+ return 56;
65
+ }
66
+ function buildBrandStamp() {
67
+ return (0, h_1.h)("div", {
68
+ style: {
69
+ position: "absolute",
70
+ top: 56,
71
+ left: 64,
72
+ display: "flex",
73
+ alignItems: "center",
74
+ gap: 16,
75
+ },
76
+ }, (0, h_1.h)("img", {
77
+ src: (0, assets_1.buildLogoSquaresSVG)("light"),
78
+ width: 56,
79
+ height: 52,
80
+ style: { display: "flex", flexShrink: 0 },
81
+ }), (0, h_1.h)("div", {
82
+ style: {
83
+ display: "flex",
84
+ fontSize: 52,
85
+ fontWeight: 700,
86
+ color: PRIMARY,
87
+ letterSpacing: "-0.01em",
88
+ },
89
+ }, "Signals"));
90
+ }
91
+ function buildAvatar(address) {
92
+ const avatar = (0, avatar_1.getAvatarData)(address, "light");
93
+ return (0, h_1.h)("div", {
94
+ style: {
95
+ width: AVATAR_SIZE,
96
+ height: AVATAR_SIZE,
97
+ borderRadius: 36,
98
+ background: AVATAR_BG,
99
+ border: `1px solid ${AVATAR_BORDER}`,
100
+ display: "flex",
101
+ flexDirection: "column",
102
+ overflow: "hidden",
103
+ flexShrink: 0,
104
+ },
105
+ }, ...avatar.pattern.map((row, y) => (0, h_1.h)("div", {
106
+ style: {
107
+ display: "flex",
108
+ width: "100%",
109
+ height: "20%",
110
+ },
111
+ }, ...row.map((isFilled, x) => (0, h_1.h)("div", {
112
+ style: {
113
+ width: "20%",
114
+ height: "100%",
115
+ backgroundColor: isFilled
116
+ ? (y + x) % 2 === 0
117
+ ? avatar.primary
118
+ : avatar.secondary
119
+ : "transparent",
120
+ },
121
+ })))));
122
+ }
123
+ function buildTierChip(tier) {
124
+ const tierTheme = tier_theme_shared_1.TIER_CHIP_THEMES[tier].light;
125
+ return (0, h_1.h)("div", {
126
+ style: {
127
+ display: "flex",
128
+ alignItems: "center",
129
+ gap: 10,
130
+ padding: "10px 20px",
131
+ borderRadius: 999,
132
+ border: `1px solid ${tierTheme.border}`,
133
+ background: `linear-gradient(135deg, ${tierTheme.from}, ${tierTheme.to})`,
134
+ color: INK,
135
+ fontSize: 28,
136
+ fontWeight: 500,
137
+ lineHeight: 1,
138
+ marginBottom: 16,
139
+ alignSelf: "flex-start",
140
+ flexShrink: 0,
141
+ },
142
+ }, (0, h_1.h)("img", {
143
+ src: tier_badges_1.TIER_BADGE_DATA_URIS[tier],
144
+ width: 32,
145
+ height: 32,
146
+ style: { display: "flex", flexShrink: 0 },
147
+ }), (0, h_1.h)("div", { style: { display: "flex" } }, (0, tier_theme_shared_1.formatTierName)(tier)));
148
+ }
149
+ function buildHandle(identity) {
150
+ return (0, h_1.h)("div", {
151
+ style: {
152
+ display: "flex",
153
+ maxWidth: IDENTITY_WIDTH,
154
+ fontFamily: identity.isAddressFallback ? "JetBrains Mono" : "Inter",
155
+ fontSize: getHandleFontSize(identity),
156
+ fontWeight: 700,
157
+ color: PRIMARY,
158
+ letterSpacing: identity.isAddressFallback ? "-0.005em" : "-0.025em",
159
+ lineHeight: 0.95,
160
+ whiteSpace: "nowrap",
161
+ overflow: "hidden",
162
+ textOverflow: "ellipsis",
163
+ },
164
+ }, identity.handle);
165
+ }
166
+ function buildAddressLine(identity) {
167
+ if (!identity.addressLine)
168
+ return null;
169
+ return (0, h_1.h)("div", {
170
+ style: {
171
+ display: "flex",
172
+ fontFamily: "JetBrains Mono",
173
+ fontSize: 30,
174
+ color: INK_MUTED,
175
+ fontWeight: 500,
176
+ marginTop: 18,
177
+ letterSpacing: "0.01em",
178
+ },
179
+ }, identity.addressLine);
180
+ }
181
+ function buildIdentityColumn(input) {
182
+ const identity = buildIdentityText(input);
183
+ const children = [];
184
+ // Guard against runtime tier values outside the declared union (e.g. a
185
+ // future "UNRANKED" snapshot that downstream pushes through unchecked).
186
+ // Skip the chip rather than throw so the OG render keeps working.
187
+ if (input.tier && tier_theme_shared_1.TIER_CHIP_THEMES[input.tier]) {
188
+ children.push(buildTierChip(input.tier));
189
+ }
190
+ children.push(buildHandle(identity));
191
+ const addressLine = buildAddressLine(identity);
192
+ if (addressLine) {
193
+ children.push(addressLine);
194
+ }
195
+ return (0, h_1.h)("div", {
196
+ style: {
197
+ display: "flex",
198
+ flexDirection: "column",
199
+ minWidth: 0,
200
+ flex: 1,
201
+ },
202
+ }, ...children);
203
+ }
204
+ function buildProfileContextVNode(input) {
205
+ return (0, h_1.h)("div", {
206
+ style: {
207
+ width: CARD_WIDTH,
208
+ height: CARD_HEIGHT,
209
+ display: "flex",
210
+ position: "relative",
211
+ overflow: "hidden",
212
+ fontFamily: "Inter",
213
+ background: PAGE_BG,
214
+ },
215
+ }, buildBrandStamp(), (0, h_1.h)("div", {
216
+ style: {
217
+ position: "absolute",
218
+ top: "50%",
219
+ left: HERO_LEFT,
220
+ right: HERO_RIGHT,
221
+ transform: "translateY(-50%)",
222
+ display: "flex",
223
+ alignItems: "center",
224
+ gap: HERO_GAP,
225
+ },
226
+ }, buildAvatar(input.address), buildIdentityColumn(input)));
227
+ }
@@ -0,0 +1,2 @@
1
+ import type { ProfileContextTier } from "./types";
2
+ export declare const TIER_BADGE_DATA_URIS: Record<ProfileContextTier, string>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TIER_BADGE_DATA_URIS = void 0;
4
+ const BRONZE_BADGE_DATA_URI = "data:image/png;base64,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";
5
+ const SILVER_BADGE_DATA_URI = "data:image/png;base64,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";
6
+ const GOLD_BADGE_DATA_URI = "data:image/png;base64,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";
7
+ const PLATINUM_BADGE_DATA_URI = "data:image/png;base64,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";
8
+ const DIAMOND_BADGE_DATA_URI = "data:image/png;base64,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";
9
+ exports.TIER_BADGE_DATA_URIS = {
10
+ BRONZE: BRONZE_BADGE_DATA_URI,
11
+ SILVER: SILVER_BADGE_DATA_URI,
12
+ GOLD: GOLD_BADGE_DATA_URI,
13
+ PLATINUM: PLATINUM_BADGE_DATA_URI,
14
+ DIAMOND: DIAMOND_BADGE_DATA_URI,
15
+ };
@@ -0,0 +1,7 @@
1
+ import type { ProfileTier } from "../share/tier-theme-shared";
2
+ export type ProfileContextTier = ProfileTier;
3
+ export interface ProfileContextImageInput {
4
+ address: string;
5
+ realHandle: string | null;
6
+ tier: ProfileContextTier | null;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -4,6 +4,7 @@ exports.buildProfileVNode = buildProfileVNode;
4
4
  const h_1 = require("./h");
5
5
  const assets_1 = require("./assets");
6
6
  const avatar_1 = require("./avatar");
7
+ const tier_theme_shared_1 = require("./tier-theme-shared");
7
8
  const CARD_WIDTH = 1200;
8
9
  const CARD_HEIGHT = 630;
9
10
  const OUTER_PADDING = 24;
@@ -45,78 +46,6 @@ const OG_THEMES = {
45
46
  neutralBg: "#27272A", // surface-muted
46
47
  },
47
48
  };
48
- const TIER_CHIP_THEMES = {
49
- BRONZE: {
50
- light: {
51
- from: "#FFE6CC",
52
- to: "#FFC999",
53
- border: "#C97E3D",
54
- icon: "#8B4513",
55
- },
56
- dark: {
57
- from: "#3D2B1A",
58
- to: "#5C3A1E",
59
- border: "#8B5E2B",
60
- icon: "#F5E5D4",
61
- },
62
- },
63
- SILVER: {
64
- light: {
65
- from: "#F2F5F8",
66
- to: "#E2E7EE",
67
- border: "#BFC6CE",
68
- icon: "#6B7280",
69
- },
70
- dark: {
71
- from: "#2A2D31",
72
- to: "#363A40",
73
- border: "#6B7280",
74
- icon: "#F3F4F6",
75
- },
76
- },
77
- GOLD: {
78
- light: {
79
- from: "#FFF0B8",
80
- to: "#FFD875",
81
- border: "#D9A441",
82
- icon: "#DA9100",
83
- },
84
- dark: {
85
- from: "#3D3520",
86
- to: "#4A3D1A",
87
- border: "#B8892E",
88
- icon: "#FFE9B3",
89
- },
90
- },
91
- PLATINUM: {
92
- light: {
93
- from: "#E4FFF7",
94
- to: "#CDEFE5",
95
- border: "#8FD7C6",
96
- icon: "#059669",
97
- },
98
- dark: {
99
- from: "#1A3D33",
100
- to: "#1F3B31",
101
- border: "#4DAE96",
102
- icon: "#BAEBD9",
103
- },
104
- },
105
- DIAMOND: {
106
- light: {
107
- from: "#E2F4FF",
108
- to: "#C9E9FF",
109
- border: "#89D0FF",
110
- icon: "#0284C7",
111
- },
112
- dark: {
113
- from: "#1A2F3D",
114
- to: "#1E3545",
115
- border: "#5AAFE0",
116
- icon: "#5EC0F2",
117
- },
118
- },
119
- };
120
49
  const PRICE_TICK_STEPS = [
121
50
  10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 25000, 50000, 100000,
122
51
  250000, 500000, 1000000,
@@ -367,11 +296,8 @@ function buildHistoryPath(btcHistory, scaleX, scaleY) {
367
296
  function clamp(value, min, max) {
368
297
  return Math.min(Math.max(value, min), max);
369
298
  }
370
- function formatTierName(tier) {
371
- return `${tier[0]}${tier.slice(1).toLowerCase()}`;
372
- }
373
299
  function buildTierChip(tier, themeName, theme) {
374
- const tierTheme = TIER_CHIP_THEMES[tier][themeName];
300
+ const tierTheme = tier_theme_shared_1.TIER_CHIP_THEMES[tier][themeName];
375
301
  return (0, h_1.h)("div", {
376
302
  style: {
377
303
  display: "flex",
@@ -395,7 +321,7 @@ function buildTierChip(tier, themeName, theme) {
395
321
  }, (0, h_1.h)("polygon", {
396
322
  points: "8 1 15 8 8 15 1 8",
397
323
  fill: tierTheme.icon,
398
- })), (0, h_1.h)("div", { style: { display: "flex" } }, formatTierName(tier)));
324
+ })), (0, h_1.h)("div", { style: { display: "flex" } }, (0, tier_theme_shared_1.formatTierName)(tier)));
399
325
  }
400
326
  function buildAddressAvatar(address, themeName, theme) {
401
327
  const avatar = (0, avatar_1.getAvatarData)(address, themeName);
@@ -0,0 +1,10 @@
1
+ export type ProfileTier = "BRONZE" | "SILVER" | "GOLD" | "PLATINUM" | "DIAMOND";
2
+ export type TierThemeName = "light" | "dark";
3
+ export interface TierChipTheme {
4
+ from: string;
5
+ to: string;
6
+ border: string;
7
+ icon: string;
8
+ }
9
+ export declare const TIER_CHIP_THEMES: Record<ProfileTier, Record<TierThemeName, TierChipTheme>>;
10
+ export declare function formatTierName(tier: ProfileTier): string;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TIER_CHIP_THEMES = void 0;
4
+ exports.formatTierName = formatTierName;
5
+ exports.TIER_CHIP_THEMES = {
6
+ BRONZE: {
7
+ light: {
8
+ from: "#FFE6CC",
9
+ to: "#FFC999",
10
+ border: "#C97E3D",
11
+ icon: "#8B4513",
12
+ },
13
+ dark: {
14
+ from: "#3D2B1A",
15
+ to: "#5C3A1E",
16
+ border: "#8B5E2B",
17
+ icon: "#F5E5D4",
18
+ },
19
+ },
20
+ SILVER: {
21
+ light: {
22
+ from: "#F2F5F8",
23
+ to: "#E2E7EE",
24
+ border: "#BFC6CE",
25
+ icon: "#6B7280",
26
+ },
27
+ dark: {
28
+ from: "#2A2D31",
29
+ to: "#363A40",
30
+ border: "#6B7280",
31
+ icon: "#F3F4F6",
32
+ },
33
+ },
34
+ GOLD: {
35
+ light: {
36
+ from: "#FFF0B8",
37
+ to: "#FFD875",
38
+ border: "#D9A441",
39
+ icon: "#DA9100",
40
+ },
41
+ dark: {
42
+ from: "#3D3520",
43
+ to: "#4A3D1A",
44
+ border: "#B8892E",
45
+ icon: "#FFE9B3",
46
+ },
47
+ },
48
+ PLATINUM: {
49
+ light: {
50
+ from: "#E4FFF7",
51
+ to: "#CDEFE5",
52
+ border: "#8FD7C6",
53
+ icon: "#059669",
54
+ },
55
+ dark: {
56
+ from: "#1A3D33",
57
+ to: "#1F3B31",
58
+ border: "#4DAE96",
59
+ icon: "#BAEBD9",
60
+ },
61
+ },
62
+ DIAMOND: {
63
+ light: {
64
+ from: "#E2F4FF",
65
+ to: "#C9E9FF",
66
+ border: "#89D0FF",
67
+ icon: "#0284C7",
68
+ },
69
+ dark: {
70
+ from: "#1A2F3D",
71
+ to: "#1E3545",
72
+ border: "#5AAFE0",
73
+ icon: "#5EC0F2",
74
+ },
75
+ },
76
+ };
77
+ function formatTierName(tier) {
78
+ return `${tier[0]}${tier.slice(1).toLowerCase()}`;
79
+ }
package/dist/types.d.ts CHANGED
@@ -29,6 +29,10 @@ export interface MarketRaw {
29
29
  isSettled?: boolean;
30
30
  settlementValue?: string;
31
31
  settlementTick?: number;
32
+ feedId?: string;
33
+ feedDecimals?: number;
34
+ tickScale?: string;
35
+ assetSymbol?: string;
32
36
  }
33
37
  /** Market data for SDK calculations (숫자 객체만) */
34
38
  export interface Market {
@@ -41,6 +45,10 @@ export interface Market {
41
45
  isSettled?: boolean;
42
46
  settlementValue?: USDCAmount;
43
47
  settlementTick?: Tick;
48
+ feedId?: string;
49
+ feedDecimals?: number;
50
+ tickScale?: bigint;
51
+ assetSymbol?: string;
44
52
  }
45
53
  /** Market distribution data for SDK calculations (WAD 기반) */
46
54
  export interface MarketDistribution {
package/dist/types.js CHANGED
@@ -43,6 +43,12 @@ function mapMarket(raw) {
43
43
  ...(raw.settlementTick !== undefined && {
44
44
  settlementTick: raw.settlementTick,
45
45
  }),
46
+ ...(raw.feedId !== undefined && { feedId: raw.feedId }),
47
+ ...(raw.feedDecimals !== undefined && {
48
+ feedDecimals: raw.feedDecimals,
49
+ }),
50
+ ...(raw.tickScale !== undefined && { tickScale: BigInt(raw.tickScale) }),
51
+ ...(raw.assetSymbol !== undefined && { assetSymbol: raw.assetSymbol }),
46
52
  };
47
53
  }
48
54
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signals-protocol/v1-sdk",
3
- "version": "1.5.1",
3
+ "version": "1.7.0",
4
4
  "description": "Signals v1 SDK for CLMSR market calculations and utilities",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -59,6 +59,11 @@
59
59
  "require": "./dist/index.js",
60
60
  "types": "./dist/index.d.ts"
61
61
  },
62
+ "./profile-context": {
63
+ "import": "./dist/profile-context/index.js",
64
+ "require": "./dist/profile-context/index.js",
65
+ "types": "./dist/profile-context/index.d.ts"
66
+ },
62
67
  "./package.json": "./package.json"
63
68
  }
64
69
  }