@leather.io/features 1.1.8 → 1.1.9
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 +112 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +340 -15
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { FormatAmountOptions } from "@leather.io/utils";
|
|
2
|
-
import { Activity, BaseOnChainActivity, BitcoinNetwork, BitcoinNetworkModes, CryptoAsset, Money, NetworkConfiguration, OnChainActivityStatus } from "@leather.io/models";
|
|
1
|
+
import { FormatAmountOptions, SerializedCryptoAssetId } from "@leather.io/utils";
|
|
2
|
+
import { Activity, BaseOnChainActivity, BitcoinNetwork, BitcoinNetworkModes, CryptoAsset, CryptoAssetProtocol, InscriptionAsset, Money, NetworkConfiguration, NonFungibleCryptoAsset, OnChainActivityStatus, Sip9Asset, Sip9Attribute, StampAsset } from "@leather.io/models";
|
|
3
|
+
import { AccountQuotedBtcBalance, AddressQuotedStxBalance, RuneBalance, Sip10Balance } from "@leather.io/services";
|
|
3
4
|
|
|
4
5
|
//#region src/activity/types.d.ts
|
|
5
6
|
type ActivityAvatar = 'swap' | 'asset' | 'fallback';
|
|
@@ -17,7 +18,7 @@ interface ActivityView {
|
|
|
17
18
|
toAsset?: CryptoAsset;
|
|
18
19
|
title: string;
|
|
19
20
|
caption: string;
|
|
20
|
-
statusLabel: string;
|
|
21
|
+
statusLabel: string | null;
|
|
21
22
|
activityLink?: string | null;
|
|
22
23
|
balances: ActivityBalances;
|
|
23
24
|
activityAvatar: ActivityAvatar;
|
|
@@ -28,7 +29,7 @@ interface ActivityView {
|
|
|
28
29
|
type FormatMoney = (money: Money, options?: FormatAmountOptions) => string;
|
|
29
30
|
declare function addOperator(balance: string, operator?: string): string;
|
|
30
31
|
declare function getBalanceOperator(activity: Activity): "+" | "−" | undefined;
|
|
31
|
-
declare function getBalanceColor(activity: Activity): "
|
|
32
|
+
declare function getBalanceColor(activity: Activity): "green.action-primary-default" | "ink.text-primary";
|
|
32
33
|
declare function getBalancesText(activity: Activity, formatMoney: FormatMoney): {
|
|
33
34
|
formattedBalanceCrypto: string | undefined;
|
|
34
35
|
formattedBalanceQuote: string | undefined;
|
|
@@ -84,7 +85,7 @@ declare function getActivityAvatar(activity: Activity): ActivityAvatar;
|
|
|
84
85
|
declare function hasActivityStatus(activity: Activity): activity is Activity & {
|
|
85
86
|
status: BaseOnChainActivity['status'];
|
|
86
87
|
};
|
|
87
|
-
declare function formatActivityStatusLabel(activity: Activity): string;
|
|
88
|
+
declare function formatActivityStatusLabel(activity: Activity): string | undefined;
|
|
88
89
|
declare function getActivityStatusIndicatorId(activity: Activity): ActivityStatusIndicatorId;
|
|
89
90
|
//#endregion
|
|
90
91
|
//#region src/activity/activity-timestamp.d.ts
|
|
@@ -95,6 +96,87 @@ declare function formatActivityCaption({
|
|
|
95
96
|
//#region src/activity/activity-view.d.ts
|
|
96
97
|
declare function createActivityView(activity: Activity, networkPreference: NetworkConfiguration): ActivityView;
|
|
97
98
|
//#endregion
|
|
99
|
+
//#region src/activity/activity-filter.d.ts
|
|
100
|
+
declare function filterActivityBySerializedAssetId(activity: ActivityView[], serializedAssetId: SerializedCryptoAssetId): ActivityView[];
|
|
101
|
+
declare function filterActivityByAsset(activity: ActivityView[], asset: CryptoAsset): ActivityView[];
|
|
102
|
+
//#endregion
|
|
103
|
+
//#region src/collectibles/collectible-view.d.ts
|
|
104
|
+
interface CollectibleView {
|
|
105
|
+
key: string;
|
|
106
|
+
protocol: NonFungibleCryptoAsset['protocol'];
|
|
107
|
+
title: string;
|
|
108
|
+
subtitle: string;
|
|
109
|
+
asset: NonFungibleCryptoAsset;
|
|
110
|
+
isBns?: boolean;
|
|
111
|
+
}
|
|
112
|
+
declare function createCollectibleView(asset: NonFungibleCryptoAsset): CollectibleView;
|
|
113
|
+
declare function createCollectibleViews(assets: NonFungibleCryptoAsset[]): CollectibleView[];
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/collectibles/sip9-media.d.ts
|
|
116
|
+
declare const supportedSip9ContentTypes: readonly ["image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml", "image/bmp", "image/tiff", "image/avif", "video/mp4", "audio/mpeg", "audio/mp3", "audio/wav", "audio/ogg", "audio/aac", "audio/flac", "audio/webm", "text/plain", "application/octet-stream", "model/gltf+json", "model/gltf-binary"];
|
|
117
|
+
type Sip9SupportedContentType = (typeof supportedSip9ContentTypes)[number];
|
|
118
|
+
interface Sip9MediaInfo {
|
|
119
|
+
contentType: Sip9SupportedContentType | null;
|
|
120
|
+
isVideo: boolean;
|
|
121
|
+
isImage: boolean;
|
|
122
|
+
isAudio: boolean;
|
|
123
|
+
}
|
|
124
|
+
declare function getSip9MediaInfo(url: string): Promise<Sip9MediaInfo>;
|
|
125
|
+
declare function getSip9ContentTypeList(): ("image/jpeg" | "image/png" | "image/gif" | "image/webp" | "image/svg+xml" | "image/bmp" | "image/tiff" | "image/avif" | "video/mp4" | "audio/mpeg" | "audio/mp3" | "audio/wav" | "audio/ogg" | "audio/aac" | "audio/flac" | "audio/webm" | "text/plain" | "application/octet-stream" | "model/gltf+json" | "model/gltf-binary")[];
|
|
126
|
+
//#endregion
|
|
127
|
+
//#region src/collectibles/collectible-details.d.ts
|
|
128
|
+
declare function getOrdExplorerUrl(inscriptionNumber?: number): string | undefined;
|
|
129
|
+
declare function getGammaCollectionUrl(collectionExplorerUrl?: string | null): string | undefined;
|
|
130
|
+
declare function getHiroExplorerContractUrl(contractId?: string | null): string | undefined;
|
|
131
|
+
interface InscriptionInfo {
|
|
132
|
+
title?: string;
|
|
133
|
+
ordExplorerUrl?: string;
|
|
134
|
+
txExplorerUrl?: string | null;
|
|
135
|
+
genesisTimestamp?: number;
|
|
136
|
+
genesisBlockHeight?: number;
|
|
137
|
+
mimeType?: string;
|
|
138
|
+
outputValue?: string;
|
|
139
|
+
}
|
|
140
|
+
declare function getInscriptionInfo(asset: InscriptionAsset, bitcoinNetwork: BitcoinNetwork): InscriptionInfo;
|
|
141
|
+
interface Sip9Info {
|
|
142
|
+
name?: string;
|
|
143
|
+
description?: string;
|
|
144
|
+
tokenId?: string | number;
|
|
145
|
+
collectionName?: string;
|
|
146
|
+
collectionUrl?: string;
|
|
147
|
+
creator?: string;
|
|
148
|
+
rarityRank?: number;
|
|
149
|
+
totalItems?: number;
|
|
150
|
+
contractUrl?: string;
|
|
151
|
+
contentType?: string;
|
|
152
|
+
attributes: Sip9Attribute[];
|
|
153
|
+
}
|
|
154
|
+
declare function getSip9Info(asset: Sip9Asset): Sip9Info;
|
|
155
|
+
declare function filterSip9Attributes(attributes?: Sip9Attribute[]): Sip9Attribute[];
|
|
156
|
+
declare function formatAttributeValue(attribute: Sip9Attribute): string;
|
|
157
|
+
interface StampInfo {
|
|
158
|
+
name: string;
|
|
159
|
+
stampExplorerUrl?: string;
|
|
160
|
+
blockExplorerUrl?: string | null;
|
|
161
|
+
blockHeight?: number;
|
|
162
|
+
}
|
|
163
|
+
declare function getStampInfo(asset: StampAsset, bitcoinNetwork: BitcoinNetwork): StampInfo;
|
|
164
|
+
declare const DESCRIPTION_TRUNCATE_LENGTH = 180;
|
|
165
|
+
declare function truncateDescription(description: string, maxLength?: number): {
|
|
166
|
+
text: string;
|
|
167
|
+
isTruncated: boolean;
|
|
168
|
+
};
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region src/display-labels.d.ts
|
|
171
|
+
type ChainType = 'bitcoin' | 'stacks';
|
|
172
|
+
declare function getChainDisplayLabel(chain: ChainType): string;
|
|
173
|
+
declare function getProtocolDisplayLabel(protocol: CryptoAssetProtocol): string;
|
|
174
|
+
//#endregion
|
|
175
|
+
//#region src/formatting.d.ts
|
|
176
|
+
declare function formatSats(value: string | number): string;
|
|
177
|
+
declare function formatTimestamp(timestamp: number): string;
|
|
178
|
+
declare function formatTimestampWithTime(timestamp: number): string;
|
|
179
|
+
//#endregion
|
|
98
180
|
//#region src/onramper/types.d.ts
|
|
99
181
|
type OnramperMode = 'buy' | 'sell' | 'swap';
|
|
100
182
|
//#endregion
|
|
@@ -122,5 +204,29 @@ declare function getOnramperIframeParams({
|
|
|
122
204
|
redirectAtCheckout
|
|
123
205
|
}: GetIframeProps): URLSearchParams;
|
|
124
206
|
//#endregion
|
|
125
|
-
|
|
207
|
+
//#region src/token/token-types.d.ts
|
|
208
|
+
interface TokenDetailsProps {
|
|
209
|
+
assetId: SerializedCryptoAssetId;
|
|
210
|
+
}
|
|
211
|
+
interface OnPressTokenDetails {
|
|
212
|
+
onPress?(tokenDetails: TokenDetailsProps): void;
|
|
213
|
+
}
|
|
214
|
+
declare const supportedAssetProtocols: readonly ["nativeBtc", "nativeStx", "sip10", "rune", "sip9", "inscription", "stamp"];
|
|
215
|
+
declare const supportedFungibleAssetProtocols: readonly ["nativeBtc", "nativeStx", "sip10", "rune"];
|
|
216
|
+
declare const supportedNonFungibleAssetProtocols: readonly ["inscription", "sip9", "stamp"];
|
|
217
|
+
type SupportedAssetProtocol = (typeof supportedAssetProtocols)[number];
|
|
218
|
+
type SupportedFungibleAssetProtocol = (typeof supportedFungibleAssetProtocols)[number];
|
|
219
|
+
type SupportedNonFungibleAssetProtocol = (typeof supportedNonFungibleAssetProtocols)[number];
|
|
220
|
+
declare function isSupportedFungibleAssetProtocol(value: CryptoAssetProtocol): value is SupportedFungibleAssetProtocol;
|
|
221
|
+
declare function isSupportedNonFungibleAssetProtocol(value: CryptoAssetProtocol): value is SupportedNonFungibleAssetProtocol;
|
|
222
|
+
declare function isSupportedAssetProtocol(value: CryptoAssetProtocol): value is SupportedAssetProtocol;
|
|
223
|
+
//#endregion
|
|
224
|
+
//#region src/balance/balance-types.d.ts
|
|
225
|
+
type TokenBalance = AccountQuotedBtcBalance | AddressQuotedStxBalance | Sip10Balance | RuneBalance;
|
|
226
|
+
declare function isAccountQuotedBtcBalance(value: TokenBalance): value is AccountQuotedBtcBalance;
|
|
227
|
+
declare function isAddressQuotedStxBalance(value: TokenBalance): value is AddressQuotedStxBalance;
|
|
228
|
+
declare function isSip10Balance(value: TokenBalance): value is Sip10Balance;
|
|
229
|
+
declare function isRuneBalance(value: TokenBalance): value is RuneBalance;
|
|
230
|
+
//#endregion
|
|
231
|
+
export { type ActivityAvatar, type ActivityStatusIndicatorId, type ActivityView, type CollectibleView, DESCRIPTION_TRUNCATE_LENGTH, type FormatMoney, type GetMempoolExplorerLinkArgs, type InscriptionInfo, type OnPressTokenDetails, type OnramperMode, type Sip9Info, type Sip9MediaInfo, type Sip9SupportedContentType, type StampInfo, type SupportedAssetProtocol, type SupportedFungibleAssetProtocol, type SupportedNonFungibleAssetProtocol, type TokenBalance, type TokenDetailsProps, addOperator, createActivityView, createCollectibleView, createCollectibleViews, filterActivityByAsset, filterActivityBySerializedAssetId, filterSip9Attributes, formatActivityCaption, formatActivityStatusLabel, formatAttributeValue, formatSats, formatTimestamp, formatTimestampWithTime, getActivityAsset, getActivityAvatar, getActivityBalances, getActivityStatusIndicatorId, getActivityTitle, getBalanceColor, getBalanceOperator, getBalancesText, getBitcoinExplorerLink, getChainDisplayLabel, getGammaCollectionUrl, getHiroExplorerContractUrl, getInscriptionInfo, getOnramperIframeParams, getOrdExplorerUrl, getProtocolDisplayLabel, getSip9ContentTypeList, getSip9Info, getSip9MediaInfo, getStacksExplorerLink, getStampInfo, hasActivityStatus, hasTxDetails, isAccountQuotedBtcBalance, isAddressQuotedStxBalance, isRuneBalance, isSip10Balance, isSupportedAssetProtocol, isSupportedFungibleAssetProtocol, isSupportedNonFungibleAssetProtocol, makeActivityLink, truncateDescription };
|
|
126
232
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/activity/types.ts","../src/activity/activity-balance.ts","../src/activity/activity-links.ts","../src/activity/activity-metadata.ts","../src/activity/activity-status.ts","../src/activity/activity-timestamp.ts","../src/activity/activity-view.ts","../src/onramper/types.ts","../src/onramper/onramper-params.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/activity/types.ts","../src/activity/activity-balance.ts","../src/activity/activity-links.ts","../src/activity/activity-metadata.ts","../src/activity/activity-status.ts","../src/activity/activity-timestamp.ts","../src/activity/activity-view.ts","../src/activity/activity-filter.ts","../src/collectibles/collectible-view.ts","../src/collectibles/sip9-media.ts","../src/collectibles/collectible-details.ts","../src/display-labels.ts","../src/formatting.ts","../src/onramper/types.ts","../src/onramper/onramper-params.ts","../src/token/token-types.ts","../src/balance/balance-types.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { minusSign } from "@leather.io/utils";
|
|
2
|
-
import { HIRO_EXPLORER_URL, MEMPOOL_BASE_URL } from "@leather.io/constants";
|
|
3
|
-
import { HIRO_API_BASE_URL_NAKAMOTO_TESTNET, isFungibleAsset, isInscriptionAsset, isStampAsset } from "@leather.io/models";
|
|
1
|
+
import { assertUnreachable, getAssetId, minusSign, serializeAssetId } from "@leather.io/utils";
|
|
2
|
+
import { GAMMA_URL, HIRO_EXPLORER_URL, MEMPOOL_BASE_URL, ORD_IO_URL, SBTC_RECLAIM_URL, stxAsset } from "@leather.io/constants";
|
|
3
|
+
import { CryptoAssetProtocols, HIRO_API_BASE_URL_NAKAMOTO_TESTNET, isFungibleAsset, isInscriptionAsset, isStampAsset } from "@leather.io/models";
|
|
4
4
|
import dayjs from "dayjs";
|
|
5
|
+
import { getStacksContractAssetName } from "@leather.io/stacks";
|
|
5
6
|
import { colorThemes } from "@leather.io/tokens";
|
|
6
7
|
import { hmac } from "@noble/hashes/hmac";
|
|
7
8
|
import { sha256 } from "@noble/hashes/sha256";
|
|
@@ -102,7 +103,9 @@ function getActivityTitle(activity) {
|
|
|
102
103
|
return activity.value?.crypto?.symbol;
|
|
103
104
|
case "deploySmartContract":
|
|
104
105
|
case "executeSmartContract": return activity.contractId.split(".").pop() || `Unknown`;
|
|
105
|
-
case "swapAssets":
|
|
106
|
+
case "swapAssets":
|
|
107
|
+
if ("sbtcBridgeStatus" in activity) return `BTC → sBTC`;
|
|
108
|
+
return `Swap Assets`;
|
|
106
109
|
case "lockAsset": return `Lock Asset`;
|
|
107
110
|
case "connectApp":
|
|
108
111
|
case "signMessage":
|
|
@@ -119,6 +122,7 @@ function getActivityTitle(activity) {
|
|
|
119
122
|
function getActivityAsset(activity) {
|
|
120
123
|
if ("asset" in activity) return activity.asset;
|
|
121
124
|
if (activity.type === "swapAssets") return activity.toAsset;
|
|
125
|
+
if (activity.type === "deploySmartContract" || activity.type === "executeSmartContract") return stxAsset;
|
|
122
126
|
}
|
|
123
127
|
function getActivityAvatar(activity) {
|
|
124
128
|
if (activity.type === "swapAssets") return "swap";
|
|
@@ -196,6 +200,14 @@ function formatActivityStatusLabel(activity) {
|
|
|
196
200
|
case "deploySmartContract":
|
|
197
201
|
case "executeSmartContract": return activity.contractId.split(".")[1] ?? "Unknown";
|
|
198
202
|
case "swapAssets":
|
|
203
|
+
if ("sbtcBridgeStatus" in activity && activity.sbtcBridgeStatus) switch (activity.sbtcBridgeStatus) {
|
|
204
|
+
case "pending": return "Pending deposit";
|
|
205
|
+
case "accepted": return "Pending mint";
|
|
206
|
+
case "failed": return "Failed";
|
|
207
|
+
case "rbf": return "Replaced";
|
|
208
|
+
case "confirmed": return "Confirmed";
|
|
209
|
+
default: return;
|
|
210
|
+
}
|
|
199
211
|
if (isFungibleAsset(activity.fromAsset) && isFungibleAsset(activity.toAsset)) return `${activity.fromAsset.symbol} → ${activity.toAsset.symbol}`;
|
|
200
212
|
else if (isStampAsset(activity.fromAsset) && isStampAsset(activity.toAsset)) return `Stamp → Stamp`;
|
|
201
213
|
else if (isInscriptionAsset(activity.fromAsset) && isInscriptionAsset(activity.toAsset)) return `${activity.fromAsset.title} → ${activity.toAsset.title}`;
|
|
@@ -225,10 +237,20 @@ function getActivityStatusIndicatorId(activity) {
|
|
|
225
237
|
//#endregion
|
|
226
238
|
//#region src/activity/activity-timestamp.ts
|
|
227
239
|
function formatActivityCaption({ timestamp }) {
|
|
228
|
-
const
|
|
229
|
-
const
|
|
230
|
-
const
|
|
231
|
-
|
|
240
|
+
const timestampMs = timestamp * 1e3;
|
|
241
|
+
const now = dayjs();
|
|
242
|
+
const then = dayjs(timestampMs);
|
|
243
|
+
const minutes = now.diff(then, "minute");
|
|
244
|
+
if (minutes < 1) return "Just now";
|
|
245
|
+
if (minutes < 60) return `${minutes}m ago`;
|
|
246
|
+
const hours = now.diff(then, "hour");
|
|
247
|
+
if (hours < 24) return `${hours}h ago`;
|
|
248
|
+
const days = now.diff(then, "day");
|
|
249
|
+
if (days < 30) if (now.year() === then.year() && now.month() !== then.month()) return `${now.year() * 12 + now.month() - (then.year() * 12 + then.month())}mo ago`;
|
|
250
|
+
else return `${days}d ago`;
|
|
251
|
+
const months = now.diff(then, "month");
|
|
252
|
+
if (months < 12) return `${months}mo ago`;
|
|
253
|
+
return `${now.diff(then, "year")}y ago`;
|
|
232
254
|
}
|
|
233
255
|
|
|
234
256
|
//#endregion
|
|
@@ -237,6 +259,18 @@ function getActivityKey(activity) {
|
|
|
237
259
|
if ("txid" in activity) return activity.txid;
|
|
238
260
|
return `${activity.type}-${activity.timestamp}`;
|
|
239
261
|
}
|
|
262
|
+
function hasSbtcBridgeFailed(activity) {
|
|
263
|
+
return activity.type === "swapAssets" && "sbtcBridgeStatus" in activity && activity.sbtcBridgeStatus === "failed";
|
|
264
|
+
}
|
|
265
|
+
function getActivityLink(activity, asset, networkPreference) {
|
|
266
|
+
if (hasSbtcBridgeFailed(activity) && "txid" in activity && activity.txid) return `${SBTC_RECLAIM_URL}${activity.txid}`;
|
|
267
|
+
if (hasTxDetails(activity) && asset) return makeActivityLink({
|
|
268
|
+
txid: activity.txid,
|
|
269
|
+
networkPreference,
|
|
270
|
+
asset
|
|
271
|
+
});
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
240
274
|
function createActivityView(activity, networkPreference) {
|
|
241
275
|
const asset = getActivityAsset(activity);
|
|
242
276
|
const balances = getActivityBalances(activity);
|
|
@@ -248,11 +282,7 @@ function createActivityView(activity, networkPreference) {
|
|
|
248
282
|
const statusIndicator = getActivityStatusIndicatorId(activity);
|
|
249
283
|
const fromAsset = activity.type === "swapAssets" ? activity.fromAsset : void 0;
|
|
250
284
|
const toAsset = activity.type === "swapAssets" ? activity.toAsset : void 0;
|
|
251
|
-
const activityLink =
|
|
252
|
-
txid: activity.txid,
|
|
253
|
-
networkPreference,
|
|
254
|
-
asset
|
|
255
|
-
}) : null;
|
|
285
|
+
const activityLink = getActivityLink(activity, asset, networkPreference);
|
|
256
286
|
return {
|
|
257
287
|
key: getActivityKey(activity),
|
|
258
288
|
asset,
|
|
@@ -260,7 +290,7 @@ function createActivityView(activity, networkPreference) {
|
|
|
260
290
|
toAsset,
|
|
261
291
|
title,
|
|
262
292
|
caption: combinedCaption,
|
|
263
|
-
statusLabel,
|
|
293
|
+
statusLabel: statusLabel ?? null,
|
|
264
294
|
balances,
|
|
265
295
|
activityLink,
|
|
266
296
|
activityAvatar,
|
|
@@ -268,6 +298,254 @@ function createActivityView(activity, networkPreference) {
|
|
|
268
298
|
};
|
|
269
299
|
}
|
|
270
300
|
|
|
301
|
+
//#endregion
|
|
302
|
+
//#region src/activity/activity-filter.ts
|
|
303
|
+
function getActivityViewAssetIds(view) {
|
|
304
|
+
return [
|
|
305
|
+
view.asset,
|
|
306
|
+
view.fromAsset,
|
|
307
|
+
view.toAsset
|
|
308
|
+
].filter((value) => !!value).map((asset) => serializeAssetId(getAssetId(asset)));
|
|
309
|
+
}
|
|
310
|
+
function filterActivityBySerializedAssetId(activity, serializedAssetId) {
|
|
311
|
+
return activity.filter((view) => getActivityViewAssetIds(view).includes(serializedAssetId));
|
|
312
|
+
}
|
|
313
|
+
function filterActivityByAsset(activity, asset) {
|
|
314
|
+
return filterActivityBySerializedAssetId(activity, serializeAssetId(getAssetId(asset)));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
//#endregion
|
|
318
|
+
//#region src/collectibles/collectible-view.ts
|
|
319
|
+
function createCollectibleView(asset) {
|
|
320
|
+
const key = serializeAssetId(getAssetId(asset));
|
|
321
|
+
switch (asset.protocol) {
|
|
322
|
+
case "inscription": return {
|
|
323
|
+
key,
|
|
324
|
+
protocol: asset.protocol,
|
|
325
|
+
title: `# ${asset.number}`,
|
|
326
|
+
subtitle: "Ordinal inscription",
|
|
327
|
+
asset
|
|
328
|
+
};
|
|
329
|
+
case "stamp": return {
|
|
330
|
+
key,
|
|
331
|
+
protocol: asset.protocol,
|
|
332
|
+
title: `# ${asset.stamp}`,
|
|
333
|
+
subtitle: "Bitcoin Stamp",
|
|
334
|
+
asset
|
|
335
|
+
};
|
|
336
|
+
case "sip9": {
|
|
337
|
+
const assetName = getStacksContractAssetName(asset.assetId);
|
|
338
|
+
const isBns = asset.assetId.toLowerCase().endsWith(".bns::names") || assetName?.toUpperCase() === "BNS-V2";
|
|
339
|
+
return {
|
|
340
|
+
key,
|
|
341
|
+
protocol: asset.protocol,
|
|
342
|
+
title: asset.name || assetName || "Unknown collectible",
|
|
343
|
+
subtitle: asset.collection?.name ?? "Stacks collectible",
|
|
344
|
+
asset,
|
|
345
|
+
isBns
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
default: return assertUnreachable(asset);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function createCollectibleViews(assets) {
|
|
352
|
+
return assets.map(createCollectibleView);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
//#endregion
|
|
356
|
+
//#region src/collectibles/sip9-media.ts
|
|
357
|
+
const supportedSip9ContentTypes = [
|
|
358
|
+
"image/jpeg",
|
|
359
|
+
"image/png",
|
|
360
|
+
"image/gif",
|
|
361
|
+
"image/webp",
|
|
362
|
+
"image/svg+xml",
|
|
363
|
+
"image/bmp",
|
|
364
|
+
"image/tiff",
|
|
365
|
+
"image/avif",
|
|
366
|
+
"video/mp4",
|
|
367
|
+
"audio/mpeg",
|
|
368
|
+
"audio/mp3",
|
|
369
|
+
"audio/wav",
|
|
370
|
+
"audio/ogg",
|
|
371
|
+
"audio/aac",
|
|
372
|
+
"audio/flac",
|
|
373
|
+
"audio/webm",
|
|
374
|
+
"text/plain",
|
|
375
|
+
"application/octet-stream",
|
|
376
|
+
"model/gltf+json",
|
|
377
|
+
"model/gltf-binary"
|
|
378
|
+
];
|
|
379
|
+
const supportedContentTypesSet = new Set(supportedSip9ContentTypes);
|
|
380
|
+
function isSupportedContentType(contentType) {
|
|
381
|
+
if (contentType === null) return false;
|
|
382
|
+
return supportedContentTypesSet.has(contentType);
|
|
383
|
+
}
|
|
384
|
+
function inferFromExtension(url) {
|
|
385
|
+
const extension = url.split(".").pop()?.toLowerCase() ?? "";
|
|
386
|
+
return {
|
|
387
|
+
contentType: null,
|
|
388
|
+
isVideo: [
|
|
389
|
+
"mp4",
|
|
390
|
+
"webm",
|
|
391
|
+
"mov",
|
|
392
|
+
"avi",
|
|
393
|
+
"mkv",
|
|
394
|
+
"m4v"
|
|
395
|
+
].includes(extension),
|
|
396
|
+
isImage: [
|
|
397
|
+
"jpg",
|
|
398
|
+
"jpeg",
|
|
399
|
+
"png",
|
|
400
|
+
"gif",
|
|
401
|
+
"webp",
|
|
402
|
+
"svg"
|
|
403
|
+
].includes(extension),
|
|
404
|
+
isAudio: [
|
|
405
|
+
"mp3",
|
|
406
|
+
"wav",
|
|
407
|
+
"ogg"
|
|
408
|
+
].includes(extension)
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
async function getSip9MediaInfo(url) {
|
|
412
|
+
try {
|
|
413
|
+
const rawContentType = (await fetch(url, {
|
|
414
|
+
method: "HEAD",
|
|
415
|
+
headers: { Range: "bytes=0-0" }
|
|
416
|
+
})).headers.get("content-type");
|
|
417
|
+
const contentType = isSupportedContentType(rawContentType) ? rawContentType : null;
|
|
418
|
+
return {
|
|
419
|
+
contentType,
|
|
420
|
+
isVideo: contentType?.startsWith("video/") ?? false,
|
|
421
|
+
isImage: contentType?.startsWith("image/") || contentType === "application/octet-stream",
|
|
422
|
+
isAudio: contentType?.startsWith("audio/") ?? false
|
|
423
|
+
};
|
|
424
|
+
} catch {
|
|
425
|
+
return inferFromExtension(url);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
function getSip9ContentTypeList() {
|
|
429
|
+
return [...supportedSip9ContentTypes];
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
//#endregion
|
|
433
|
+
//#region src/collectibles/collectible-details.ts
|
|
434
|
+
function getOrdExplorerUrl(inscriptionNumber) {
|
|
435
|
+
if (!inscriptionNumber) return void 0;
|
|
436
|
+
return `${ORD_IO_URL}/${inscriptionNumber}`;
|
|
437
|
+
}
|
|
438
|
+
function getGammaCollectionUrl(collectionExplorerUrl) {
|
|
439
|
+
if (!collectionExplorerUrl) return void 0;
|
|
440
|
+
return `${GAMMA_URL}${collectionExplorerUrl}`;
|
|
441
|
+
}
|
|
442
|
+
function getHiroExplorerContractUrl(contractId) {
|
|
443
|
+
if (!contractId) return void 0;
|
|
444
|
+
return `${HIRO_EXPLORER_URL}/address/${contractId}`;
|
|
445
|
+
}
|
|
446
|
+
function getInscriptionInfo(asset, bitcoinNetwork) {
|
|
447
|
+
return {
|
|
448
|
+
title: asset.title,
|
|
449
|
+
ordExplorerUrl: getOrdExplorerUrl(asset.number),
|
|
450
|
+
txExplorerUrl: asset.txid ? getBitcoinExplorerLink({
|
|
451
|
+
id: asset.txid,
|
|
452
|
+
type: "tx",
|
|
453
|
+
networkPreference: bitcoinNetwork
|
|
454
|
+
}) : void 0,
|
|
455
|
+
genesisTimestamp: asset.genesisTimestamp,
|
|
456
|
+
genesisBlockHeight: asset.genesisBlockHeight,
|
|
457
|
+
mimeType: asset.mimeType,
|
|
458
|
+
outputValue: asset.value
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
function getSip9Info(asset) {
|
|
462
|
+
const collection = asset.collection;
|
|
463
|
+
return {
|
|
464
|
+
name: asset.name,
|
|
465
|
+
description: asset.description,
|
|
466
|
+
tokenId: asset.tokenId,
|
|
467
|
+
collectionName: collection?.name,
|
|
468
|
+
collectionUrl: getGammaCollectionUrl(collection?.collectionExplorerUrl),
|
|
469
|
+
creator: asset.creator,
|
|
470
|
+
rarityRank: asset.rarityRank,
|
|
471
|
+
totalItems: collection?.totalItems,
|
|
472
|
+
contractUrl: getHiroExplorerContractUrl(asset.contractId),
|
|
473
|
+
contentType: asset.content?.contentType,
|
|
474
|
+
attributes: filterSip9Attributes(asset.attributes)
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
function filterSip9Attributes(attributes) {
|
|
478
|
+
if (!attributes) return [];
|
|
479
|
+
return attributes.filter((attr) => attr.traitType && attr.value && attr.value !== "None");
|
|
480
|
+
}
|
|
481
|
+
function formatAttributeValue(attribute) {
|
|
482
|
+
if (attribute.rarityPercent) return `${attribute.value} (${attribute.rarityPercent}%)`;
|
|
483
|
+
return String(attribute.value);
|
|
484
|
+
}
|
|
485
|
+
function getStampInfo(asset, bitcoinNetwork) {
|
|
486
|
+
return {
|
|
487
|
+
name: `Stamp #${asset.stamp}`,
|
|
488
|
+
stampExplorerUrl: asset.stampExplorerUrl,
|
|
489
|
+
blockExplorerUrl: asset.blockHeight ? getBitcoinExplorerLink({
|
|
490
|
+
id: asset.blockHeight.toString(),
|
|
491
|
+
type: "block",
|
|
492
|
+
networkPreference: bitcoinNetwork
|
|
493
|
+
}) : void 0,
|
|
494
|
+
blockHeight: asset.blockHeight
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
const DESCRIPTION_TRUNCATE_LENGTH = 180;
|
|
498
|
+
function truncateDescription(description, maxLength = DESCRIPTION_TRUNCATE_LENGTH) {
|
|
499
|
+
if (description.length <= maxLength) return {
|
|
500
|
+
text: description,
|
|
501
|
+
isTruncated: false
|
|
502
|
+
};
|
|
503
|
+
return {
|
|
504
|
+
text: `${description.slice(0, maxLength).trim()}…`,
|
|
505
|
+
isTruncated: true
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
//#endregion
|
|
510
|
+
//#region src/display-labels.ts
|
|
511
|
+
function getChainDisplayLabel(chain) {
|
|
512
|
+
return {
|
|
513
|
+
bitcoin: "Layer 1 (Bitcoin)",
|
|
514
|
+
stacks: "Layer 2 (Stacks)"
|
|
515
|
+
}[chain];
|
|
516
|
+
}
|
|
517
|
+
function getProtocolDisplayLabel(protocol) {
|
|
518
|
+
return {
|
|
519
|
+
nativeBtc: "Bitcoin",
|
|
520
|
+
nativeStx: "Stacks",
|
|
521
|
+
sip9: "SIP-009",
|
|
522
|
+
sip10: "SIP-010",
|
|
523
|
+
inscription: "Ordinals",
|
|
524
|
+
stamp: "Stamps",
|
|
525
|
+
brc20: "BRC-20",
|
|
526
|
+
src20: "SRC-20",
|
|
527
|
+
rune: "Runes"
|
|
528
|
+
}[protocol] ?? protocol;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
//#endregion
|
|
532
|
+
//#region src/formatting.ts
|
|
533
|
+
function formatSats(value) {
|
|
534
|
+
const n = typeof value === "string" ? Number(value) : value;
|
|
535
|
+
if (!Number.isFinite(n)) return String(value);
|
|
536
|
+
return `${n.toLocaleString()} sats`;
|
|
537
|
+
}
|
|
538
|
+
function formatTimestamp(timestamp) {
|
|
539
|
+
return (/* @__PURE__ */ new Date(timestamp * 1e3)).toLocaleDateString("en-US", {
|
|
540
|
+
year: "numeric",
|
|
541
|
+
month: "short",
|
|
542
|
+
day: "numeric"
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
function formatTimestampWithTime(timestamp) {
|
|
546
|
+
return dayjs.unix(timestamp).format("YYYY-MM-DD HH:mm");
|
|
547
|
+
}
|
|
548
|
+
|
|
271
549
|
//#endregion
|
|
272
550
|
//#region src/onramper/utils.ts
|
|
273
551
|
function generateSignature(data, signingSecret) {
|
|
@@ -355,5 +633,52 @@ function getOnramperIframeParams({ theme, btcAddress, stxAddress, apiKey, signin
|
|
|
355
633
|
}
|
|
356
634
|
|
|
357
635
|
//#endregion
|
|
358
|
-
|
|
636
|
+
//#region src/token/token-types.ts
|
|
637
|
+
const supportedAssetProtocols = [
|
|
638
|
+
"nativeBtc",
|
|
639
|
+
"nativeStx",
|
|
640
|
+
"sip10",
|
|
641
|
+
"rune",
|
|
642
|
+
"sip9",
|
|
643
|
+
"inscription",
|
|
644
|
+
"stamp"
|
|
645
|
+
];
|
|
646
|
+
const supportedFungibleAssetProtocols = [
|
|
647
|
+
"nativeBtc",
|
|
648
|
+
"nativeStx",
|
|
649
|
+
"sip10",
|
|
650
|
+
"rune"
|
|
651
|
+
];
|
|
652
|
+
const supportedNonFungibleAssetProtocols = [
|
|
653
|
+
"inscription",
|
|
654
|
+
"sip9",
|
|
655
|
+
"stamp"
|
|
656
|
+
];
|
|
657
|
+
function isSupportedFungibleAssetProtocol(value) {
|
|
658
|
+
return supportedFungibleAssetProtocols.includes(value);
|
|
659
|
+
}
|
|
660
|
+
function isSupportedNonFungibleAssetProtocol(value) {
|
|
661
|
+
return supportedNonFungibleAssetProtocols.includes(value);
|
|
662
|
+
}
|
|
663
|
+
function isSupportedAssetProtocol(value) {
|
|
664
|
+
return supportedAssetProtocols.includes(value);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
//#endregion
|
|
668
|
+
//#region src/balance/balance-types.ts
|
|
669
|
+
function isAccountQuotedBtcBalance(value) {
|
|
670
|
+
return "btc" in value;
|
|
671
|
+
}
|
|
672
|
+
function isAddressQuotedStxBalance(value) {
|
|
673
|
+
return "stx" in value;
|
|
674
|
+
}
|
|
675
|
+
function isSip10Balance(value) {
|
|
676
|
+
return "asset" in value && value.asset.protocol === CryptoAssetProtocols.sip10;
|
|
677
|
+
}
|
|
678
|
+
function isRuneBalance(value) {
|
|
679
|
+
return "asset" in value && value.asset.protocol === CryptoAssetProtocols.rune;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
//#endregion
|
|
683
|
+
export { DESCRIPTION_TRUNCATE_LENGTH, addOperator, createActivityView, createCollectibleView, createCollectibleViews, filterActivityByAsset, filterActivityBySerializedAssetId, filterSip9Attributes, formatActivityCaption, formatActivityStatusLabel, formatAttributeValue, formatSats, formatTimestamp, formatTimestampWithTime, getActivityAsset, getActivityAvatar, getActivityBalances, getActivityStatusIndicatorId, getActivityTitle, getBalanceColor, getBalanceOperator, getBalancesText, getBitcoinExplorerLink, getChainDisplayLabel, getGammaCollectionUrl, getHiroExplorerContractUrl, getInscriptionInfo, getOnramperIframeParams, getOrdExplorerUrl, getProtocolDisplayLabel, getSip9ContentTypeList, getSip9Info, getSip9MediaInfo, getStacksExplorerLink, getStampInfo, hasActivityStatus, hasTxDetails, isAccountQuotedBtcBalance, isAddressQuotedStxBalance, isRuneBalance, isSip10Balance, isSupportedAssetProtocol, isSupportedFungibleAssetProtocol, isSupportedNonFungibleAssetProtocol, makeActivityLink, truncateDescription };
|
|
359
684
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["fallbackActivityStatus: BaseOnChainActivity['status']","redirectUrls: Record<string, string>"],"sources":["../src/activity/activity-balance.ts","../src/activity/activity-links.ts","../src/activity/activity-metadata.ts","../src/activity/activity-status.ts","../src/activity/activity-timestamp.ts","../src/activity/activity-view.ts","../src/onramper/utils.ts","../src/onramper/onramper-params.ts"],"sourcesContent":["import type { Activity, Money } from '@leather.io/models';\nimport { type FormatAmountOptions, minusSign } from '@leather.io/utils';\n\nimport type { ActivityBalances } from './types';\n\nexport type FormatMoney = (money: Money, options?: FormatAmountOptions) => string;\n\nexport function addOperator(balance: string, operator?: string) {\n return operator ? `${operator} ${balance}` : balance;\n}\n\nexport function getBalanceOperator(activity: Activity) {\n if (activity.type === 'receiveAsset') return '+';\n if (activity.type === 'sendAsset') return minusSign;\n return undefined;\n}\n\nexport function getBalanceColor(activity: Activity) {\n if (activity.type === 'receiveAsset' && 'status' in activity && activity.status === 'success')\n return 'green.action-primary-default';\n return 'ink.text-primary';\n}\n\nexport function getBalancesText(activity: Activity, formatMoney: FormatMoney) {\n if (activity.type === 'swapAssets') {\n const formattedToBalanceCrypto =\n activity.toValue?.crypto && addOperator(formatMoney(activity.toValue?.crypto), '+');\n const formattedToBalanceQuote =\n activity.toValue?.quote && addOperator(formatMoney(activity.toValue?.quote), '+');\n\n return {\n formattedBalanceCrypto: formattedToBalanceCrypto,\n formattedBalanceQuote: formattedToBalanceQuote,\n };\n }\n\n if (!('value' in activity))\n return {\n formattedBalanceCrypto: '',\n formattedBalanceQuote: '',\n };\n const formattedBalanceCrypto =\n activity.value?.crypto &&\n addOperator(formatMoney(activity.value?.crypto), getBalanceOperator(activity));\n const formattedBalanceQuote =\n activity.value?.quote &&\n addOperator(formatMoney(activity.value?.quote), getBalanceOperator(activity));\n\n return {\n formattedBalanceCrypto,\n formattedBalanceQuote,\n };\n}\n\nexport function getActivityBalances(activity: Activity): ActivityBalances {\n if (activity.type === 'swapAssets') {\n return {\n operator: '+',\n crypto: activity.toValue?.crypto,\n quote: activity.toValue?.quote,\n color: getBalanceColor(activity),\n };\n }\n\n if (!('value' in activity)) return {};\n\n return {\n operator: getBalanceOperator(activity),\n crypto: activity.value?.crypto,\n quote: activity.value?.quote,\n color: getBalanceColor(activity),\n };\n}\n","import { HIRO_EXPLORER_URL, MEMPOOL_BASE_URL } from '@leather.io/constants';\nimport {\n type BitcoinNetwork,\n type BitcoinNetworkModes,\n type CryptoAsset,\n HIRO_API_BASE_URL_NAKAMOTO_TESTNET,\n type NetworkConfiguration,\n} from '@leather.io/models';\n\ninterface MakeActivityLinkArgs {\n txid: string;\n networkPreference: NetworkConfiguration;\n asset?: CryptoAsset;\n}\n\nexport function makeActivityLink({ txid, networkPreference, asset }: MakeActivityLinkArgs) {\n if (txid && asset) {\n return makeActivityExplorerLink({\n asset,\n txid,\n networkPreference,\n });\n }\n return null;\n}\n\ninterface MakeActivityExplorerLinkArgs {\n asset: CryptoAsset;\n txid: string;\n networkPreference: NetworkConfiguration;\n}\n\nfunction makeActivityExplorerLink({\n asset,\n txid,\n networkPreference,\n}: MakeActivityExplorerLinkArgs) {\n if (asset.chain === 'bitcoin') {\n return getBitcoinExplorerLink({\n networkPreference: networkPreference.chain.bitcoin.bitcoinNetwork,\n id: txid,\n type: 'tx',\n });\n }\n return getStacksExplorerLink({\n mode: networkPreference.chain.bitcoin.mode,\n type: 'txid',\n value: txid,\n searchParams: undefined,\n isNakamoto: false,\n });\n}\n\nexport interface GetMempoolExplorerLinkArgs {\n id: string;\n type: 'tx' | 'block';\n networkPreference: BitcoinNetwork;\n}\n\nexport function getBitcoinExplorerLink({\n id,\n type,\n networkPreference,\n}: GetMempoolExplorerLinkArgs) {\n switch (networkPreference) {\n case 'mainnet':\n return `${MEMPOOL_BASE_URL}/${type}/${id}`;\n case 'testnet3':\n return `${MEMPOOL_BASE_URL}/testnet/${type}/${id}`;\n case 'testnet4':\n return `${MEMPOOL_BASE_URL}/testnet4/${type}/${id}`;\n case 'signet':\n return `${MEMPOOL_BASE_URL}/signet/${type}/${id}`;\n default:\n return null;\n }\n}\n\ninterface GetHiroExplorerLinkArgs {\n mode: BitcoinNetworkModes;\n type: 'txid' | 'address';\n value: string;\n searchParams?: URLSearchParams;\n isNakamoto?: boolean;\n}\n\nexport function getStacksExplorerLink({\n mode,\n type,\n value,\n searchParams = new URLSearchParams(),\n isNakamoto = false,\n}: GetHiroExplorerLinkArgs) {\n if (mode === 'regtest' && type === 'txid') return `http://localhost:8000/txid/${value}`;\n searchParams.append('chain', mode);\n if (isNakamoto) searchParams.append('api', HIRO_API_BASE_URL_NAKAMOTO_TESTNET);\n return `${HIRO_EXPLORER_URL}/${type}/${value}?${searchParams.toString()}`;\n}\n","import type { Activity, CryptoAsset, OnChainActivityStatus } from '@leather.io/models';\n\nimport type { ActivityAvatar } from './types';\n\nexport function hasTxDetails(\n activity: Activity\n): activity is Activity & { txid: string; status: OnChainActivityStatus } {\n return 'txid' in activity && 'status' in activity;\n}\n\nexport function getActivityTitle(activity: Activity) {\n switch (activity.type) {\n case 'sendAsset':\n case 'receiveAsset':\n if (!activity.value?.crypto?.symbol) {\n return `Token Transfer`;\n }\n return activity.value?.crypto?.symbol;\n case 'deploySmartContract':\n case 'executeSmartContract':\n return activity.contractId.split('.').pop() || `Unknown`;\n case 'swapAssets':\n return `Swap Assets`;\n case 'lockAsset':\n return `Lock Asset`;\n case 'connectApp':\n case 'signMessage':\n if ('appName' in activity && activity.appName) return activity.appName;\n return `Wallet Activity`;\n case 'walletAdded':\n case 'receiveAnnouncement':\n case 'featureWaitlistNotification':\n if ('title' in activity && activity.title) return activity.title;\n return `Announcement`;\n default:\n return `Unknown`;\n }\n}\n\nexport function getActivityAsset(activity: Activity): CryptoAsset | undefined {\n if ('asset' in activity) return activity.asset;\n if (activity.type === 'swapAssets') return activity.toAsset;\n return undefined;\n}\n\nexport function getActivityAvatar(activity: Activity): ActivityAvatar {\n if (activity.type === 'swapAssets') return 'swap';\n return getActivityAsset(activity) ? 'asset' : 'fallback';\n}\n","import {\n type Activity,\n type BaseOnChainActivity,\n isFungibleAsset,\n isInscriptionAsset,\n isStampAsset,\n} from '@leather.io/models';\n\nimport type { ActivityStatusIndicatorId } from './types';\n\nexport function hasActivityStatus(activity: Activity): activity is Activity & {\n status: BaseOnChainActivity['status'];\n} {\n return 'status' in activity;\n}\n\nconst fallbackActivityStatus: BaseOnChainActivity['status'] = 'success';\n\nfunction getActivityStatusMap(): Record<\n Activity['type'],\n Record<BaseOnChainActivity['status'], string>\n> {\n return {\n sendAsset: {\n success: `Sent`,\n pending: `Sending`,\n failed: `Send Failed`,\n },\n receiveAsset: {\n success: `Received`,\n pending: '',\n failed: `Receive fail`,\n },\n executeSmartContract: {\n success: `Executed`,\n pending: `Executing`,\n failed: `Execution failed`,\n },\n deploySmartContract: {\n success: `Deployed`,\n pending: `Deploying`,\n failed: `Deployment failed`,\n },\n lockAsset: {\n success: `Locked`,\n pending: `Locking`,\n failed: `Lock failed`,\n },\n swapAssets: {\n success: `Swapped`,\n pending: `Swapping`,\n failed: `Swap failed`,\n },\n connectApp: {\n success: `Connected`,\n pending: `Connecting`,\n failed: `Connection failed`,\n },\n signMessage: {\n success: `Signed`,\n pending: `Signing`,\n failed: `Signing failed`,\n },\n walletAdded: {\n success: `Wallet added`,\n pending: `Adding wallet`,\n failed: `Adding wallet failed`,\n },\n receiveAnnouncement: {\n success: `Announcement received`,\n pending: `Receiving announcement`,\n failed: `Receiving announcement failed`,\n },\n featureWaitlistNotification: {\n success: `Feature waitlist notification`,\n pending: `Receiving feature waitlist notification`,\n failed: `Receiving feature waitlist notification failed`,\n },\n };\n}\n\nexport function formatActivityStatusLabel(activity: Activity) {\n const activityStatusMap = getActivityStatusMap();\n\n switch (activity.type) {\n case 'deploySmartContract':\n case 'executeSmartContract': {\n const contractName = activity.contractId.split('.')[1];\n return contractName ?? 'Unknown';\n }\n case 'swapAssets':\n if (isFungibleAsset(activity.fromAsset) && isFungibleAsset(activity.toAsset)) {\n return `${activity.fromAsset.symbol} → ${activity.toAsset.symbol}`;\n } else if (isStampAsset(activity.fromAsset) && isStampAsset(activity.toAsset)) {\n return `Stamp → Stamp`;\n } else if (isInscriptionAsset(activity.fromAsset) && isInscriptionAsset(activity.toAsset)) {\n return `${activity.fromAsset.title} → ${activity.toAsset.title}`;\n }\n return `${activity.fromAsset.category} → ${activity.toAsset.category}`;\n default: {\n const status = hasActivityStatus(activity) ? activity.status : fallbackActivityStatus;\n return activityStatusMap[activity.type][status];\n }\n }\n}\n\nexport function getActivityStatusIndicatorId(activity: Activity): ActivityStatusIndicatorId {\n if (!hasActivityStatus(activity)) return 'hidden';\n\n switch (activity.status) {\n case 'pending':\n return 'pending';\n case 'failed':\n return 'failed';\n case 'success':\n switch (activity.type) {\n case 'sendAsset':\n return 'sent';\n case 'receiveAsset':\n return 'received';\n case 'swapAssets':\n return 'swap';\n case 'executeSmartContract':\n return 'function';\n default:\n return 'hidden';\n }\n default:\n return 'hidden';\n }\n}\n","import dayjs from 'dayjs';\n\nimport type { Activity } from '@leather.io/models';\n\nexport function formatActivityCaption({ timestamp }: Pick<Activity, 'timestamp'>) {\n const timestampInSeconds = timestamp * 1000;\n const isRecent = !dayjs(timestampInSeconds).isBefore(dayjs().subtract(1, 'hour'));\n const time = dayjs(timestampInSeconds).format('MMM D, YYYY');\n\n const timestampText = isRecent\n ? `${dayjs().diff(dayjs(timestampInSeconds), 'minute')} ${`minutes ago`}`\n : time;\n\n return timestampText;\n}\n","import type { Activity, NetworkConfiguration } from '@leather.io/models';\n\nimport { getActivityBalances } from './activity-balance';\nimport { makeActivityLink } from './activity-links';\nimport {\n getActivityAsset,\n getActivityAvatar,\n getActivityTitle,\n hasTxDetails,\n} from './activity-metadata';\nimport { formatActivityStatusLabel, getActivityStatusIndicatorId } from './activity-status';\nimport { formatActivityCaption } from './activity-timestamp';\nimport type { ActivityView } from './types';\n\nfunction getActivityKey(activity: Activity): string {\n if ('txid' in activity) return activity.txid;\n return `${activity.type}-${activity.timestamp}`;\n}\n\nexport function createActivityView(\n activity: Activity,\n networkPreference: NetworkConfiguration\n): ActivityView {\n const asset = getActivityAsset(activity);\n const balances = getActivityBalances(activity);\n const title = getActivityTitle(activity);\n const statusLabel = formatActivityStatusLabel(activity);\n const caption = formatActivityCaption(activity);\n const combinedCaption = statusLabel ? `${statusLabel} ${caption}` : caption;\n\n const activityAvatar = getActivityAvatar(activity);\n const statusIndicator = getActivityStatusIndicatorId(activity);\n const fromAsset = activity.type === 'swapAssets' ? activity.fromAsset : undefined;\n const toAsset = activity.type === 'swapAssets' ? activity.toAsset : undefined;\n const activityLink =\n hasTxDetails(activity) && asset\n ? makeActivityLink({ txid: activity.txid, networkPreference, asset })\n : null;\n\n return {\n key: getActivityKey(activity),\n asset,\n fromAsset,\n toAsset,\n title,\n caption: combinedCaption,\n statusLabel,\n balances,\n activityLink,\n activityAvatar,\n statusIndicator,\n };\n}\n","import { hmac } from '@noble/hashes/hmac';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nexport function generateSignature(data: string, signingSecret: string): string {\n const encoder = new TextEncoder();\n const dataBytes = encoder.encode(data);\n const signingSecretBytes = encoder.encode(signingSecret);\n const signatureBytes = hmac(sha256, signingSecretBytes, dataBytes);\n return bytesToHex(signatureBytes);\n}\n\nexport function formatColorHexForParams(colorHex: string) {\n return colorHex.replace('#', '');\n}\n\ninterface MatchAddresses<T> {\n btcAddress: string | undefined;\n stxAddress: string | undefined;\n resultMap: {\n bothAvailable: T;\n onlyBtc: T;\n onlyStx: T;\n none: T;\n };\n}\n\nexport function matchAddresses<T>({ btcAddress, stxAddress, resultMap }: MatchAddresses<T>) {\n if (btcAddress && stxAddress) {\n return resultMap.bothAvailable;\n }\n if (btcAddress) {\n return resultMap.onlyBtc;\n }\n if (stxAddress) {\n return resultMap.onlyStx;\n }\n return resultMap.none;\n}\n","import { colorThemes } from '@leather.io/tokens';\n\nimport { OnramperMode } from './types';\nimport { formatColorHexForParams, generateSignature, matchAddresses } from './utils';\n\ninterface GetIframeProps {\n theme: 'dark' | 'light';\n btcAddress: string | undefined;\n stxAddress: string | undefined;\n apiKey: string;\n signingSecret: string;\n mode: OnramperMode;\n successRedirectUrl: string | undefined;\n failureRedirectUrl: string | undefined;\n redirectAtCheckout?: boolean;\n}\n\nexport function getOnramperIframeParams({\n theme,\n btcAddress,\n stxAddress,\n apiKey,\n signingSecret,\n mode,\n successRedirectUrl,\n failureRedirectUrl,\n redirectAtCheckout = false,\n}: GetIframeProps) {\n const redirectUrls: Record<string, string> = {};\n if (successRedirectUrl) redirectUrls['successRedirectUrl'] = successRedirectUrl;\n if (failureRedirectUrl) redirectUrls['failureRedirectUrl'] = failureRedirectUrl;\n const wallets = matchAddresses({\n btcAddress,\n stxAddress,\n resultMap: {\n bothAvailable: `btc:${btcAddress},stx_stacks:${stxAddress}`,\n onlyBtc: `btc:${btcAddress}`,\n onlyStx: `stx_stacks:${stxAddress}`,\n none: '',\n },\n });\n const onlyCryptoNetworks = matchAddresses({\n btcAddress,\n stxAddress,\n resultMap: {\n bothAvailable: `stacks,bitcoin`,\n onlyBtc: `bitcoin`,\n onlyStx: `stacks`,\n none: '',\n },\n });\n const onlyCryptos = matchAddresses({\n btcAddress,\n stxAddress,\n resultMap: {\n bothAvailable: `stx_stacks,btc`,\n onlyBtc: `btc`,\n onlyStx: `stx_stacks`,\n none: '',\n },\n });\n const signContent = `wallets=${wallets}`;\n\n const colors = theme === 'dark' ? colorThemes.dark : colorThemes.base;\n const params = new URLSearchParams({\n darkMode: theme === 'dark' ? 'true' : 'false',\n themeName: theme,\n primaryColor: formatColorHexForParams(colors['ink.action-primary-default']),\n secondaryColor: formatColorHexForParams(colors['ink.component-background-default']),\n primaryTextColor: formatColorHexForParams(colors['ink.text-primary']),\n secondaryTextColor: formatColorHexForParams(colors['ink.text-subdued']),\n containerColor: formatColorHexForParams(colors['ink.background-primary']),\n cardColor: formatColorHexForParams(colors['ink.component-background-hover']),\n primaryBtnTextColor: formatColorHexForParams(colors['ink.background-primary']),\n borderRadius: '0.25',\n widgetBorderRadius: '0.1',\n apiKey,\n signature: generateSignature(signContent, signingSecret),\n mode,\n onlyCryptoNetworks,\n sell_onlyCryptoNetworks: onlyCryptoNetworks,\n onlyCryptos,\n sell_onlyCryptos: onlyCryptos,\n defaultFiat: 'USD',\n sell_defaultFiat: 'USD',\n defaultAmount: '25',\n sell_defaultCrypto: 'BTC',\n sell_defaultAmount: '0.0005',\n redirectAtCheckout: redirectAtCheckout.toString(),\n hideTopBar: 'true',\n wallets,\n ...redirectUrls,\n });\n return params;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["fallbackActivityStatus: BaseOnChainActivity['status']","redirectUrls: Record<string, string>"],"sources":["../src/activity/activity-balance.ts","../src/activity/activity-links.ts","../src/activity/activity-metadata.ts","../src/activity/activity-status.ts","../src/activity/activity-timestamp.ts","../src/activity/activity-view.ts","../src/activity/activity-filter.ts","../src/collectibles/collectible-view.ts","../src/collectibles/sip9-media.ts","../src/collectibles/collectible-details.ts","../src/display-labels.ts","../src/formatting.ts","../src/onramper/utils.ts","../src/onramper/onramper-params.ts","../src/token/token-types.ts","../src/balance/balance-types.ts"],"sourcesContent":["import type { Activity, Money } from '@leather.io/models';\nimport { type FormatAmountOptions, minusSign } from '@leather.io/utils';\n\nimport type { ActivityBalances } from './types';\n\nexport type FormatMoney = (money: Money, options?: FormatAmountOptions) => string;\n\nexport function addOperator(balance: string, operator?: string) {\n return operator ? `${operator} ${balance}` : balance;\n}\n\nexport function getBalanceOperator(activity: Activity) {\n if (activity.type === 'receiveAsset') return '+';\n if (activity.type === 'sendAsset') return minusSign;\n return undefined;\n}\n\nexport function getBalanceColor(activity: Activity) {\n if (activity.type === 'receiveAsset' && 'status' in activity && activity.status === 'success')\n return 'green.action-primary-default';\n return 'ink.text-primary';\n}\n\nexport function getBalancesText(activity: Activity, formatMoney: FormatMoney) {\n if (activity.type === 'swapAssets') {\n const formattedToBalanceCrypto =\n activity.toValue?.crypto && addOperator(formatMoney(activity.toValue?.crypto), '+');\n const formattedToBalanceQuote =\n activity.toValue?.quote && addOperator(formatMoney(activity.toValue?.quote), '+');\n\n return {\n formattedBalanceCrypto: formattedToBalanceCrypto,\n formattedBalanceQuote: formattedToBalanceQuote,\n };\n }\n\n if (!('value' in activity))\n return {\n formattedBalanceCrypto: '',\n formattedBalanceQuote: '',\n };\n const formattedBalanceCrypto =\n activity.value?.crypto &&\n addOperator(formatMoney(activity.value?.crypto), getBalanceOperator(activity));\n const formattedBalanceQuote =\n activity.value?.quote &&\n addOperator(formatMoney(activity.value?.quote), getBalanceOperator(activity));\n\n return {\n formattedBalanceCrypto,\n formattedBalanceQuote,\n };\n}\n\nexport function getActivityBalances(activity: Activity): ActivityBalances {\n if (activity.type === 'swapAssets') {\n return {\n operator: '+',\n crypto: activity.toValue?.crypto,\n quote: activity.toValue?.quote,\n color: getBalanceColor(activity),\n };\n }\n\n if (!('value' in activity)) return {};\n\n return {\n operator: getBalanceOperator(activity),\n crypto: activity.value?.crypto,\n quote: activity.value?.quote,\n color: getBalanceColor(activity),\n };\n}\n","import { HIRO_EXPLORER_URL, MEMPOOL_BASE_URL } from '@leather.io/constants';\nimport {\n type BitcoinNetwork,\n type BitcoinNetworkModes,\n type CryptoAsset,\n HIRO_API_BASE_URL_NAKAMOTO_TESTNET,\n type NetworkConfiguration,\n} from '@leather.io/models';\n\ninterface MakeActivityLinkArgs {\n txid: string;\n networkPreference: NetworkConfiguration;\n asset?: CryptoAsset;\n}\n\nexport function makeActivityLink({ txid, networkPreference, asset }: MakeActivityLinkArgs) {\n if (txid && asset) {\n return makeActivityExplorerLink({\n asset,\n txid,\n networkPreference,\n });\n }\n return null;\n}\n\ninterface MakeActivityExplorerLinkArgs {\n asset: CryptoAsset;\n txid: string;\n networkPreference: NetworkConfiguration;\n}\n\nfunction makeActivityExplorerLink({\n asset,\n txid,\n networkPreference,\n}: MakeActivityExplorerLinkArgs) {\n if (asset.chain === 'bitcoin') {\n return getBitcoinExplorerLink({\n networkPreference: networkPreference.chain.bitcoin.bitcoinNetwork,\n id: txid,\n type: 'tx',\n });\n }\n return getStacksExplorerLink({\n mode: networkPreference.chain.bitcoin.mode,\n type: 'txid',\n value: txid,\n searchParams: undefined,\n isNakamoto: false,\n });\n}\n\nexport interface GetMempoolExplorerLinkArgs {\n id: string;\n type: 'tx' | 'block';\n networkPreference: BitcoinNetwork;\n}\n\nexport function getBitcoinExplorerLink({\n id,\n type,\n networkPreference,\n}: GetMempoolExplorerLinkArgs) {\n switch (networkPreference) {\n case 'mainnet':\n return `${MEMPOOL_BASE_URL}/${type}/${id}`;\n case 'testnet3':\n return `${MEMPOOL_BASE_URL}/testnet/${type}/${id}`;\n case 'testnet4':\n return `${MEMPOOL_BASE_URL}/testnet4/${type}/${id}`;\n case 'signet':\n return `${MEMPOOL_BASE_URL}/signet/${type}/${id}`;\n default:\n return null;\n }\n}\n\ninterface GetHiroExplorerLinkArgs {\n mode: BitcoinNetworkModes;\n type: 'txid' | 'address';\n value: string;\n searchParams?: URLSearchParams;\n isNakamoto?: boolean;\n}\n\nexport function getStacksExplorerLink({\n mode,\n type,\n value,\n searchParams = new URLSearchParams(),\n isNakamoto = false,\n}: GetHiroExplorerLinkArgs) {\n if (mode === 'regtest' && type === 'txid') return `http://localhost:8000/txid/${value}`;\n searchParams.append('chain', mode);\n if (isNakamoto) searchParams.append('api', HIRO_API_BASE_URL_NAKAMOTO_TESTNET);\n return `${HIRO_EXPLORER_URL}/${type}/${value}?${searchParams.toString()}`;\n}\n","import { stxAsset } from '@leather.io/constants';\nimport type { Activity, CryptoAsset, OnChainActivityStatus } from '@leather.io/models';\n\nimport type { ActivityAvatar } from './types';\n\nexport function hasTxDetails(\n activity: Activity\n): activity is Activity & { txid: string; status: OnChainActivityStatus } {\n return 'txid' in activity && 'status' in activity;\n}\n\nexport function getActivityTitle(activity: Activity) {\n switch (activity.type) {\n case 'sendAsset':\n case 'receiveAsset':\n if (!activity.value?.crypto?.symbol) {\n return `Token Transfer`;\n }\n return activity.value?.crypto?.symbol;\n case 'deploySmartContract':\n case 'executeSmartContract':\n return activity.contractId.split('.').pop() || `Unknown`;\n case 'swapAssets':\n if ('sbtcBridgeStatus' in activity) {\n return `BTC → sBTC`;\n }\n return `Swap Assets`;\n case 'lockAsset':\n return `Lock Asset`;\n case 'connectApp':\n case 'signMessage':\n if ('appName' in activity && activity.appName) return activity.appName;\n return `Wallet Activity`;\n case 'walletAdded':\n case 'receiveAnnouncement':\n case 'featureWaitlistNotification':\n if ('title' in activity && activity.title) return activity.title;\n return `Announcement`;\n default:\n return `Unknown`;\n }\n}\n\nexport function getActivityAsset(activity: Activity): CryptoAsset | undefined {\n if ('asset' in activity) return activity.asset;\n if (activity.type === 'swapAssets') return activity.toAsset;\n if (activity.type === 'deploySmartContract' || activity.type === 'executeSmartContract')\n return stxAsset;\n return undefined;\n}\n\nexport function getActivityAvatar(activity: Activity): ActivityAvatar {\n if (activity.type === 'swapAssets') return 'swap';\n return getActivityAsset(activity) ? 'asset' : 'fallback';\n}\n","import {\n type Activity,\n type BaseOnChainActivity,\n isFungibleAsset,\n isInscriptionAsset,\n isStampAsset,\n} from '@leather.io/models';\n\nimport type { ActivityStatusIndicatorId } from './types';\n\nexport function hasActivityStatus(activity: Activity): activity is Activity & {\n status: BaseOnChainActivity['status'];\n} {\n return 'status' in activity;\n}\n\nconst fallbackActivityStatus: BaseOnChainActivity['status'] = 'success';\n\nfunction getActivityStatusMap(): Record<\n Activity['type'],\n Record<BaseOnChainActivity['status'], string>\n> {\n return {\n sendAsset: {\n success: `Sent`,\n pending: `Sending`,\n failed: `Send Failed`,\n },\n receiveAsset: {\n success: `Received`,\n pending: '',\n failed: `Receive fail`,\n },\n executeSmartContract: {\n success: `Executed`,\n pending: `Executing`,\n failed: `Execution failed`,\n },\n deploySmartContract: {\n success: `Deployed`,\n pending: `Deploying`,\n failed: `Deployment failed`,\n },\n lockAsset: {\n success: `Locked`,\n pending: `Locking`,\n failed: `Lock failed`,\n },\n swapAssets: {\n success: `Swapped`,\n pending: `Swapping`,\n failed: `Swap failed`,\n },\n connectApp: {\n success: `Connected`,\n pending: `Connecting`,\n failed: `Connection failed`,\n },\n signMessage: {\n success: `Signed`,\n pending: `Signing`,\n failed: `Signing failed`,\n },\n walletAdded: {\n success: `Wallet added`,\n pending: `Adding wallet`,\n failed: `Adding wallet failed`,\n },\n receiveAnnouncement: {\n success: `Announcement received`,\n pending: `Receiving announcement`,\n failed: `Receiving announcement failed`,\n },\n featureWaitlistNotification: {\n success: `Feature waitlist notification`,\n pending: `Receiving feature waitlist notification`,\n failed: `Receiving feature waitlist notification failed`,\n },\n };\n}\n\nexport function formatActivityStatusLabel(activity: Activity) {\n const activityStatusMap = getActivityStatusMap();\n\n switch (activity.type) {\n case 'deploySmartContract':\n case 'executeSmartContract': {\n const contractName = activity.contractId.split('.')[1];\n return contractName ?? 'Unknown';\n }\n case 'swapAssets':\n if ('sbtcBridgeStatus' in activity && activity.sbtcBridgeStatus) {\n switch (activity.sbtcBridgeStatus) {\n case 'pending':\n return 'Pending deposit';\n case 'accepted':\n return 'Pending mint';\n case 'failed':\n return 'Failed';\n case 'rbf':\n return 'Replaced';\n case 'confirmed':\n return 'Confirmed';\n default:\n return undefined;\n }\n }\n if (isFungibleAsset(activity.fromAsset) && isFungibleAsset(activity.toAsset)) {\n return `${activity.fromAsset.symbol} → ${activity.toAsset.symbol}`;\n } else if (isStampAsset(activity.fromAsset) && isStampAsset(activity.toAsset)) {\n return `Stamp → Stamp`;\n } else if (isInscriptionAsset(activity.fromAsset) && isInscriptionAsset(activity.toAsset)) {\n return `${activity.fromAsset.title} → ${activity.toAsset.title}`;\n }\n return `${activity.fromAsset.category} → ${activity.toAsset.category}`;\n default: {\n const status = hasActivityStatus(activity) ? activity.status : fallbackActivityStatus;\n return activityStatusMap[activity.type][status];\n }\n }\n}\n\nexport function getActivityStatusIndicatorId(activity: Activity): ActivityStatusIndicatorId {\n if (!hasActivityStatus(activity)) return 'hidden';\n\n switch (activity.status) {\n case 'pending':\n return 'pending';\n case 'failed':\n return 'failed';\n case 'success':\n switch (activity.type) {\n case 'sendAsset':\n return 'sent';\n case 'receiveAsset':\n return 'received';\n case 'swapAssets':\n return 'swap';\n case 'executeSmartContract':\n return 'function';\n default:\n return 'hidden';\n }\n default:\n return 'hidden';\n }\n}\n","import dayjs from 'dayjs';\n\nimport type { Activity } from '@leather.io/models';\n\nexport function formatActivityCaption({ timestamp }: Pick<Activity, 'timestamp'>) {\n const timestampMs = timestamp * 1000;\n const now = dayjs();\n const then = dayjs(timestampMs);\n\n const minutes = now.diff(then, 'minute');\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = now.diff(then, 'hour');\n if (hours < 24) return `${hours}h ago`;\n\n const days = now.diff(then, 'day');\n if (days < 30) {\n const isDifferentMonth = now.year() === then.year() && now.month() !== then.month();\n if (isDifferentMonth) {\n const calendarMonthDiff = now.year() * 12 + now.month() - (then.year() * 12 + then.month());\n return `${calendarMonthDiff}mo ago`;\n } else {\n return `${days}d ago`;\n }\n }\n\n const months = now.diff(then, 'month');\n if (months < 12) return `${months}mo ago`;\n\n const years = now.diff(then, 'year');\n return `${years}y ago`;\n}\n","import { SBTC_RECLAIM_URL } from '@leather.io/constants';\nimport type { Activity, NetworkConfiguration } from '@leather.io/models';\n\nimport { getActivityBalances } from './activity-balance';\nimport { makeActivityLink } from './activity-links';\nimport {\n getActivityAsset,\n getActivityAvatar,\n getActivityTitle,\n hasTxDetails,\n} from './activity-metadata';\nimport { formatActivityStatusLabel, getActivityStatusIndicatorId } from './activity-status';\nimport { formatActivityCaption } from './activity-timestamp';\nimport type { ActivityView } from './types';\n\nfunction getActivityKey(activity: Activity): string {\n if ('txid' in activity) return activity.txid;\n return `${activity.type}-${activity.timestamp}`;\n}\n\nfunction hasSbtcBridgeFailed(activity: Activity): boolean {\n return (\n activity.type === 'swapAssets' &&\n 'sbtcBridgeStatus' in activity &&\n activity.sbtcBridgeStatus === 'failed'\n );\n}\n\nfunction getActivityLink(\n activity: Activity,\n asset: ReturnType<typeof getActivityAsset>,\n networkPreference: NetworkConfiguration\n) {\n const showSbtcReclaimUrl = hasSbtcBridgeFailed(activity) && 'txid' in activity && activity.txid;\n if (showSbtcReclaimUrl) {\n return `${SBTC_RECLAIM_URL}${activity.txid}`;\n }\n if (hasTxDetails(activity) && asset) {\n return makeActivityLink({ txid: activity.txid, networkPreference, asset });\n }\n return null;\n}\n\nexport function createActivityView(\n activity: Activity,\n networkPreference: NetworkConfiguration\n): ActivityView {\n const asset = getActivityAsset(activity);\n const balances = getActivityBalances(activity);\n const title = getActivityTitle(activity);\n const statusLabel = formatActivityStatusLabel(activity);\n const caption = formatActivityCaption(activity);\n const combinedCaption = statusLabel ? `${statusLabel} ${caption}` : caption;\n\n const activityAvatar = getActivityAvatar(activity);\n const statusIndicator = getActivityStatusIndicatorId(activity);\n const fromAsset = activity.type === 'swapAssets' ? activity.fromAsset : undefined;\n const toAsset = activity.type === 'swapAssets' ? activity.toAsset : undefined;\n\n const activityLink = getActivityLink(activity, asset, networkPreference);\n\n return {\n key: getActivityKey(activity),\n asset,\n fromAsset,\n toAsset,\n title,\n caption: combinedCaption,\n statusLabel: statusLabel ?? null,\n balances,\n activityLink,\n activityAvatar,\n statusIndicator,\n };\n}\n","import type { CryptoAsset } from '@leather.io/models';\nimport { type SerializedCryptoAssetId, getAssetId, serializeAssetId } from '@leather.io/utils';\n\nimport type { ActivityView } from './types';\n\nfunction getActivityViewAssetIds(view: ActivityView): SerializedCryptoAssetId[] {\n const assets = [view.asset, view.fromAsset, view.toAsset].filter(\n (value): value is CryptoAsset => !!value\n );\n return assets.map(asset => serializeAssetId(getAssetId(asset)));\n}\n\nexport function filterActivityBySerializedAssetId(\n activity: ActivityView[],\n serializedAssetId: SerializedCryptoAssetId\n) {\n return activity.filter(view => getActivityViewAssetIds(view).includes(serializedAssetId));\n}\n\nexport function filterActivityByAsset(activity: ActivityView[], asset: CryptoAsset) {\n const serializedAssetId = serializeAssetId(getAssetId(asset));\n return filterActivityBySerializedAssetId(activity, serializedAssetId);\n}\n","import { type NonFungibleCryptoAsset } from '@leather.io/models';\nimport { getStacksContractAssetName } from '@leather.io/stacks';\nimport { assertUnreachable, getAssetId, serializeAssetId } from '@leather.io/utils';\n\nexport interface CollectibleView {\n key: string;\n protocol: NonFungibleCryptoAsset['protocol'];\n title: string;\n subtitle: string;\n asset: NonFungibleCryptoAsset;\n isBns?: boolean;\n}\n\nexport function createCollectibleView(asset: NonFungibleCryptoAsset): CollectibleView {\n const key = serializeAssetId(getAssetId(asset));\n\n switch (asset.protocol) {\n case 'inscription':\n return {\n key,\n protocol: asset.protocol,\n title: `# ${asset.number}`,\n subtitle: 'Ordinal inscription',\n asset,\n };\n case 'stamp':\n return {\n key,\n protocol: asset.protocol,\n title: `# ${asset.stamp}`,\n subtitle: 'Bitcoin Stamp',\n asset,\n };\n case 'sip9': {\n const assetName = getStacksContractAssetName(asset.assetId);\n const isBns =\n asset.assetId.toLowerCase().endsWith('.bns::names') ||\n assetName?.toUpperCase() === 'BNS-V2';\n return {\n key,\n protocol: asset.protocol,\n title: asset.name || assetName || 'Unknown collectible',\n subtitle: asset.collection?.name ?? 'Stacks collectible',\n asset,\n isBns,\n };\n }\n default:\n return assertUnreachable(asset);\n }\n}\n\nexport function createCollectibleViews(assets: NonFungibleCryptoAsset[]) {\n return assets.map(createCollectibleView);\n}\n","const supportedSip9ContentTypes = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'image/bmp',\n 'image/tiff',\n 'image/avif',\n 'video/mp4',\n 'audio/mpeg',\n 'audio/mp3',\n 'audio/wav',\n 'audio/ogg',\n 'audio/aac',\n 'audio/flac',\n 'audio/webm',\n 'text/plain',\n 'application/octet-stream',\n 'model/gltf+json',\n 'model/gltf-binary',\n] as const;\n\nconst supportedContentTypesSet = new Set<string>(supportedSip9ContentTypes);\n\nexport type Sip9SupportedContentType = (typeof supportedSip9ContentTypes)[number];\n\nexport interface Sip9MediaInfo {\n contentType: Sip9SupportedContentType | null;\n isVideo: boolean;\n isImage: boolean;\n isAudio: boolean;\n}\n\nfunction isSupportedContentType(\n contentType: string | null\n): contentType is Sip9SupportedContentType {\n if (contentType === null) return false;\n return supportedContentTypesSet.has(contentType);\n}\n\nfunction inferFromExtension(url: string): Sip9MediaInfo {\n const extension = url.split('.').pop()?.toLowerCase() ?? '';\n const videoExtensions = ['mp4', 'webm', 'mov', 'avi', 'mkv', 'm4v'];\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'];\n const audioExtensions = ['mp3', 'wav', 'ogg'];\n\n return {\n contentType: null,\n isVideo: videoExtensions.includes(extension),\n isImage: imageExtensions.includes(extension),\n isAudio: audioExtensions.includes(extension),\n };\n}\n\nexport async function getSip9MediaInfo(url: string): Promise<Sip9MediaInfo> {\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers: {\n Range: 'bytes=0-0',\n },\n });\n\n const rawContentType = response.headers.get('content-type');\n const contentType = isSupportedContentType(rawContentType) ? rawContentType : null;\n\n return {\n contentType,\n isVideo: contentType?.startsWith('video/') ?? false,\n isImage: contentType?.startsWith('image/') || contentType === 'application/octet-stream',\n isAudio: contentType?.startsWith('audio/') ?? false,\n };\n } catch {\n return inferFromExtension(url);\n }\n}\n\nexport function getSip9ContentTypeList() {\n return [...supportedSip9ContentTypes];\n}\n","import { GAMMA_URL, HIRO_EXPLORER_URL, ORD_IO_URL } from '@leather.io/constants';\nimport type {\n BitcoinNetwork,\n InscriptionAsset,\n Sip9Asset,\n Sip9Attribute,\n StampAsset,\n} from '@leather.io/models';\n\nimport { getBitcoinExplorerLink } from '../activity/activity-links';\n\nexport function getOrdExplorerUrl(inscriptionNumber?: number): string | undefined {\n if (!inscriptionNumber) return undefined;\n return `${ORD_IO_URL}/${inscriptionNumber}`;\n}\n\nexport function getGammaCollectionUrl(collectionExplorerUrl?: string | null): string | undefined {\n if (!collectionExplorerUrl) return undefined;\n return `${GAMMA_URL}${collectionExplorerUrl}`;\n}\n\nexport function getHiroExplorerContractUrl(contractId?: string | null): string | undefined {\n if (!contractId) return undefined;\n return `${HIRO_EXPLORER_URL}/address/${contractId}`;\n}\n\nexport interface InscriptionInfo {\n title?: string;\n ordExplorerUrl?: string;\n txExplorerUrl?: string | null;\n genesisTimestamp?: number;\n genesisBlockHeight?: number;\n mimeType?: string;\n outputValue?: string;\n}\n\nexport function getInscriptionInfo(\n asset: InscriptionAsset,\n bitcoinNetwork: BitcoinNetwork\n): InscriptionInfo {\n return {\n title: asset.title,\n ordExplorerUrl: getOrdExplorerUrl(asset.number),\n txExplorerUrl: asset.txid\n ? getBitcoinExplorerLink({\n id: asset.txid,\n type: 'tx',\n networkPreference: bitcoinNetwork,\n })\n : undefined,\n genesisTimestamp: asset.genesisTimestamp,\n genesisBlockHeight: asset.genesisBlockHeight,\n mimeType: asset.mimeType,\n outputValue: asset.value,\n };\n}\n\nexport interface Sip9Info {\n name?: string;\n description?: string;\n tokenId?: string | number;\n collectionName?: string;\n collectionUrl?: string;\n creator?: string;\n rarityRank?: number;\n totalItems?: number;\n contractUrl?: string;\n contentType?: string;\n attributes: Sip9Attribute[];\n}\n\nexport function getSip9Info(asset: Sip9Asset): Sip9Info {\n const collection = asset.collection;\n return {\n name: asset.name,\n description: asset.description,\n tokenId: asset.tokenId,\n collectionName: collection?.name,\n collectionUrl: getGammaCollectionUrl(collection?.collectionExplorerUrl),\n creator: asset.creator,\n rarityRank: asset.rarityRank,\n totalItems: collection?.totalItems,\n contractUrl: getHiroExplorerContractUrl(asset.contractId),\n contentType: asset.content?.contentType,\n attributes: filterSip9Attributes(asset.attributes),\n };\n}\n\nexport function filterSip9Attributes(attributes?: Sip9Attribute[]): Sip9Attribute[] {\n if (!attributes) return [];\n return attributes.filter(attr => attr.traitType && attr.value && attr.value !== 'None');\n}\n\nexport function formatAttributeValue(attribute: Sip9Attribute): string {\n if (attribute.rarityPercent) {\n return `${attribute.value} (${attribute.rarityPercent}%)`;\n }\n return String(attribute.value);\n}\n\nexport interface StampInfo {\n name: string;\n stampExplorerUrl?: string;\n blockExplorerUrl?: string | null;\n blockHeight?: number;\n}\n\nexport function getStampInfo(asset: StampAsset, bitcoinNetwork: BitcoinNetwork): StampInfo {\n return {\n name: `Stamp #${asset.stamp}`,\n stampExplorerUrl: asset.stampExplorerUrl,\n blockExplorerUrl: asset.blockHeight\n ? getBitcoinExplorerLink({\n id: asset.blockHeight.toString(),\n type: 'block',\n networkPreference: bitcoinNetwork,\n })\n : undefined,\n blockHeight: asset.blockHeight,\n };\n}\n\nexport const DESCRIPTION_TRUNCATE_LENGTH = 180;\n\nexport function truncateDescription(\n description: string,\n maxLength = DESCRIPTION_TRUNCATE_LENGTH\n): { text: string; isTruncated: boolean } {\n if (description.length <= maxLength) {\n return { text: description, isTruncated: false };\n }\n return { text: `${description.slice(0, maxLength).trim()}…`, isTruncated: true };\n}\n","import type { CryptoAssetProtocol } from '@leather.io/models';\n\ntype ChainType = 'bitcoin' | 'stacks';\n\nexport function getChainDisplayLabel(chain: ChainType): string {\n const labels: Record<ChainType, string> = {\n bitcoin: 'Layer 1 (Bitcoin)',\n stacks: 'Layer 2 (Stacks)',\n };\n return labels[chain];\n}\n\nexport function getProtocolDisplayLabel(protocol: CryptoAssetProtocol): string {\n const labels: Record<CryptoAssetProtocol, string> = {\n nativeBtc: 'Bitcoin',\n nativeStx: 'Stacks',\n sip9: 'SIP-009',\n sip10: 'SIP-010',\n inscription: 'Ordinals',\n stamp: 'Stamps',\n brc20: 'BRC-20',\n src20: 'SRC-20',\n rune: 'Runes',\n };\n return labels[protocol] ?? protocol;\n}\n","import dayjs from 'dayjs';\n\nexport function formatSats(value: string | number): string {\n const n = typeof value === 'string' ? Number(value) : value;\n if (!Number.isFinite(n)) return String(value);\n return `${n.toLocaleString()} sats`;\n}\n\nexport function formatTimestamp(timestamp: number): string {\n return new Date(timestamp * 1000).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function formatTimestampWithTime(timestamp: number): string {\n return dayjs.unix(timestamp).format('YYYY-MM-DD HH:mm');\n}\n","import { hmac } from '@noble/hashes/hmac';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nexport function generateSignature(data: string, signingSecret: string): string {\n const encoder = new TextEncoder();\n const dataBytes = encoder.encode(data);\n const signingSecretBytes = encoder.encode(signingSecret);\n const signatureBytes = hmac(sha256, signingSecretBytes, dataBytes);\n return bytesToHex(signatureBytes);\n}\n\nexport function formatColorHexForParams(colorHex: string) {\n return colorHex.replace('#', '');\n}\n\ninterface MatchAddresses<T> {\n btcAddress: string | undefined;\n stxAddress: string | undefined;\n resultMap: {\n bothAvailable: T;\n onlyBtc: T;\n onlyStx: T;\n none: T;\n };\n}\n\nexport function matchAddresses<T>({ btcAddress, stxAddress, resultMap }: MatchAddresses<T>) {\n if (btcAddress && stxAddress) {\n return resultMap.bothAvailable;\n }\n if (btcAddress) {\n return resultMap.onlyBtc;\n }\n if (stxAddress) {\n return resultMap.onlyStx;\n }\n return resultMap.none;\n}\n","import { colorThemes } from '@leather.io/tokens';\n\nimport { OnramperMode } from './types';\nimport { formatColorHexForParams, generateSignature, matchAddresses } from './utils';\n\ninterface GetIframeProps {\n theme: 'dark' | 'light';\n btcAddress: string | undefined;\n stxAddress: string | undefined;\n apiKey: string;\n signingSecret: string;\n mode: OnramperMode;\n successRedirectUrl: string | undefined;\n failureRedirectUrl: string | undefined;\n redirectAtCheckout?: boolean;\n}\n\nexport function getOnramperIframeParams({\n theme,\n btcAddress,\n stxAddress,\n apiKey,\n signingSecret,\n mode,\n successRedirectUrl,\n failureRedirectUrl,\n redirectAtCheckout = false,\n}: GetIframeProps) {\n const redirectUrls: Record<string, string> = {};\n if (successRedirectUrl) redirectUrls['successRedirectUrl'] = successRedirectUrl;\n if (failureRedirectUrl) redirectUrls['failureRedirectUrl'] = failureRedirectUrl;\n const wallets = matchAddresses({\n btcAddress,\n stxAddress,\n resultMap: {\n bothAvailable: `btc:${btcAddress},stx_stacks:${stxAddress}`,\n onlyBtc: `btc:${btcAddress}`,\n onlyStx: `stx_stacks:${stxAddress}`,\n none: '',\n },\n });\n const onlyCryptoNetworks = matchAddresses({\n btcAddress,\n stxAddress,\n resultMap: {\n bothAvailable: `stacks,bitcoin`,\n onlyBtc: `bitcoin`,\n onlyStx: `stacks`,\n none: '',\n },\n });\n const onlyCryptos = matchAddresses({\n btcAddress,\n stxAddress,\n resultMap: {\n bothAvailable: `stx_stacks,btc`,\n onlyBtc: `btc`,\n onlyStx: `stx_stacks`,\n none: '',\n },\n });\n const signContent = `wallets=${wallets}`;\n\n const colors = theme === 'dark' ? colorThemes.dark : colorThemes.base;\n const params = new URLSearchParams({\n darkMode: theme === 'dark' ? 'true' : 'false',\n themeName: theme,\n primaryColor: formatColorHexForParams(colors['ink.action-primary-default']),\n secondaryColor: formatColorHexForParams(colors['ink.component-background-default']),\n primaryTextColor: formatColorHexForParams(colors['ink.text-primary']),\n secondaryTextColor: formatColorHexForParams(colors['ink.text-subdued']),\n containerColor: formatColorHexForParams(colors['ink.background-primary']),\n cardColor: formatColorHexForParams(colors['ink.component-background-hover']),\n primaryBtnTextColor: formatColorHexForParams(colors['ink.background-primary']),\n borderRadius: '0.25',\n widgetBorderRadius: '0.1',\n apiKey,\n signature: generateSignature(signContent, signingSecret),\n mode,\n onlyCryptoNetworks,\n sell_onlyCryptoNetworks: onlyCryptoNetworks,\n onlyCryptos,\n sell_onlyCryptos: onlyCryptos,\n defaultFiat: 'USD',\n sell_defaultFiat: 'USD',\n defaultAmount: '25',\n sell_defaultCrypto: 'BTC',\n sell_defaultAmount: '0.0005',\n redirectAtCheckout: redirectAtCheckout.toString(),\n hideTopBar: 'true',\n wallets,\n ...redirectUrls,\n });\n return params;\n}\n","import { CryptoAssetProtocol } from '@leather.io/models';\nimport { SerializedCryptoAssetId } from '@leather.io/utils';\n\nexport interface TokenDetailsProps {\n assetId: SerializedCryptoAssetId;\n}\n\nexport interface OnPressTokenDetails {\n onPress?(tokenDetails: TokenDetailsProps): void;\n}\n\nconst supportedAssetProtocols = [\n 'nativeBtc',\n 'nativeStx',\n 'sip10',\n 'rune',\n 'sip9',\n 'inscription',\n 'stamp',\n] as const;\n\nconst supportedFungibleAssetProtocols = ['nativeBtc', 'nativeStx', 'sip10', 'rune'] as const;\n\nconst supportedNonFungibleAssetProtocols = ['inscription', 'sip9', 'stamp'] as const;\n\nexport type SupportedAssetProtocol = (typeof supportedAssetProtocols)[number];\nexport type SupportedFungibleAssetProtocol = (typeof supportedFungibleAssetProtocols)[number];\nexport type SupportedNonFungibleAssetProtocol = (typeof supportedNonFungibleAssetProtocols)[number];\n\nexport function isSupportedFungibleAssetProtocol(\n value: CryptoAssetProtocol\n): value is SupportedFungibleAssetProtocol {\n return (supportedFungibleAssetProtocols as readonly string[]).includes(value);\n}\n\nexport function isSupportedNonFungibleAssetProtocol(\n value: CryptoAssetProtocol\n): value is SupportedNonFungibleAssetProtocol {\n return (supportedNonFungibleAssetProtocols as readonly string[]).includes(value);\n}\n\nexport function isSupportedAssetProtocol(\n value: CryptoAssetProtocol\n): value is SupportedAssetProtocol {\n return (supportedAssetProtocols as readonly string[]).includes(value);\n}\n","import { CryptoAssetProtocols } from '@leather.io/models';\nimport {\n AccountQuotedBtcBalance,\n AddressQuotedStxBalance,\n RuneBalance,\n Sip10Balance,\n} from '@leather.io/services';\n\nexport type TokenBalance =\n | AccountQuotedBtcBalance\n | AddressQuotedStxBalance\n | Sip10Balance\n | RuneBalance;\n\nexport function isAccountQuotedBtcBalance(value: TokenBalance): value is AccountQuotedBtcBalance {\n return 'btc' in value;\n}\n\nexport function isAddressQuotedStxBalance(value: TokenBalance): value is AddressQuotedStxBalance {\n return 'stx' in value;\n}\n\nexport function isSip10Balance(value: TokenBalance): value is Sip10Balance {\n return 'asset' in value && value.asset.protocol === CryptoAssetProtocols.sip10;\n}\n\nexport function isRuneBalance(value: TokenBalance): value is RuneBalance {\n return 'asset' in value && value.asset.protocol === CryptoAssetProtocols.rune;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leather.io/features",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.9",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -9,10 +9,11 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@noble/hashes": "1.5.0",
|
|
11
11
|
"dayjs": "1.11.13",
|
|
12
|
-
"@leather.io/models": "0.52.0",
|
|
13
12
|
"@leather.io/constants": "0.29.0",
|
|
14
|
-
"@leather.io/
|
|
13
|
+
"@leather.io/models": "0.52.0",
|
|
14
|
+
"@leather.io/stacks": "1.19.8",
|
|
15
15
|
"@leather.io/tokens": "0.25.1",
|
|
16
|
+
"@leather.io/services": "1.46.4",
|
|
16
17
|
"@leather.io/utils": "0.49.6"
|
|
17
18
|
},
|
|
18
19
|
"devDependencies": {
|