@vultisig/core-chain 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/amount/toChainAmount.d.ts +6 -1
  3. package/dist/amount/toChainAmount.d.ts.map +1 -1
  4. package/dist/amount/toChainAmount.js +88 -0
  5. package/dist/amount/toChainAmount.js.map +1 -1
  6. package/dist/chains/cardano/asset/cardanoAssetId.d.ts +14 -0
  7. package/dist/chains/cardano/asset/cardanoAssetId.d.ts.map +1 -0
  8. package/dist/chains/cardano/asset/cardanoAssetId.js +19 -0
  9. package/dist/chains/cardano/asset/cardanoAssetId.js.map +1 -0
  10. package/dist/chains/cardano/client/getCardanoAddressAssets.d.ts +10 -0
  11. package/dist/chains/cardano/client/getCardanoAddressAssets.d.ts.map +1 -0
  12. package/dist/chains/cardano/client/getCardanoAddressAssets.js +19 -0
  13. package/dist/chains/cardano/client/getCardanoAddressAssets.js.map +1 -0
  14. package/dist/chains/cardano/client/getCardanoAssetInfo.d.ts +23 -0
  15. package/dist/chains/cardano/client/getCardanoAssetInfo.d.ts.map +1 -0
  16. package/dist/chains/cardano/client/getCardanoAssetInfo.js +16 -0
  17. package/dist/chains/cardano/client/getCardanoAssetInfo.js.map +1 -0
  18. package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.d.ts +20 -0
  19. package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.d.ts.map +1 -0
  20. package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.js +22 -0
  21. package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.js.map +1 -0
  22. package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.d.ts +14 -0
  23. package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.d.ts.map +1 -0
  24. package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.js +28 -0
  25. package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.js.map +1 -0
  26. package/dist/chains/cosmos/qbtc/claim/BtcAddressType.d.ts +7 -0
  27. package/dist/chains/cosmos/qbtc/claim/BtcAddressType.d.ts.map +1 -0
  28. package/dist/chains/cosmos/qbtc/claim/BtcAddressType.js +9 -0
  29. package/dist/chains/cosmos/qbtc/claim/BtcAddressType.js.map +1 -0
  30. package/dist/chains/cosmos/qbtc/claim/ClaimableUtxo.d.ts +8 -0
  31. package/dist/chains/cosmos/qbtc/claim/ClaimableUtxo.d.ts.map +1 -0
  32. package/dist/chains/cosmos/qbtc/claim/ClaimableUtxo.js +2 -0
  33. package/dist/chains/cosmos/qbtc/claim/ClaimableUtxo.js.map +1 -0
  34. package/dist/chains/cosmos/qbtc/claim/broadcastClaimTx.d.ts +25 -0
  35. package/dist/chains/cosmos/qbtc/claim/broadcastClaimTx.d.ts.map +1 -0
  36. package/dist/chains/cosmos/qbtc/claim/broadcastClaimTx.js +43 -0
  37. package/dist/chains/cosmos/qbtc/claim/broadcastClaimTx.js.map +1 -0
  38. package/dist/chains/cosmos/qbtc/claim/buildClaimTx.d.ts +26 -0
  39. package/dist/chains/cosmos/qbtc/claim/buildClaimTx.d.ts.map +1 -0
  40. package/dist/chains/cosmos/qbtc/claim/buildClaimTx.js +57 -0
  41. package/dist/chains/cosmos/qbtc/claim/buildClaimTx.js.map +1 -0
  42. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.d.ts +49 -0
  43. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.d.ts.map +1 -0
  44. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.js +85 -0
  45. package/dist/chains/cosmos/qbtc/claim/computeClaimHashes.js.map +1 -0
  46. package/dist/chains/cosmos/qbtc/claim/detectBtcAddressType.d.ts +14 -0
  47. package/dist/chains/cosmos/qbtc/claim/detectBtcAddressType.d.ts.map +1 -0
  48. package/dist/chains/cosmos/qbtc/claim/detectBtcAddressType.js +31 -0
  49. package/dist/chains/cosmos/qbtc/claim/detectBtcAddressType.js.map +1 -0
  50. package/dist/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.d.ts +3 -0
  51. package/dist/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.d.ts.map +1 -0
  52. package/dist/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.js +13 -0
  53. package/dist/chains/cosmos/qbtc/claim/getClaimWithProofDisabled.js.map +1 -0
  54. package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.d.ts +14 -0
  55. package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.d.ts.map +1 -0
  56. package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.js +22 -0
  57. package/dist/chains/cosmos/qbtc/claim/getClaimableUtxos.js.map +1 -0
  58. package/dist/chains/cosmos/qbtc/claim/proofService.d.ts +50 -0
  59. package/dist/chains/cosmos/qbtc/claim/proofService.d.ts.map +1 -0
  60. package/dist/chains/cosmos/qbtc/claim/proofService.js +71 -0
  61. package/dist/chains/cosmos/qbtc/claim/proofService.js.map +1 -0
  62. package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.d.ts +1 -2
  63. package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.d.ts.map +1 -1
  64. package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.js +13 -9
  65. package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.js.map +1 -1
  66. package/dist/chains/cosmos/qbtc/tendermintRpcUrl.d.ts +3 -5
  67. package/dist/chains/cosmos/qbtc/tendermintRpcUrl.d.ts.map +1 -1
  68. package/dist/chains/cosmos/qbtc/tendermintRpcUrl.js +3 -5
  69. package/dist/chains/cosmos/qbtc/tendermintRpcUrl.js.map +1 -1
  70. package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.d.ts +15 -0
  71. package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.d.ts.map +1 -0
  72. package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.js +22 -0
  73. package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.js.map +1 -0
  74. package/dist/chains/cosmos/thor/lp/halts.d.ts +56 -0
  75. package/dist/chains/cosmos/thor/lp/halts.d.ts.map +1 -0
  76. package/dist/chains/cosmos/thor/lp/halts.js +95 -0
  77. package/dist/chains/cosmos/thor/lp/halts.js.map +1 -0
  78. package/dist/chains/cosmos/thor/lp/index.d.ts +45 -0
  79. package/dist/chains/cosmos/thor/lp/index.d.ts.map +1 -0
  80. package/dist/chains/cosmos/thor/lp/index.js +12 -0
  81. package/dist/chains/cosmos/thor/lp/index.js.map +1 -0
  82. package/dist/chains/cosmos/thor/lp/lockup.d.ts +47 -0
  83. package/dist/chains/cosmos/thor/lp/lockup.d.ts.map +1 -0
  84. package/dist/chains/cosmos/thor/lp/lockup.js +56 -0
  85. package/dist/chains/cosmos/thor/lp/lockup.js.map +1 -0
  86. package/dist/chains/cosmos/thor/lp/lpChainMap.d.ts +25 -0
  87. package/dist/chains/cosmos/thor/lp/lpChainMap.d.ts.map +1 -0
  88. package/dist/chains/cosmos/thor/lp/lpChainMap.js +30 -0
  89. package/dist/chains/cosmos/thor/lp/lpChainMap.js.map +1 -0
  90. package/dist/chains/cosmos/thor/lp/math.d.ts +129 -0
  91. package/dist/chains/cosmos/thor/lp/math.d.ts.map +1 -0
  92. package/dist/chains/cosmos/thor/lp/math.js +227 -0
  93. package/dist/chains/cosmos/thor/lp/math.js.map +1 -0
  94. package/dist/chains/cosmos/thor/lp/memberPool.d.ts +4 -0
  95. package/dist/chains/cosmos/thor/lp/memberPool.d.ts.map +1 -0
  96. package/dist/chains/cosmos/thor/lp/memberPool.js +24 -0
  97. package/dist/chains/cosmos/thor/lp/memberPool.js.map +1 -0
  98. package/dist/chains/cosmos/thor/lp/memo.d.ts +62 -0
  99. package/dist/chains/cosmos/thor/lp/memo.d.ts.map +1 -0
  100. package/dist/chains/cosmos/thor/lp/memo.js +62 -0
  101. package/dist/chains/cosmos/thor/lp/memo.js.map +1 -0
  102. package/dist/chains/cosmos/thor/lp/pairing.d.ts +30 -0
  103. package/dist/chains/cosmos/thor/lp/pairing.d.ts.map +1 -0
  104. package/dist/chains/cosmos/thor/lp/pairing.js +44 -0
  105. package/dist/chains/cosmos/thor/lp/pairing.js.map +1 -0
  106. package/dist/chains/cosmos/thor/lp/payload.d.ts +66 -0
  107. package/dist/chains/cosmos/thor/lp/payload.d.ts.map +1 -0
  108. package/dist/chains/cosmos/thor/lp/payload.js +49 -0
  109. package/dist/chains/cosmos/thor/lp/payload.js.map +1 -0
  110. package/dist/chains/cosmos/thor/lp/pools.d.ts +46 -0
  111. package/dist/chains/cosmos/thor/lp/pools.d.ts.map +1 -0
  112. package/dist/chains/cosmos/thor/lp/pools.js +85 -0
  113. package/dist/chains/cosmos/thor/lp/pools.js.map +1 -0
  114. package/dist/chains/cosmos/thor/lp/position.d.ts +23 -0
  115. package/dist/chains/cosmos/thor/lp/position.d.ts.map +1 -0
  116. package/dist/chains/cosmos/thor/lp/position.js +105 -0
  117. package/dist/chains/cosmos/thor/lp/position.js.map +1 -0
  118. package/dist/chains/cosmos/thor/lp/positions.d.ts +15 -0
  119. package/dist/chains/cosmos/thor/lp/positions.d.ts.map +1 -0
  120. package/dist/chains/cosmos/thor/lp/positions.js +47 -0
  121. package/dist/chains/cosmos/thor/lp/positions.js.map +1 -0
  122. package/dist/chains/cosmos/thor/lp/types.d.ts +45 -0
  123. package/dist/chains/cosmos/thor/lp/types.d.ts.map +1 -0
  124. package/dist/chains/cosmos/thor/lp/types.js +2 -0
  125. package/dist/chains/cosmos/thor/lp/types.js.map +1 -0
  126. package/dist/chains/cosmos/thor/lp/validation.d.ts +38 -0
  127. package/dist/chains/cosmos/thor/lp/validation.d.ts.map +1 -0
  128. package/dist/chains/cosmos/thor/lp/validation.js +100 -0
  129. package/dist/chains/cosmos/thor/lp/validation.js.map +1 -0
  130. package/dist/chains/polkadot/dapp/PolkadotSignerPayload.d.ts +16 -0
  131. package/dist/chains/polkadot/dapp/PolkadotSignerPayload.d.ts.map +1 -0
  132. package/dist/chains/polkadot/dapp/PolkadotSignerPayload.js +2 -0
  133. package/dist/chains/polkadot/dapp/PolkadotSignerPayload.js.map +1 -0
  134. package/dist/chains/polkadot/dapp/constructSigningPayload.d.ts +12 -0
  135. package/dist/chains/polkadot/dapp/constructSigningPayload.d.ts.map +1 -0
  136. package/dist/chains/polkadot/dapp/constructSigningPayload.js +30 -0
  137. package/dist/chains/polkadot/dapp/constructSigningPayload.js.map +1 -0
  138. package/dist/chains/solana/getDynamicPriorityFeePrice.d.ts +3 -0
  139. package/dist/chains/solana/getDynamicPriorityFeePrice.d.ts.map +1 -0
  140. package/dist/chains/solana/getDynamicPriorityFeePrice.js +20 -0
  141. package/dist/chains/solana/getDynamicPriorityFeePrice.js.map +1 -0
  142. package/dist/chains/solana/jito.d.ts +6 -0
  143. package/dist/chains/solana/jito.d.ts.map +1 -0
  144. package/dist/chains/solana/jito.js +40 -0
  145. package/dist/chains/solana/jito.js.map +1 -0
  146. package/dist/chains/ton/address.d.ts +6 -0
  147. package/dist/chains/ton/address.d.ts.map +1 -0
  148. package/dist/chains/ton/address.js +17 -0
  149. package/dist/chains/ton/address.js.map +1 -0
  150. package/dist/chains/ton/api.d.ts +7 -2
  151. package/dist/chains/ton/api.d.ts.map +1 -1
  152. package/dist/chains/ton/api.js +16 -3
  153. package/dist/chains/ton/api.js.map +1 -1
  154. package/dist/chains/utxo/client/getDashUtxos.d.ts +3 -0
  155. package/dist/chains/utxo/client/getDashUtxos.d.ts.map +1 -0
  156. package/dist/chains/utxo/client/getDashUtxos.js +28 -0
  157. package/dist/chains/utxo/client/getDashUtxos.js.map +1 -0
  158. package/dist/chains/utxo/tx/buildSignBitcoinFromPsbt.d.ts +21 -0
  159. package/dist/chains/utxo/tx/buildSignBitcoinFromPsbt.d.ts.map +1 -0
  160. package/dist/chains/utxo/tx/buildSignBitcoinFromPsbt.js +182 -0
  161. package/dist/chains/utxo/tx/buildSignBitcoinFromPsbt.js.map +1 -0
  162. package/dist/chains/utxo/tx/getPsbtTransferInfo.js +1 -1
  163. package/dist/chains/utxo/tx/getPsbtTransferInfo.js.map +1 -1
  164. package/dist/chains/utxo/tx/getUtxos.d.ts.map +1 -1
  165. package/dist/chains/utxo/tx/getUtxos.js +5 -0
  166. package/dist/chains/utxo/tx/getUtxos.js.map +1 -1
  167. package/dist/coin/balance/resolvers/cardano.d.ts +1 -0
  168. package/dist/coin/balance/resolvers/cardano.d.ts.map +1 -1
  169. package/dist/coin/balance/resolvers/cardano.js +12 -0
  170. package/dist/coin/balance/resolvers/cardano.js.map +1 -1
  171. package/dist/coin/balance/resolvers/qbtc.d.ts.map +1 -1
  172. package/dist/coin/balance/resolvers/qbtc.js +6 -5
  173. package/dist/coin/balance/resolvers/qbtc.js.map +1 -1
  174. package/dist/coin/balance/resolvers/sui.d.ts.map +1 -1
  175. package/dist/coin/balance/resolvers/sui.js +1 -0
  176. package/dist/coin/balance/resolvers/sui.js.map +1 -1
  177. package/dist/coin/balance/resolvers/ton.d.ts.map +1 -1
  178. package/dist/coin/balance/resolvers/ton.js +11 -2
  179. package/dist/coin/balance/resolvers/ton.js.map +1 -1
  180. package/dist/coin/find/CoinFinderChainKind.d.ts +1 -1
  181. package/dist/coin/find/CoinFinderChainKind.d.ts.map +1 -1
  182. package/dist/coin/find/CoinFinderChainKind.js +1 -1
  183. package/dist/coin/find/CoinFinderChainKind.js.map +1 -1
  184. package/dist/coin/find/index.d.ts.map +1 -1
  185. package/dist/coin/find/index.js +2 -0
  186. package/dist/coin/find/index.js.map +1 -1
  187. package/dist/coin/find/resolvers/cardano.d.ts +5 -0
  188. package/dist/coin/find/resolvers/cardano.d.ts.map +1 -0
  189. package/dist/coin/find/resolvers/cardano.js +17 -0
  190. package/dist/coin/find/resolvers/cardano.js.map +1 -0
  191. package/dist/coin/knownTokens/index.d.ts.map +1 -1
  192. package/dist/coin/knownTokens/index.js +74 -0
  193. package/dist/coin/knownTokens/index.js.map +1 -1
  194. package/dist/coin/token/metadata/chains.d.ts +1 -1
  195. package/dist/coin/token/metadata/chains.d.ts.map +1 -1
  196. package/dist/coin/token/metadata/chains.js +1 -0
  197. package/dist/coin/token/metadata/chains.js.map +1 -1
  198. package/dist/coin/token/metadata/index.d.ts.map +1 -1
  199. package/dist/coin/token/metadata/index.js +2 -0
  200. package/dist/coin/token/metadata/index.js.map +1 -1
  201. package/dist/coin/token/metadata/resolvers/cardano.d.ts +8 -0
  202. package/dist/coin/token/metadata/resolvers/cardano.d.ts.map +1 -0
  203. package/dist/coin/token/metadata/resolvers/cardano.js +20 -0
  204. package/dist/coin/token/metadata/resolvers/cardano.js.map +1 -0
  205. package/dist/swap/native/utils/getNativeSwapDecimals.d.ts +8 -0
  206. package/dist/swap/native/utils/getNativeSwapDecimals.d.ts.map +1 -1
  207. package/dist/swap/native/utils/getNativeSwapDecimals.js +19 -4
  208. package/dist/swap/native/utils/getNativeSwapDecimals.js.map +1 -1
  209. package/dist/tx/broadcast/resolvers/qbtc.d.ts.map +1 -1
  210. package/dist/tx/broadcast/resolvers/qbtc.js +22 -5
  211. package/dist/tx/broadcast/resolvers/qbtc.js.map +1 -1
  212. package/dist/tx/broadcast/resolvers/solana.d.ts.map +1 -1
  213. package/dist/tx/broadcast/resolvers/solana.js +12 -1
  214. package/dist/tx/broadcast/resolvers/solana.js.map +1 -1
  215. package/dist/tx/hash/resolvers/cardano.d.ts.map +1 -1
  216. package/dist/tx/hash/resolvers/cardano.js +9 -5
  217. package/dist/tx/hash/resolvers/cardano.js.map +1 -1
  218. package/dist/tx/status/resolvers/cosmos.d.ts.map +1 -1
  219. package/dist/tx/status/resolvers/cosmos.js +21 -8
  220. package/dist/tx/status/resolvers/cosmos.js.map +1 -1
  221. package/dist/tx/status/resolvers/qbtc.d.ts.map +1 -1
  222. package/dist/tx/status/resolvers/qbtc.js +18 -19
  223. package/dist/tx/status/resolvers/qbtc.js.map +1 -1
  224. package/dist/tx/status/resolvers/ton.d.ts.map +1 -1
  225. package/dist/tx/status/resolvers/ton.js +4 -4
  226. package/dist/tx/status/resolvers/ton.js.map +1 -1
  227. package/package.json +192 -1
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Midgard base URL used by every helper in this module. Matches what
3
+ * vultisig-ios and the rujira package use as the default mainnet endpoint.
4
+ */
5
+ export declare const thorchainMidgardBaseUrl = "https://midgard.ninerealms.com";
6
+ /**
7
+ * Validate a THORChain pool id is in the canonical format.
8
+ *
9
+ * Throws `Error` with the offending value embedded so callers up the
10
+ * stack can surface it to the user. Use this at every public entry
11
+ * point that accepts a pool id from the LLM or external code: it is
12
+ * cheaper than discovering at the build / broadcast / Midgard call
13
+ * that the id is malformed.
14
+ */
15
+ export declare const assertValidPoolId: (pool: string) => void;
16
+ /**
17
+ * Boolean variant of `assertValidPoolId` for callers that just want to
18
+ * filter / branch instead of throwing.
19
+ */
20
+ export declare const isValidPoolId: (pool: string) => boolean;
21
+ /**
22
+ * Subset of the Midgard `/v2/pools` shape that the agent stack actually
23
+ * cares about. The full Midgard response carries dozens of fields per pool;
24
+ * we narrow to the ones the LLM needs to pick a pool and present quotes.
25
+ */
26
+ export type ThorchainPoolSummary = {
27
+ asset: string;
28
+ status: string;
29
+ assetDepth: string;
30
+ runeDepth: string;
31
+ liquidityUnits: string;
32
+ volume24h: string;
33
+ annualPercentageRate: string;
34
+ };
35
+ export type GetThorchainPoolsOptions = {
36
+ /** Defaults to `'available'`. Pass `null` to skip the filter. */
37
+ status?: string | null;
38
+ };
39
+ /**
40
+ * Fetch THORChain pools from Midgard.
41
+ *
42
+ * By default returns only `status=available` pools — the only ones that
43
+ * accept LP adds. Pass `{ status: null }` to fetch every pool regardless.
44
+ */
45
+ export declare const getThorchainPools: (options?: GetThorchainPoolsOptions) => Promise<ThorchainPoolSummary[]>;
46
+ //# sourceMappingURL=pools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pools.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/pools.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,uBAAuB,mCAAmC,CAAA;AA2BvE;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,IAahD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,OAG5C,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,oBAAoB,EAAE,MAAM,CAAA;CAC7B,CAAA;AAsBD,MAAM,MAAM,wBAAwB,GAAG;IACrC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAS,wBAA6B,KACrC,OAAO,CAAC,oBAAoB,EAAE,CAahC,CAAA"}
@@ -0,0 +1,85 @@
1
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
2
+ /**
3
+ * Midgard base URL used by every helper in this module. Matches what
4
+ * vultisig-ios and the rujira package use as the default mainnet endpoint.
5
+ */
6
+ export const thorchainMidgardBaseUrl = 'https://midgard.ninerealms.com';
7
+ /**
8
+ * Canonical THORChain pool-id format: `CHAIN.ASSET` for native assets
9
+ * (e.g. `BTC.BTC`, `ETH.ETH`) or `CHAIN.ASSET-CONTRACT` for ERC-20-style
10
+ * tokens (e.g. `ETH.USDC-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48`).
11
+ *
12
+ * THORChain itself stores pool ids in uppercase. Lowercase variants
13
+ * round-trip through Midgard but several internal lookups (and the
14
+ * thornode `/thorchain/pool/{asset}` endpoint) are case-sensitive on the
15
+ * chain prefix and contract section, so we enforce uppercase + the
16
+ * documented separators here to fail fast on typos.
17
+ *
18
+ * Examples accepted:
19
+ * BTC.BTC
20
+ * LTC.LTC
21
+ * ETH.USDC-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48
22
+ * BSC.BNB
23
+ *
24
+ * Examples rejected:
25
+ * "btc.btc" (lowercase)
26
+ * "BTC/BTC" (wrong separator)
27
+ * "BTC" (no asset section)
28
+ * "BTC.BTC.BTC" (extra section)
29
+ */
30
+ const POOL_ID_RE = /^[A-Z0-9]+\.[A-Z0-9]+(-[A-Z0-9]+)?$/;
31
+ /**
32
+ * Validate a THORChain pool id is in the canonical format.
33
+ *
34
+ * Throws `Error` with the offending value embedded so callers up the
35
+ * stack can surface it to the user. Use this at every public entry
36
+ * point that accepts a pool id from the LLM or external code: it is
37
+ * cheaper than discovering at the build / broadcast / Midgard call
38
+ * that the id is malformed.
39
+ */
40
+ export const assertValidPoolId = (pool) => {
41
+ if (typeof pool !== 'string' || pool.length === 0) {
42
+ throw new Error(`assertValidPoolId: pool id must be a non-empty string, got ${typeof pool} ${pool === '' ? '""' : ''}`);
43
+ }
44
+ if (!POOL_ID_RE.test(pool)) {
45
+ throw new Error(`assertValidPoolId: ${JSON.stringify(pool)} is not a valid THORChain pool id. ` +
46
+ `Expected uppercase CHAIN.ASSET (e.g. "BTC.BTC") or CHAIN.ASSET-CONTRACT ` +
47
+ `(e.g. "ETH.USDC-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48").`);
48
+ }
49
+ };
50
+ /**
51
+ * Boolean variant of `assertValidPoolId` for callers that just want to
52
+ * filter / branch instead of throwing.
53
+ */
54
+ export const isValidPoolId = (pool) => {
55
+ if (typeof pool !== 'string' || pool.length === 0)
56
+ return false;
57
+ return POOL_ID_RE.test(pool);
58
+ };
59
+ const normalizePool = (raw) => ({
60
+ asset: raw.asset ?? '',
61
+ status: raw.status ?? '',
62
+ assetDepth: raw.assetDepth ?? '0',
63
+ runeDepth: raw.runeDepth ?? '0',
64
+ liquidityUnits: raw.liquidityUnits ?? '0',
65
+ volume24h: raw.volume24h ?? '0',
66
+ annualPercentageRate: raw.annualPercentageRate ?? '0',
67
+ });
68
+ /**
69
+ * Fetch THORChain pools from Midgard.
70
+ *
71
+ * By default returns only `status=available` pools — the only ones that
72
+ * accept LP adds. Pass `{ status: null }` to fetch every pool regardless.
73
+ */
74
+ export const getThorchainPools = async (options = {}) => {
75
+ const status = options.status === undefined ? 'available' : options.status;
76
+ const url = status === null
77
+ ? `${thorchainMidgardBaseUrl}/v2/pools`
78
+ : `${thorchainMidgardBaseUrl}/v2/pools?status=${encodeURIComponent(status)}`;
79
+ const raw = await queryUrl(url);
80
+ if (!Array.isArray(raw)) {
81
+ throw new Error(`getThorchainPools: expected an array from ${url}, got ${typeof raw}`);
82
+ }
83
+ return raw.map(normalizePool);
84
+ };
85
+ //# sourceMappingURL=pools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pools.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/pools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,gCAAgC,CAAA;AAEvE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,GAAG,qCAAqC,CAAA;AAExD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAQ,EAAE;IACtD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,8DAA8D,OAAO,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACvG,CAAA;IACH,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,qCAAqC;YAC7E,0EAA0E;YAC1E,+DAA+D,CAClE,CAAA;IACH,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE;IACrD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAC/D,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC,CAAA;AA2BD,MAAM,aAAa,GAAG,CAAC,GAAY,EAAwB,EAAE,CAAC,CAAC;IAC7D,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;IACtB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;IACxB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG;IACjC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG;IAC/B,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,GAAG;IACzC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG;IAC/B,oBAAoB,EAAE,GAAG,CAAC,oBAAoB,IAAI,GAAG;CACtD,CAAC,CAAA;AAOF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,UAAoC,EAAE,EACL,EAAE;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAA;IAC1E,MAAM,GAAG,GACP,MAAM,KAAK,IAAI;QACb,CAAC,CAAC,GAAG,uBAAuB,WAAW;QACvC,CAAC,CAAC,GAAG,uBAAuB,oBAAoB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAA;IAChF,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAU,GAAG,CAAC,CAAA;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,6CAA6C,GAAG,SAAS,OAAO,GAAG,EAAE,CACtE,CAAA;IACH,CAAC;IACD,OAAQ,GAAiB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AAC9C,CAAC,CAAA"}
@@ -0,0 +1,23 @@
1
+ import type { ThorchainLpPosition } from './types.js';
2
+ export type { ThorchainLpPosition } from './types.js';
3
+ export type GetThorchainLpPositionInput = {
4
+ /** bech32 thor1... address (the RUNE side of the position). */
5
+ thorAddress: string;
6
+ /** Canonical pool id to look up. */
7
+ pool: string;
8
+ };
9
+ /**
10
+ * Fetch a single LP position from Midgard.
11
+ *
12
+ * Returns `null` when:
13
+ * - the address has no positions at all (Midgard returns 404), or
14
+ * - the address has positions but none in the requested pool.
15
+ */
16
+ export declare const getThorchainLpPosition: ({ thorAddress, pool, }: GetThorchainLpPositionInput) => Promise<ThorchainLpPosition | null>;
17
+ /**
18
+ * Fetch a single LP position directly from thornode. Catches the
19
+ * pending-only case Midgard doesn't surface. Returns null when the
20
+ * position is truly empty (no units, no pending on either side).
21
+ */
22
+ export declare const getThorchainLpPositionFromThornode: ({ thorAddress, pool, }: GetThorchainLpPositionInput) => Promise<ThorchainLpPosition | null>;
23
+ //# sourceMappingURL=position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/position.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAErE,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,MAAM,MAAM,2BAA2B,GAAG;IACxC,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAA;IACnB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAWD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GAAU,wBAG1C,2BAA2B,KAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CA2BlE,CAAA;AAaD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,GAAU,wBAGtD,2BAA2B,KAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAkDlE,CAAA"}
@@ -0,0 +1,105 @@
1
+ import { Chain } from '@vultisig/core-chain/Chain';
2
+ import { cosmosRpcUrl } from '@vultisig/core-chain/chains/cosmos/cosmosRpcUrl';
3
+ import { HttpResponseError } from '@vultisig/lib-utils/fetch/HttpResponseError';
4
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
5
+ import { isNonZeroBaseUnit, normalizeMemberPool } from './memberPool.js';
6
+ import { assertValidPoolId, thorchainMidgardBaseUrl } from './pools.js';
7
+ /**
8
+ * Detect a 404 from queryUrl by reading the typed `HttpResponseError.status`
9
+ * field that `@vultisig/lib-utils` `assertFetchResponse` now throws. The
10
+ * previous implementation string-matched the error message; that worked
11
+ * but was brittle to wording changes. See NeoMakinG's PR #236 review note.
12
+ */
13
+ const isMidgardNotFoundError = (err) => err instanceof HttpResponseError && err.status === 404;
14
+ /**
15
+ * Fetch a single LP position from Midgard.
16
+ *
17
+ * Returns `null` when:
18
+ * - the address has no positions at all (Midgard returns 404), or
19
+ * - the address has positions but none in the requested pool.
20
+ */
21
+ export const getThorchainLpPosition = async ({ thorAddress, pool, }) => {
22
+ assertValidPoolId(pool);
23
+ const url = `${thorchainMidgardBaseUrl}/v2/member/${encodeURIComponent(thorAddress)}`;
24
+ let midgardNotFound = false;
25
+ let raw = {};
26
+ try {
27
+ raw = await queryUrl(url);
28
+ }
29
+ catch (err) {
30
+ if (isMidgardNotFoundError(err)) {
31
+ midgardNotFound = true;
32
+ }
33
+ else {
34
+ throw err;
35
+ }
36
+ }
37
+ if (!midgardNotFound) {
38
+ const pools = Array.isArray(raw.pools) ? raw.pools : [];
39
+ const found = pools.find(p => p.pool === pool);
40
+ if (found)
41
+ return normalizeMemberPool(found);
42
+ }
43
+ // Midgard has no record of this pool for this address. THORChain
44
+ // asymmetric adds land as `pending_rune` / `pending_asset` on thornode
45
+ // and stay off Midgard until the counter-side materializes the LP (or a
46
+ // pending-timeout flips the state). A pending-only position is still
47
+ // fully withdrawable via `-:POOL:BPS` — the handler refunds the pending
48
+ // side. Falling back to thornode here so the LLM sees the position and
49
+ // doesn't wrongly tell the user "nothing to withdraw".
50
+ return getThorchainLpPositionFromThornode({ thorAddress, pool });
51
+ };
52
+ /**
53
+ * Fetch a single LP position directly from thornode. Catches the
54
+ * pending-only case Midgard doesn't surface. Returns null when the
55
+ * position is truly empty (no units, no pending on either side).
56
+ */
57
+ export const getThorchainLpPositionFromThornode = async ({ thorAddress, pool, }) => {
58
+ assertValidPoolId(pool);
59
+ const url = `${cosmosRpcUrl[Chain.THORChain]}/thorchain/pool/${encodeURIComponent(pool)}` +
60
+ `/liquidity_provider/${encodeURIComponent(thorAddress)}`;
61
+ let raw;
62
+ try {
63
+ raw = await queryUrl(url);
64
+ }
65
+ catch (err) {
66
+ // thornode returns 404 when no LP record exists for the address on
67
+ // this pool. Treat as "no position" same as Midgard.
68
+ if (err instanceof HttpResponseError && err.status === 404)
69
+ return null;
70
+ throw err;
71
+ }
72
+ const units = raw.units ?? '0';
73
+ const pendingRune = raw.pending_rune ?? '0';
74
+ const pendingAsset = raw.pending_asset ?? '0';
75
+ // Thornode always returns the endpoint with zeroed fields after a full
76
+ // withdraw, so explicitly guard "everything is zero" as "no position".
77
+ if (!isNonZeroBaseUnit(units) &&
78
+ !isNonZeroBaseUnit(pendingRune) &&
79
+ !isNonZeroBaseUnit(pendingAsset)) {
80
+ return null;
81
+ }
82
+ return {
83
+ pool: raw.asset ?? pool,
84
+ liquidityUnits: units,
85
+ // Thornode doesn't track historical added amounts — those are a
86
+ // Midgard-only enrichment. Surface them as 0; the caller can still
87
+ // act on units/pending.
88
+ runeAdded: '0',
89
+ assetAdded: '0',
90
+ runePending: pendingRune,
91
+ assetPending: pendingAsset,
92
+ runeAddress: raw.rune_address ?? thorAddress,
93
+ assetAddress: raw.asset_address ?? '',
94
+ // Thornode exposes the last-add block height, not a Unix timestamp.
95
+ // Keep `dateLastAdded` semantically Unix-seconds-or-0 and expose the
96
+ // block height via the dedicated `lastAddHeight` field so lockup
97
+ // checks can use either source.
98
+ dateLastAdded: '0',
99
+ lastAddHeight: typeof raw.last_add_height === 'number'
100
+ ? String(raw.last_add_height)
101
+ : '',
102
+ isPending: isNonZeroBaseUnit(pendingRune) || isNonZeroBaseUnit(pendingAsset),
103
+ };
104
+ };
105
+ //# sourceMappingURL=position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/position.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ThorchainLpPosition } from './types.js';
2
+ /**
3
+ * Fetch every LP position for a THORChain address in a single Midgard call.
4
+ *
5
+ * Returns an empty array when:
6
+ * - the address has no positions at all (Midgard returns 404), or
7
+ * - Midgard returns a body without a `pools` array (defensive).
8
+ *
9
+ * Prefer this over calling `getThorchainLpPosition` N times — one HTTP
10
+ * round-trip regardless of position count.
11
+ */
12
+ export declare const getThorchainLpPositions: ({ thorAddress, }: {
13
+ thorAddress: string;
14
+ }) => Promise<ThorchainLpPosition[]>;
15
+ //# sourceMappingURL=positions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"positions.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/positions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAErE;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,GAAU,kBAE3C;IACD,WAAW,EAAE,MAAM,CAAA;CACpB,KAAG,OAAO,CAAC,mBAAmB,EAAE,CAiChC,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { HttpResponseError } from '@vultisig/lib-utils/fetch/HttpResponseError';
2
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
3
+ import { normalizeMemberPool } from './memberPool.js';
4
+ import { thorchainMidgardBaseUrl } from './pools.js';
5
+ /**
6
+ * Fetch every LP position for a THORChain address in a single Midgard call.
7
+ *
8
+ * Returns an empty array when:
9
+ * - the address has no positions at all (Midgard returns 404), or
10
+ * - Midgard returns a body without a `pools` array (defensive).
11
+ *
12
+ * Prefer this over calling `getThorchainLpPosition` N times — one HTTP
13
+ * round-trip regardless of position count.
14
+ */
15
+ export const getThorchainLpPositions = async ({ thorAddress, }) => {
16
+ const url = `${thorchainMidgardBaseUrl}/v2/member/${encodeURIComponent(thorAddress)}`;
17
+ let raw;
18
+ try {
19
+ raw = await queryUrl(url);
20
+ }
21
+ catch (err) {
22
+ if (err instanceof HttpResponseError && err.status === 404)
23
+ return [];
24
+ throw err;
25
+ }
26
+ // Shape gates on the 200 response:
27
+ // - `raw` must be an object (not null, not a primitive, not an array of
28
+ // something unrelated) — otherwise the upstream shape is unrecognizable
29
+ // and we throw so the caller sees a real error.
30
+ // - `raw.pools` is allowed to be missing (treated as "no positions")
31
+ // for backward compat with the pre-404 era, when Midgard would
32
+ // return `{}` for known-empty addresses. A missing `pools` key is
33
+ // NOT treated as schema drift.
34
+ // - `raw.pools` MUST be an array if present — a non-array `pools`
35
+ // IS schema drift and we throw.
36
+ if (!raw || typeof raw !== 'object') {
37
+ throw new Error(`getThorchainLpPositions: unexpected Midgard response shape from ${url}`);
38
+ }
39
+ if (raw.pools === undefined) {
40
+ return [];
41
+ }
42
+ if (!Array.isArray(raw.pools)) {
43
+ throw new Error(`getThorchainLpPositions: Midgard response ${url} has non-array \`pools\` field`);
44
+ }
45
+ return raw.pools.map(normalizeMemberPool);
46
+ };
47
+ //# sourceMappingURL=positions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"positions.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/positions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAGjD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,EAC5C,WAAW,GAGZ,EAAkC,EAAE;IACnC,MAAM,GAAG,GAAG,GAAG,uBAAuB,cAAc,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAA;IACrF,IAAI,GAAsB,CAAA;IAC1B,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAoB,GAAG,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,iBAAiB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,CAAA;QACrE,MAAM,GAAG,CAAA;IACX,CAAC;IACD,mCAAmC;IACnC,0EAA0E;IAC1E,4EAA4E;IAC5E,oDAAoD;IACpD,uEAAuE;IACvE,mEAAmE;IACnE,sEAAsE;IACtE,mCAAmC;IACnC,oEAAoE;IACpE,oCAAoC;IACpC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,mEAAmE,GAAG,EAAE,CACzE,CAAA;IACH,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,6CAA6C,GAAG,gCAAgC,CACjF,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAC3C,CAAC,CAAA"}
@@ -0,0 +1,45 @@
1
+ export type ThorchainLpPosition = {
2
+ pool: string;
3
+ liquidityUnits: string;
4
+ runeAdded: string;
5
+ assetAdded: string;
6
+ runePending: string;
7
+ assetPending: string;
8
+ runeAddress: string;
9
+ assetAddress: string;
10
+ /**
11
+ * Unix seconds of the last add. Midgard returns this; thornode does not,
12
+ * so positions sourced from the thornode fallback leave this as `"0"` and
13
+ * populate `lastAddHeight` instead.
14
+ */
15
+ dateLastAdded: string;
16
+ /**
17
+ * THORChain block height of the last add. Populated from thornode's
18
+ * `last_add_height` when the position comes from the thornode fallback
19
+ * path. Empty string when the position comes from Midgard (which does not
20
+ * expose block height on `/v2/member`). Either field is sufficient to gate
21
+ * the 1h lockup check — `dateLastAdded` via wall-clock window, or
22
+ * `lastAddHeight` via block-count window.
23
+ */
24
+ lastAddHeight: string;
25
+ /**
26
+ * True when either side has a non-zero pending amount. Common for
27
+ * asymmetric adds that THORChain has not yet credited.
28
+ */
29
+ isPending: boolean;
30
+ };
31
+ export type RawMemberPool = {
32
+ pool?: string;
33
+ liquidityUnits?: string;
34
+ runeAdded?: string;
35
+ assetAdded?: string;
36
+ runePending?: string;
37
+ assetPending?: string;
38
+ runeAddress?: string;
39
+ assetAddress?: string;
40
+ dateLastAdded?: string;
41
+ };
42
+ export type RawMemberResponse = {
43
+ pools?: RawMemberPool[];
44
+ };
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB;;;;;;;OAOG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;CACxB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Build the mimir flag key THORChain uses to pause LP deposits for a
3
+ * single pool. Format: `PAUSELPDEPOSIT-{CHAIN}-{ASSET_PLUS_CONTRACT}`.
4
+ *
5
+ * Examples:
6
+ * BTC.BTC → PAUSELPDEPOSIT-BTC-BTC
7
+ * DOGE.DOGE → PAUSELPDEPOSIT-DOGE-DOGE
8
+ * ETH.USDC-0XA0B... → PAUSELPDEPOSIT-ETH-USDC-0XA0B...
9
+ *
10
+ * Note: `CHAIN.ASSET` splits on the FIRST `.`; the rest (including any
11
+ * `-CONTRACT` suffix) is the asset portion, which is appended with a
12
+ * single `-` separator.
13
+ */
14
+ export declare const poolPauseMimirKey: (pool: string) => string;
15
+ /**
16
+ * Fetch the raw thornode mimir map. Returns an object with flag keys as
17
+ * numbers. Used to check per-pool LP deposit pauses (PAUSELPDEPOSIT-*),
18
+ * liquidity lockup (LIQUIDITYLOCKUPBLOCKS), etc.
19
+ */
20
+ export declare const getThorchainMimir: () => Promise<Record<string, number>>;
21
+ /**
22
+ * Verify a THORChain pool is currently depositable. Checks TWO layers:
23
+ *
24
+ * 1. **Thornode pool status** — `/thorchain/pool/{asset}.status` must be
25
+ * `Available`. Catches staged / suspended pools.
26
+ * 2. **Mimir per-pool pause flag** — `PAUSELPDEPOSIT-{chain}-{asset}`
27
+ * must not be set. Catches the case where the pool is listed as
28
+ * available BUT the THORChain handler rejects LP adds for it via
29
+ * mimir (what happened to BTC.BTC on 2026-04-10: pool.status was
30
+ * `Available`, deposits silently accepted into mempool, handler
31
+ * rejected at execution with "deposits are paused for asset
32
+ * (btc.btc): internal error"). Without the mimir check, the user
33
+ * signs a tx that is guaranteed to fail on-chain.
34
+ *
35
+ * Use this as the fail-fast gate before building an LP add payload.
36
+ */
37
+ export declare const assertPoolDepositable: (pool: string) => Promise<void>;
38
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/validation.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,MAQhD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxE,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAiCtE,CAAA"}
@@ -0,0 +1,100 @@
1
+ import { Chain } from '@vultisig/core-chain/Chain';
2
+ import { cosmosRpcUrl } from '@vultisig/core-chain/chains/cosmos/cosmosRpcUrl';
3
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
4
+ import { assertValidPoolId } from './pools.js';
5
+ const extractPoolStatus = (raw) => {
6
+ if (raw && typeof raw === 'object' && 'status' in raw) {
7
+ const status = raw.status;
8
+ return typeof status === 'string' ? status : undefined;
9
+ }
10
+ return undefined;
11
+ };
12
+ /**
13
+ * Build the mimir flag key THORChain uses to pause LP deposits for a
14
+ * single pool. Format: `PAUSELPDEPOSIT-{CHAIN}-{ASSET_PLUS_CONTRACT}`.
15
+ *
16
+ * Examples:
17
+ * BTC.BTC → PAUSELPDEPOSIT-BTC-BTC
18
+ * DOGE.DOGE → PAUSELPDEPOSIT-DOGE-DOGE
19
+ * ETH.USDC-0XA0B... → PAUSELPDEPOSIT-ETH-USDC-0XA0B...
20
+ *
21
+ * Note: `CHAIN.ASSET` splits on the FIRST `.`; the rest (including any
22
+ * `-CONTRACT` suffix) is the asset portion, which is appended with a
23
+ * single `-` separator.
24
+ */
25
+ export const poolPauseMimirKey = (pool) => {
26
+ const dotIdx = pool.indexOf('.');
27
+ if (dotIdx <= 0 || dotIdx >= pool.length - 1) {
28
+ throw new Error(`poolPauseMimirKey: invalid pool id ${pool}`);
29
+ }
30
+ const chain = pool.slice(0, dotIdx);
31
+ const asset = pool.slice(dotIdx + 1);
32
+ return `PAUSELPDEPOSIT-${chain}-${asset}`;
33
+ };
34
+ /**
35
+ * Fetch the raw thornode mimir map. Returns an object with flag keys as
36
+ * numbers. Used to check per-pool LP deposit pauses (PAUSELPDEPOSIT-*),
37
+ * liquidity lockup (LIQUIDITYLOCKUPBLOCKS), etc.
38
+ */
39
+ export const getThorchainMimir = async () => {
40
+ const url = `${cosmosRpcUrl[Chain.THORChain]}/thorchain/mimir`;
41
+ const raw = await queryUrl(url);
42
+ if (!raw || typeof raw !== 'object') {
43
+ throw new Error(`getThorchainMimir: unexpected response shape from ${url}`);
44
+ }
45
+ // thornode /thorchain/mimir returns numeric values, but the JSON could
46
+ // deserialize as number or numeric string depending on the upstream
47
+ // proxy. Normalize to number, drop entries we can't coerce — downstream
48
+ // callers do `typeof v === 'number' && v > 0` checks anyway, and a NaN
49
+ // would silently defeat those.
50
+ const out = {};
51
+ for (const [k, v] of Object.entries(raw)) {
52
+ if (typeof v === 'number' && Number.isFinite(v)) {
53
+ out[k] = v;
54
+ }
55
+ else if (typeof v === 'string' && /^-?\d+$/.test(v)) {
56
+ out[k] = Number(v);
57
+ }
58
+ }
59
+ return out;
60
+ };
61
+ /**
62
+ * Verify a THORChain pool is currently depositable. Checks TWO layers:
63
+ *
64
+ * 1. **Thornode pool status** — `/thorchain/pool/{asset}.status` must be
65
+ * `Available`. Catches staged / suspended pools.
66
+ * 2. **Mimir per-pool pause flag** — `PAUSELPDEPOSIT-{chain}-{asset}`
67
+ * must not be set. Catches the case where the pool is listed as
68
+ * available BUT the THORChain handler rejects LP adds for it via
69
+ * mimir (what happened to BTC.BTC on 2026-04-10: pool.status was
70
+ * `Available`, deposits silently accepted into mempool, handler
71
+ * rejected at execution with "deposits are paused for asset
72
+ * (btc.btc): internal error"). Without the mimir check, the user
73
+ * signs a tx that is guaranteed to fail on-chain.
74
+ *
75
+ * Use this as the fail-fast gate before building an LP add payload.
76
+ */
77
+ export const assertPoolDepositable = async (pool) => {
78
+ assertValidPoolId(pool);
79
+ // Run both checks in parallel — they hit different endpoints so there
80
+ // is no reason to serialize them.
81
+ const [poolRaw, mimir] = await Promise.all([
82
+ queryUrl(`${cosmosRpcUrl[Chain.THORChain]}/thorchain/pool/${encodeURIComponent(pool)}`),
83
+ getThorchainMimir(),
84
+ ]);
85
+ // Check 1: thornode pool.status
86
+ const status = extractPoolStatus(poolRaw);
87
+ if (status === undefined) {
88
+ throw new Error(`assertPoolDepositable: pool ${pool} response from thornode did not include a string \`status\` field`);
89
+ }
90
+ if (status !== 'Available') {
91
+ throw new Error(`assertPoolDepositable: pool ${pool} status is ${status}, must be Available for LP add`);
92
+ }
93
+ // Check 2: mimir per-pool PAUSELPDEPOSIT flag
94
+ const pauseKey = poolPauseMimirKey(pool);
95
+ const pauseValue = mimir[pauseKey];
96
+ if (typeof pauseValue === 'number' && pauseValue > 0) {
97
+ throw new Error(`assertPoolDepositable: pool ${pool} has LP deposits paused on-chain via mimir ${pauseKey}=${pauseValue}. THORChain validators have disabled new adds for this pool; any tx would be rejected at handler execution time.`);
98
+ }
99
+ };
100
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** Standard Polkadot signer payload for dApp transaction signing. */
2
+ export type PolkadotSignerPayloadJSON = {
3
+ address: string;
4
+ blockHash: string;
5
+ blockNumber: string;
6
+ era: string;
7
+ genesisHash: string;
8
+ method: string;
9
+ nonce: string;
10
+ specVersion: string;
11
+ tip: string;
12
+ transactionVersion: string;
13
+ signedExtensions: string[];
14
+ version: number;
15
+ };
16
+ //# sourceMappingURL=PolkadotSignerPayload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolkadotSignerPayload.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/polkadot/dapp/PolkadotSignerPayload.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PolkadotSignerPayload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolkadotSignerPayload.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/polkadot/dapp/PolkadotSignerPayload.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { PolkadotSignerPayloadJSON } from './PolkadotSignerPayload.js';
2
+ /**
3
+ * Construct the raw signing payload bytes from a Polkadot SignerPayloadJSON.
4
+ *
5
+ * Follows the Polkadot extrinsic payload v4 encoding:
6
+ * method + era + compact(nonce) + compact(tip) + LE-u32(specVersion) +
7
+ * LE-u32(transactionVersion) + genesisHash + blockHash
8
+ *
9
+ * If the payload exceeds 256 bytes, it is blake2b-256 hashed before signing.
10
+ */
11
+ export declare const constructPolkadotSigningPayload: (payload: PolkadotSignerPayloadJSON) => Uint8Array;
12
+ //# sourceMappingURL=constructSigningPayload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructSigningPayload.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/polkadot/dapp/constructSigningPayload.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAInE;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B,GAC1C,SAAS,yBAAyB,KACjC,UAuCF,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { compactToU8a, hexToU8a, u8aConcat } from '@polkadot/util';
2
+ import { blake2AsU8a } from '@polkadot/util-crypto';
3
+ const polkadotSigningPayloadHashThreshold = 256;
4
+ /**
5
+ * Construct the raw signing payload bytes from a Polkadot SignerPayloadJSON.
6
+ *
7
+ * Follows the Polkadot extrinsic payload v4 encoding:
8
+ * method + era + compact(nonce) + compact(tip) + LE-u32(specVersion) +
9
+ * LE-u32(transactionVersion) + genesisHash + blockHash
10
+ *
11
+ * If the payload exceeds 256 bytes, it is blake2b-256 hashed before signing.
12
+ */
13
+ export const constructPolkadotSigningPayload = (payload) => {
14
+ const method = hexToU8a(payload.method);
15
+ const era = hexToU8a(payload.era);
16
+ const nonce = compactToU8a(parseInt(payload.nonce, 16));
17
+ const tip = compactToU8a(payload.tip ? BigInt(payload.tip) : 0n);
18
+ const specVersion = new Uint8Array(4);
19
+ new DataView(specVersion.buffer).setUint32(0, parseInt(payload.specVersion, 16), true);
20
+ const transactionVersion = new Uint8Array(4);
21
+ new DataView(transactionVersion.buffer).setUint32(0, parseInt(payload.transactionVersion, 16), true);
22
+ const genesisHash = hexToU8a(payload.genesisHash);
23
+ const blockHash = hexToU8a(payload.blockHash);
24
+ const raw = u8aConcat(method, era, nonce, tip, specVersion, transactionVersion, genesisHash, blockHash);
25
+ if (raw.length > polkadotSigningPayloadHashThreshold) {
26
+ return blake2AsU8a(raw, 256);
27
+ }
28
+ return raw;
29
+ };
30
+ //# sourceMappingURL=constructSigningPayload.js.map