@leather.io/features 1.1.9 → 1.1.11
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 +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
package/dist/index.d.ts
CHANGED
|
@@ -150,6 +150,8 @@ interface Sip9Info {
|
|
|
150
150
|
contractUrl?: string;
|
|
151
151
|
contentType?: string;
|
|
152
152
|
attributes: Sip9Attribute[];
|
|
153
|
+
floorPrice?: Money;
|
|
154
|
+
latestSale?: Money;
|
|
153
155
|
}
|
|
154
156
|
declare function getSip9Info(asset: Sip9Asset): Sip9Info;
|
|
155
157
|
declare function filterSip9Attributes(attributes?: Sip9Attribute[]): Sip9Attribute[];
|
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/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":";;;;;KAEY,cAAA;KACA,yBAAA;UASK,gBAAA;;EAVL,KAAA,CAAA,EAAA,MAAA;EACA,MAAA,CAAA,EAYD,KAZC;EASK,KAAA,CAAA,EAIP,KAJO;AAOjB;AAEU,UAFO,YAAA,CAEP;EACI,GAAA,EAAA,MAAA;EACF,KAAA,CAAA,EAFF,WAEE;EAKA,SAAA,CAAA,EANE,WAMF;EACM,OAAA,CAAA,EANN,WAMM;EACC,KAAA,EAAA,MAAA;EAAyB,OAAA,EAAA,MAAA;;;YAFhC;ECvBA,cAAW,EDwBL,cCxBgB;EAElB,eAAW,EDuBR,yBCvBQ;AAI3B;;;KANY,WAAA,WAAsB,iBAAiB;iBAEnC,WAAA;ADLJ,iBCSI,kBAAA,CDTU,QAAA,ECSmB,QDTnB,CAAA,EAAA,GAAA,GAAA,GAAA,GAAA,SAAA;AACd,iBCcI,eAAA,CDdqB,QAAA,ECcK,QDdL,CAAA,EAAA,8BAAA,GAAA,kBAAA;AASpB,iBCWD,eAAA,CDRL,QACI,ECO2B,QDP3B,EAAA,WAAA,ECOkD,WDPlD,CAAA,EAAA;EAGE,sBAAY,EAAA,MAAA,GAAA,SAAA;EAEnB,qBAAA,EAAA,MAAA,GAAA,SAAA;CACI;AACF,iBC+BI,mBAAA,CD/BJ,QAAA,EC+BkC,QD/BlC,CAAA,EC+B6C,gBD/B7C;;;UEdF,oBAAA;;qBAEW;UACX;AFVV;AACY,iBEYI,gBAAA,CFZqB;EAAA,IAAA;EAAA,iBAAA;EAAA;AAAA,CAAA,EEYgC,oBFZhC,CAAA,EAAA,MAAA,GAAA,IAAA;AASpB,UEyCA,0BAAA,CFrCP;EAGO,EAAA,EAAA,MAAA;EAEP,IAAA,EAAA,IAAA,GAAA,OAAA;EACI,iBAAA,EEkCO,cFlCP;;AAMF,iBE+BI,sBAAA,CF/BJ;EAAA,EAAA;EAAA,IAAA;EAAA;AAAA,CAAA,EEmCT,0BFnCS,CAAA,EAAA,MAAA,GAAA,IAAA;UEkDF,uBAAA,CFjDQ;EACC,IAAA,EEiDX,mBFjDW;EAAyB,IAAA,EAAA,MAAA,GAAA,SAAA;;iBEoD3B;;AD7EjB;AAEgB,iBC+EA,qBAAA,CD/EW;EAAA,IAAA;EAAA,IAAA;EAAA,KAAA;EAAA,YAAA;EAAA;AAAA,CAAA,ECqFxB,uBDrFwB,CAAA,EAAA,MAAA;;;iBEFX,YAAA,WACJ,uBACG;;UAAmC;AHLlD,CAAA;AACY,iBGQI,gBAAA,CHRqB,QAAA,EGQM,QHRN,CAAA,EAAA,MAAA;AASpB,iBG+BD,gBAAA,CH5BL,QACI,EG2B4B,QH3B5B,CAAA,EG2BuC,WH3BvC,GAAA,SAAA;AAGE,iBGgCD,iBAAA,CHhCa,QAAA,EGgCe,QHhCf,CAAA,EGgC0B,cHhC1B;;;iBITb,iBAAA,WAA4B,uBAAuB;UACzD;;AJTE,iBI+EI,yBAAA,CJ/EU,QAAA,EI+E0B,QJ/E1B,CAAA,EAAA,MAAA,GAAA,SAAA;AACd,iBIuHI,4BAAA,CJvHqB,QAAA,EIuHkB,QJvHlB,CAAA,EIuH6B,yBJvH7B;;;iBKCrB,qBAAA;;GAAqC,KAAK;;;
|
|
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
|
@@ -255,8 +255,30 @@ function formatActivityCaption({ timestamp }) {
|
|
|
255
255
|
|
|
256
256
|
//#endregion
|
|
257
257
|
//#region src/activity/activity-view.ts
|
|
258
|
+
function getActivityUniqueIdentifier(activity) {
|
|
259
|
+
switch (activity.type) {
|
|
260
|
+
case "receiveAsset": return `${activity.senders?.[0] ?? ""}-${activity.amount.toString()}-${activity.asset.protocol}`;
|
|
261
|
+
case "sendAsset": return `${activity.receivers?.[0] ?? ""}-${activity.amount.toString()}-${activity.asset.protocol}`;
|
|
262
|
+
case "swapAssets": {
|
|
263
|
+
const fromAmount = activity.fromAmount.toString();
|
|
264
|
+
const toAmount = activity.toAmount.toString();
|
|
265
|
+
return `${activity.fromAsset.protocol}-${fromAmount}-${activity.toAsset.protocol}-${toAmount}`;
|
|
266
|
+
}
|
|
267
|
+
case "lockAsset": return `${activity.amount.toString()}-${activity.asset.protocol}`;
|
|
268
|
+
case "deploySmartContract": return activity.contractId;
|
|
269
|
+
case "executeSmartContract": return `${activity.contractId}-${activity.functionName}`;
|
|
270
|
+
default: return "";
|
|
271
|
+
}
|
|
272
|
+
}
|
|
258
273
|
function getActivityKey(activity) {
|
|
259
|
-
if ("
|
|
274
|
+
if (activity.level === "account") {
|
|
275
|
+
const accountKey = `${activity.account.fingerprint}-${activity.account.accountIndex}`;
|
|
276
|
+
if ("txid" in activity) {
|
|
277
|
+
const activityKey = getActivityUniqueIdentifier(activity);
|
|
278
|
+
return activityKey ? `${accountKey}-${activity.txid}-${activity.type}-${activityKey}-${activity.timestamp}` : `${accountKey}-${activity.txid}-${activity.type}-${activity.timestamp}`;
|
|
279
|
+
}
|
|
280
|
+
return `${accountKey}-${activity.type}-${activity.timestamp}`;
|
|
281
|
+
}
|
|
260
282
|
return `${activity.type}-${activity.timestamp}`;
|
|
261
283
|
}
|
|
262
284
|
function hasSbtcBridgeFailed(activity) {
|
|
@@ -471,7 +493,9 @@ function getSip9Info(asset) {
|
|
|
471
493
|
totalItems: collection?.totalItems,
|
|
472
494
|
contractUrl: getHiroExplorerContractUrl(asset.contractId),
|
|
473
495
|
contentType: asset.content?.contentType,
|
|
474
|
-
attributes: filterSip9Attributes(asset.attributes)
|
|
496
|
+
attributes: filterSip9Attributes(asset.attributes),
|
|
497
|
+
floorPrice: collection?.floorPrice,
|
|
498
|
+
latestSale: collection?.latestSale
|
|
475
499
|
};
|
|
476
500
|
}
|
|
477
501
|
function filterSip9Attributes(attributes) {
|
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/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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"}
|
|
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 getActivityUniqueIdentifier(activity: Activity): string {\n switch (activity.type) {\n case 'receiveAsset': {\n const sender = activity.senders?.[0] ?? '';\n const amount = activity.amount.toString();\n const assetProtocol = activity.asset.protocol;\n return `${sender}-${amount}-${assetProtocol}`;\n }\n case 'sendAsset': {\n const receiver = activity.receivers?.[0] ?? '';\n const amount = activity.amount.toString();\n const assetProtocol = activity.asset.protocol;\n return `${receiver}-${amount}-${assetProtocol}`;\n }\n case 'swapAssets': {\n const fromAmount = activity.fromAmount.toString();\n const toAmount = activity.toAmount.toString();\n return `${activity.fromAsset.protocol}-${fromAmount}-${activity.toAsset.protocol}-${toAmount}`;\n }\n case 'lockAsset': {\n const amount = activity.amount.toString();\n const assetProtocol = activity.asset.protocol;\n return `${amount}-${assetProtocol}`;\n }\n case 'deploySmartContract':\n return activity.contractId;\n case 'executeSmartContract':\n return `${activity.contractId}-${activity.functionName}`;\n default:\n return '';\n }\n}\n\nfunction getActivityKey(activity: Activity): string {\n if (activity.level === 'account') {\n const accountKey = `${activity.account.fingerprint}-${activity.account.accountIndex}`;\n if ('txid' in activity) {\n const activityKey = getActivityUniqueIdentifier(activity);\n // Include timestamp to ensure uniqueness for activities that might have identical properties\n return activityKey\n ? `${accountKey}-${activity.txid}-${activity.type}-${activityKey}-${activity.timestamp}`\n : `${accountKey}-${activity.txid}-${activity.type}-${activity.timestamp}`;\n }\n return `${accountKey}-${activity.type}-${activity.timestamp}`;\n }\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 Money,\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 floorPrice?: Money;\n latestSale?: Money;\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 floorPrice: collection?.floorPrice,\n latestSale: collection?.latestSale,\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.11",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@noble/hashes": "1.5.0",
|
|
11
11
|
"dayjs": "1.11.13",
|
|
12
|
-
"@leather.io/constants": "0.29.0",
|
|
13
12
|
"@leather.io/models": "0.52.0",
|
|
14
|
-
"@leather.io/
|
|
15
|
-
"@leather.io/
|
|
16
|
-
"@leather.io/
|
|
17
|
-
"@leather.io/utils": "0.49.
|
|
13
|
+
"@leather.io/services": "1.46.6",
|
|
14
|
+
"@leather.io/stacks": "1.19.10",
|
|
15
|
+
"@leather.io/tokens": "0.25.2",
|
|
16
|
+
"@leather.io/utils": "0.49.8",
|
|
17
|
+
"@leather.io/constants": "0.30.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"prettier": "3.5.1",
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"typescript": "5.9.3",
|
|
24
24
|
"vitest": "2.1.9",
|
|
25
25
|
"@leather.io/prettier-config": "0.9.0",
|
|
26
|
-
"@leather.io/
|
|
27
|
-
"@leather.io/
|
|
26
|
+
"@leather.io/tsconfig-config": "0.11.1",
|
|
27
|
+
"@leather.io/test-config": "0.1.3"
|
|
28
28
|
},
|
|
29
29
|
"files": [
|
|
30
30
|
"dist"
|