@vultisig/core-chain 1.0.0 → 1.1.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 (155) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/chains/cardano/asset/cardanoAssetId.d.ts +14 -0
  3. package/dist/chains/cardano/asset/cardanoAssetId.d.ts.map +1 -0
  4. package/dist/chains/cardano/asset/cardanoAssetId.js +19 -0
  5. package/dist/chains/cardano/asset/cardanoAssetId.js.map +1 -0
  6. package/dist/chains/cardano/client/getCardanoAddressAssets.d.ts +10 -0
  7. package/dist/chains/cardano/client/getCardanoAddressAssets.d.ts.map +1 -0
  8. package/dist/chains/cardano/client/getCardanoAddressAssets.js +19 -0
  9. package/dist/chains/cardano/client/getCardanoAddressAssets.js.map +1 -0
  10. package/dist/chains/cardano/client/getCardanoAssetInfo.d.ts +23 -0
  11. package/dist/chains/cardano/client/getCardanoAssetInfo.d.ts.map +1 -0
  12. package/dist/chains/cardano/client/getCardanoAssetInfo.js +16 -0
  13. package/dist/chains/cardano/client/getCardanoAssetInfo.js.map +1 -0
  14. package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.d.ts +20 -0
  15. package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.d.ts.map +1 -0
  16. package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.js +22 -0
  17. package/dist/chains/cardano/utxo/getCardanoExtendedUtxos.js.map +1 -0
  18. package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.d.ts +14 -0
  19. package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.d.ts.map +1 -0
  20. package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.js +28 -0
  21. package/dist/chains/cosmos/computeCosmosTxReceiptFeeAmount.js.map +1 -0
  22. package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.d.ts +1 -2
  23. package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.d.ts.map +1 -1
  24. package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.js +13 -9
  25. package/dist/chains/cosmos/qbtc/getQbtcAccountInfo.js.map +1 -1
  26. package/dist/chains/cosmos/qbtc/tendermintRpcUrl.d.ts +3 -5
  27. package/dist/chains/cosmos/qbtc/tendermintRpcUrl.d.ts.map +1 -1
  28. package/dist/chains/cosmos/qbtc/tendermintRpcUrl.js +3 -5
  29. package/dist/chains/cosmos/qbtc/tendermintRpcUrl.js.map +1 -1
  30. package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.d.ts +15 -0
  31. package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.d.ts.map +1 -0
  32. package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.js +22 -0
  33. package/dist/chains/cosmos/sumFeeAmountForCosmosChainFeeDenom.js.map +1 -0
  34. package/dist/chains/cosmos/thor/lp/affiliate.d.ts +16 -0
  35. package/dist/chains/cosmos/thor/lp/affiliate.d.ts.map +1 -0
  36. package/dist/chains/cosmos/thor/lp/affiliate.js +16 -0
  37. package/dist/chains/cosmos/thor/lp/affiliate.js.map +1 -0
  38. package/dist/chains/cosmos/thor/lp/index.d.ts +22 -0
  39. package/dist/chains/cosmos/thor/lp/index.d.ts.map +1 -0
  40. package/dist/chains/cosmos/thor/lp/index.js +18 -0
  41. package/dist/chains/cosmos/thor/lp/index.js.map +1 -0
  42. package/dist/chains/cosmos/thor/lp/memo.d.ts +41 -0
  43. package/dist/chains/cosmos/thor/lp/memo.d.ts.map +1 -0
  44. package/dist/chains/cosmos/thor/lp/memo.js +38 -0
  45. package/dist/chains/cosmos/thor/lp/memo.js.map +1 -0
  46. package/dist/chains/cosmos/thor/lp/payload.d.ts +46 -0
  47. package/dist/chains/cosmos/thor/lp/payload.d.ts.map +1 -0
  48. package/dist/chains/cosmos/thor/lp/payload.js +37 -0
  49. package/dist/chains/cosmos/thor/lp/payload.js.map +1 -0
  50. package/dist/chains/cosmos/thor/lp/pools.d.ts +46 -0
  51. package/dist/chains/cosmos/thor/lp/pools.d.ts.map +1 -0
  52. package/dist/chains/cosmos/thor/lp/pools.js +85 -0
  53. package/dist/chains/cosmos/thor/lp/pools.js.map +1 -0
  54. package/dist/chains/cosmos/thor/lp/position.d.ts +30 -0
  55. package/dist/chains/cosmos/thor/lp/position.d.ts.map +1 -0
  56. package/dist/chains/cosmos/thor/lp/position.js +58 -0
  57. package/dist/chains/cosmos/thor/lp/position.js.map +1 -0
  58. package/dist/chains/cosmos/thor/lp/validation.d.ts +13 -0
  59. package/dist/chains/cosmos/thor/lp/validation.d.ts.map +1 -0
  60. package/dist/chains/cosmos/thor/lp/validation.js +35 -0
  61. package/dist/chains/cosmos/thor/lp/validation.js.map +1 -0
  62. package/dist/chains/polkadot/dapp/PolkadotSignerPayload.d.ts +16 -0
  63. package/dist/chains/polkadot/dapp/PolkadotSignerPayload.d.ts.map +1 -0
  64. package/dist/chains/polkadot/dapp/PolkadotSignerPayload.js +2 -0
  65. package/dist/chains/polkadot/dapp/PolkadotSignerPayload.js.map +1 -0
  66. package/dist/chains/polkadot/dapp/constructSigningPayload.d.ts +12 -0
  67. package/dist/chains/polkadot/dapp/constructSigningPayload.d.ts.map +1 -0
  68. package/dist/chains/polkadot/dapp/constructSigningPayload.js +30 -0
  69. package/dist/chains/polkadot/dapp/constructSigningPayload.js.map +1 -0
  70. package/dist/chains/solana/getDynamicPriorityFeePrice.d.ts +3 -0
  71. package/dist/chains/solana/getDynamicPriorityFeePrice.d.ts.map +1 -0
  72. package/dist/chains/solana/getDynamicPriorityFeePrice.js +20 -0
  73. package/dist/chains/solana/getDynamicPriorityFeePrice.js.map +1 -0
  74. package/dist/chains/solana/jito.d.ts +6 -0
  75. package/dist/chains/solana/jito.d.ts.map +1 -0
  76. package/dist/chains/solana/jito.js +40 -0
  77. package/dist/chains/solana/jito.js.map +1 -0
  78. package/dist/chains/ton/address.d.ts +6 -0
  79. package/dist/chains/ton/address.d.ts.map +1 -0
  80. package/dist/chains/ton/address.js +17 -0
  81. package/dist/chains/ton/address.js.map +1 -0
  82. package/dist/chains/ton/api.d.ts +7 -2
  83. package/dist/chains/ton/api.d.ts.map +1 -1
  84. package/dist/chains/ton/api.js +16 -3
  85. package/dist/chains/ton/api.js.map +1 -1
  86. package/dist/chains/utxo/client/getDashUtxos.d.ts +3 -0
  87. package/dist/chains/utxo/client/getDashUtxos.d.ts.map +1 -0
  88. package/dist/chains/utxo/client/getDashUtxos.js +28 -0
  89. package/dist/chains/utxo/client/getDashUtxos.js.map +1 -0
  90. package/dist/chains/utxo/tx/getPsbtTransferInfo.js +1 -1
  91. package/dist/chains/utxo/tx/getPsbtTransferInfo.js.map +1 -1
  92. package/dist/chains/utxo/tx/getUtxos.d.ts.map +1 -1
  93. package/dist/chains/utxo/tx/getUtxos.js +5 -0
  94. package/dist/chains/utxo/tx/getUtxos.js.map +1 -1
  95. package/dist/coin/balance/resolvers/cardano.d.ts +1 -0
  96. package/dist/coin/balance/resolvers/cardano.d.ts.map +1 -1
  97. package/dist/coin/balance/resolvers/cardano.js +12 -0
  98. package/dist/coin/balance/resolvers/cardano.js.map +1 -1
  99. package/dist/coin/balance/resolvers/qbtc.d.ts.map +1 -1
  100. package/dist/coin/balance/resolvers/qbtc.js +6 -5
  101. package/dist/coin/balance/resolvers/qbtc.js.map +1 -1
  102. package/dist/coin/balance/resolvers/sui.d.ts.map +1 -1
  103. package/dist/coin/balance/resolvers/sui.js +1 -0
  104. package/dist/coin/balance/resolvers/sui.js.map +1 -1
  105. package/dist/coin/balance/resolvers/ton.d.ts.map +1 -1
  106. package/dist/coin/balance/resolvers/ton.js +11 -2
  107. package/dist/coin/balance/resolvers/ton.js.map +1 -1
  108. package/dist/coin/find/CoinFinderChainKind.d.ts +1 -1
  109. package/dist/coin/find/CoinFinderChainKind.d.ts.map +1 -1
  110. package/dist/coin/find/CoinFinderChainKind.js +1 -1
  111. package/dist/coin/find/CoinFinderChainKind.js.map +1 -1
  112. package/dist/coin/find/index.d.ts.map +1 -1
  113. package/dist/coin/find/index.js +2 -0
  114. package/dist/coin/find/index.js.map +1 -1
  115. package/dist/coin/find/resolvers/cardano.d.ts +5 -0
  116. package/dist/coin/find/resolvers/cardano.d.ts.map +1 -0
  117. package/dist/coin/find/resolvers/cardano.js +17 -0
  118. package/dist/coin/find/resolvers/cardano.js.map +1 -0
  119. package/dist/coin/knownTokens/index.d.ts.map +1 -1
  120. package/dist/coin/knownTokens/index.js +74 -0
  121. package/dist/coin/knownTokens/index.js.map +1 -1
  122. package/dist/coin/token/metadata/chains.d.ts +1 -1
  123. package/dist/coin/token/metadata/chains.d.ts.map +1 -1
  124. package/dist/coin/token/metadata/chains.js +1 -0
  125. package/dist/coin/token/metadata/chains.js.map +1 -1
  126. package/dist/coin/token/metadata/index.d.ts.map +1 -1
  127. package/dist/coin/token/metadata/index.js +2 -0
  128. package/dist/coin/token/metadata/index.js.map +1 -1
  129. package/dist/coin/token/metadata/resolvers/cardano.d.ts +8 -0
  130. package/dist/coin/token/metadata/resolvers/cardano.d.ts.map +1 -0
  131. package/dist/coin/token/metadata/resolvers/cardano.js +20 -0
  132. package/dist/coin/token/metadata/resolvers/cardano.js.map +1 -0
  133. package/dist/swap/native/utils/getNativeSwapDecimals.d.ts +8 -0
  134. package/dist/swap/native/utils/getNativeSwapDecimals.d.ts.map +1 -1
  135. package/dist/swap/native/utils/getNativeSwapDecimals.js +19 -4
  136. package/dist/swap/native/utils/getNativeSwapDecimals.js.map +1 -1
  137. package/dist/tx/broadcast/resolvers/qbtc.d.ts.map +1 -1
  138. package/dist/tx/broadcast/resolvers/qbtc.js +22 -5
  139. package/dist/tx/broadcast/resolvers/qbtc.js.map +1 -1
  140. package/dist/tx/broadcast/resolvers/solana.d.ts.map +1 -1
  141. package/dist/tx/broadcast/resolvers/solana.js +12 -1
  142. package/dist/tx/broadcast/resolvers/solana.js.map +1 -1
  143. package/dist/tx/hash/resolvers/cardano.d.ts.map +1 -1
  144. package/dist/tx/hash/resolvers/cardano.js +9 -5
  145. package/dist/tx/hash/resolvers/cardano.js.map +1 -1
  146. package/dist/tx/status/resolvers/cosmos.d.ts.map +1 -1
  147. package/dist/tx/status/resolvers/cosmos.js +21 -8
  148. package/dist/tx/status/resolvers/cosmos.js.map +1 -1
  149. package/dist/tx/status/resolvers/qbtc.d.ts.map +1 -1
  150. package/dist/tx/status/resolvers/qbtc.js +18 -19
  151. package/dist/tx/status/resolvers/qbtc.js.map +1 -1
  152. package/dist/tx/status/resolvers/ton.d.ts.map +1 -1
  153. package/dist/tx/status/resolvers/ton.js +4 -4
  154. package/dist/tx/status/resolvers/ton.js.map +1 -1
  155. package/package.json +107 -1
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Flat unsigned-transaction payload for an asymmetric RUNE-side LP add.
3
+ *
4
+ * Shape stays single-nesting-level on purpose: this object is what flows
5
+ * through the agent backend's SSE `tx_ready` event, and the audit
6
+ * (2026-04-09) flagged tool result flattening as a known wire-level hazard
7
+ * for nested fields. Every consumer (MCP tool result, backend SSE emit, app
8
+ * `parseServerTx`) reads the same flat keys.
9
+ */
10
+ export type ThorchainLpAddPayload = {
11
+ kind: 'thorchain_lp_add';
12
+ chain: 'THORChain';
13
+ denom: 'rune';
14
+ /** RUNE base units; 1 RUNE = 100000000 (8 decimals). */
15
+ amount: string;
16
+ /** Pre-built memo via `addLpMemo`. */
17
+ memo: string;
18
+ /** Canonical pool id, denormalized for display. */
19
+ pool: string;
20
+ /** Affiliate THORName, denormalized for display. */
21
+ affiliate: string;
22
+ /** Affiliate fee in basis points, denormalized for display. */
23
+ affiliateBps: number;
24
+ };
25
+ export type ThorchainLpRemovePayload = {
26
+ kind: 'thorchain_lp_remove';
27
+ chain: 'THORChain';
28
+ denom: 'rune';
29
+ /** Dust amount in RUNE base units. The withdraw fraction lives in the memo. */
30
+ amount: string;
31
+ /** Pre-built memo via `removeLpMemo`. */
32
+ memo: string;
33
+ pool: string;
34
+ basisPoints: number;
35
+ };
36
+ export type BuildThorchainLpAddPayloadInput = {
37
+ pool: string;
38
+ amountRuneBaseUnits: string;
39
+ };
40
+ export declare const buildThorchainLpAddPayload: ({ pool, amountRuneBaseUnits, }: BuildThorchainLpAddPayloadInput) => ThorchainLpAddPayload;
41
+ export type BuildThorchainLpRemovePayloadInput = {
42
+ pool: string;
43
+ basisPoints: number;
44
+ };
45
+ export declare const buildThorchainLpRemovePayload: ({ pool, basisPoints, }: BuildThorchainLpRemovePayloadInput) => ThorchainLpRemovePayload;
46
+ //# sourceMappingURL=payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/payload.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,kBAAkB,CAAA;IACxB,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAeD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,gCAGxC,+BAA+B,KAAG,qBAgBpC,CAAA;AAED,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,6BAA6B,GAAI,wBAG3C,kCAAkC,KAAG,wBAQtC,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { VULTISIG_AFFILIATE_LP_BPS, VULTISIG_AFFILIATE_NAME, } from './affiliate.js';
2
+ import { addLpMemo, removeLpMemo } from './memo.js';
3
+ /**
4
+ * Dust amount used for LP removes.
5
+ *
6
+ * Reference: vultisig-windows/core/ui/vault/deposit/keysignPayload/build.ts
7
+ * sends 0.02 RUNE on LP remove transactions — the on-chain amount is just
8
+ * dust to make the cosmos message valid; the actual withdraw fraction lives
9
+ * inside the memo (`-:POOL:BPS`).
10
+ */
11
+ const LP_REMOVE_DUST_RUNE_BASE_UNITS = '2000000';
12
+ const isPositiveBaseUnitString = (value) => /^\d+$/.test(value) && BigInt(value) > 0n;
13
+ export const buildThorchainLpAddPayload = ({ pool, amountRuneBaseUnits, }) => {
14
+ if (!isPositiveBaseUnitString(amountRuneBaseUnits)) {
15
+ throw new Error(`buildThorchainLpAddPayload: amountRuneBaseUnits must be a positive integer string, got ${amountRuneBaseUnits}`);
16
+ }
17
+ return {
18
+ kind: 'thorchain_lp_add',
19
+ chain: 'THORChain',
20
+ denom: 'rune',
21
+ amount: amountRuneBaseUnits,
22
+ memo: addLpMemo({ pool }),
23
+ pool,
24
+ affiliate: VULTISIG_AFFILIATE_NAME,
25
+ affiliateBps: VULTISIG_AFFILIATE_LP_BPS,
26
+ };
27
+ };
28
+ export const buildThorchainLpRemovePayload = ({ pool, basisPoints, }) => ({
29
+ kind: 'thorchain_lp_remove',
30
+ chain: 'THORChain',
31
+ denom: 'rune',
32
+ amount: LP_REMOVE_DUST_RUNE_BASE_UNITS,
33
+ memo: removeLpMemo({ pool, basisPoints }),
34
+ pool,
35
+ basisPoints,
36
+ });
37
+ //# sourceMappingURL=payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/cosmos/thor/lp/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAuChD;;;;;;;GAOG;AACH,MAAM,8BAA8B,GAAG,SAAS,CAAA;AAEhD,MAAM,wBAAwB,GAAG,CAAC,KAAa,EAAW,EAAE,CAC1D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;AAO3C,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EACzC,IAAI,EACJ,mBAAmB,GACa,EAAyB,EAAE;IAC3D,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CACb,0FAA0F,mBAAmB,EAAE,CAChH,CAAA;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QACzB,IAAI;QACJ,SAAS,EAAE,uBAAuB;QAClC,YAAY,EAAE,yBAAyB;KACxC,CAAA;AACH,CAAC,CAAA;AAOD,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,IAAI,EACJ,WAAW,GACwB,EAA4B,EAAE,CAAC,CAAC;IACnE,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,8BAA8B;IACtC,IAAI,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACzC,IAAI;IACJ,WAAW;CACZ,CAAC,CAAA"}
@@ -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,30 @@
1
+ /**
2
+ * Subset of a Midgard `/v2/member/{address}` pool entry. Midgard returns
3
+ * many more fields per position — we keep just the ones the agent stack
4
+ * surfaces in chat (units, added amounts, pending state, last-add timestamp).
5
+ */
6
+ export type ThorchainLpPosition = {
7
+ pool: string;
8
+ liquidityUnits: string;
9
+ runeAdded: string;
10
+ assetAdded: string;
11
+ runePending: string;
12
+ assetPending: string;
13
+ runeAddress: string;
14
+ assetAddress: string;
15
+ /** Unix seconds (Midgard returns it as a string). */
16
+ dateLastAdded: string;
17
+ /**
18
+ * True when either side has a non-zero pending amount. Common for
19
+ * asymmetric adds that THORChain has not yet credited.
20
+ */
21
+ isPending: boolean;
22
+ };
23
+ export type GetThorchainLpPositionInput = {
24
+ /** bech32 thor1... address (the RUNE side of the position). */
25
+ thorAddress: string;
26
+ /** Canonical pool id to look up. */
27
+ pool: string;
28
+ };
29
+ export declare const getThorchainLpPosition: ({ thorAddress, pool, }: GetThorchainLpPositionInput) => Promise<ThorchainLpPosition | null>;
30
+ //# 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":"AAKA;;;;GAIG;AACH,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,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAwCD,MAAM,MAAM,2BAA2B,GAAG;IACxC,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAA;IACnB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAkBD,eAAO,MAAM,sBAAsB,GAAU,wBAG1C,2BAA2B,KAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAelE,CAAA"}
@@ -0,0 +1,58 @@
1
+ import { HttpResponseError } from '@vultisig/lib-utils/fetch/HttpResponseError';
2
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
3
+ import { assertValidPoolId, thorchainMidgardBaseUrl } from './pools.js';
4
+ const isNonZero = (s) => {
5
+ if (!s)
6
+ return false;
7
+ try {
8
+ return BigInt(s) > 0n;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ };
14
+ const normalizeMemberPool = (raw) => ({
15
+ pool: raw.pool ?? '',
16
+ liquidityUnits: raw.liquidityUnits ?? '0',
17
+ runeAdded: raw.runeAdded ?? '0',
18
+ assetAdded: raw.assetAdded ?? '0',
19
+ runePending: raw.runePending ?? '0',
20
+ assetPending: raw.assetPending ?? '0',
21
+ runeAddress: raw.runeAddress ?? '',
22
+ assetAddress: raw.assetAddress ?? '',
23
+ dateLastAdded: raw.dateLastAdded ?? '0',
24
+ isPending: isNonZero(raw.runePending) || isNonZero(raw.assetPending),
25
+ });
26
+ /**
27
+ * Fetch a single LP position from Midgard.
28
+ *
29
+ * Returns `null` when:
30
+ * - the address has no positions at all (Midgard returns 404), or
31
+ * - the address has positions but none in the requested pool.
32
+ */
33
+ /**
34
+ * Detect a 404 from queryUrl by reading the typed `HttpResponseError.status`
35
+ * field that `@vultisig/lib-utils` `assertFetchResponse` now throws. The
36
+ * previous implementation string-matched the error message; that worked
37
+ * but was brittle to wording changes. See NeoMakinG's PR #236 review note.
38
+ */
39
+ const isMidgardNotFoundError = (err) => err instanceof HttpResponseError && err.status === 404;
40
+ export const getThorchainLpPosition = async ({ thorAddress, pool, }) => {
41
+ assertValidPoolId(pool);
42
+ const url = `${thorchainMidgardBaseUrl}/v2/member/${encodeURIComponent(thorAddress)}`;
43
+ let raw;
44
+ try {
45
+ raw = await queryUrl(url);
46
+ }
47
+ catch (err) {
48
+ // Midgard returns 404 for any address it has not indexed yet — treat as
49
+ // "no position". Other errors bubble.
50
+ if (isMidgardNotFoundError(err))
51
+ return null;
52
+ throw err;
53
+ }
54
+ const pools = Array.isArray(raw.pools) ? raw.pools : [];
55
+ const found = pools.find(p => p.pool === pool);
56
+ return found ? normalizeMemberPool(found) : null;
57
+ };
58
+ //# 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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAyCpE,MAAM,SAAS,GAAG,CAAC,CAAqB,EAAW,EAAE;IACnD,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IACpB,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,GAAkB,EAAuB,EAAE,CAAC,CAAC;IACxE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;IACpB,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,GAAG;IACzC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG;IAC/B,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG;IACjC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG;IACnC,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,GAAG;IACrC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;IAClC,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;IACpC,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,GAAG;IACvC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;CACrE,CAAC,CAAA;AASF;;;;;;GAMG;AACH;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,CAAC,GAAY,EAAW,EAAE,CACvD,GAAG,YAAY,iBAAiB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAA;AAExD,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,EAC3C,WAAW,EACX,IAAI,GACwB,EAAuC,EAAE;IACrE,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACvB,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,wEAAwE;QACxE,sCAAsC;QACtC,IAAI,sBAAsB,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAC5C,MAAM,GAAG,CAAA;IACX,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAClD,CAAC,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Verify a THORChain pool is currently depositable.
3
+ *
4
+ * Hits the thornode `/thorchain/pool/{asset}` endpoint and asserts the
5
+ * `status` field is `Available`. Throws on `Staged`, `Suspended`, or any
6
+ * other non-Available state, and on network failures or unexpected payloads.
7
+ *
8
+ * Use this as the fail-fast gate before building an LP add payload — it is
9
+ * cheaper than building the payload first and discovering at broadcast time
10
+ * that the pool is paused.
11
+ */
12
+ export declare const assertPoolDepositable: (pool: string) => Promise<void>;
13
+ //# 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;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAetE,CAAA"}
@@ -0,0 +1,35 @@
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
+ * Verify a THORChain pool is currently depositable.
14
+ *
15
+ * Hits the thornode `/thorchain/pool/{asset}` endpoint and asserts the
16
+ * `status` field is `Available`. Throws on `Staged`, `Suspended`, or any
17
+ * other non-Available state, and on network failures or unexpected payloads.
18
+ *
19
+ * Use this as the fail-fast gate before building an LP add payload — it is
20
+ * cheaper than building the payload first and discovering at broadcast time
21
+ * that the pool is paused.
22
+ */
23
+ export const assertPoolDepositable = async (pool) => {
24
+ assertValidPoolId(pool);
25
+ const url = `${cosmosRpcUrl[Chain.THORChain]}/thorchain/pool/${encodeURIComponent(pool)}`;
26
+ const raw = await queryUrl(url);
27
+ const status = extractPoolStatus(raw);
28
+ if (status === undefined) {
29
+ throw new Error(`assertPoolDepositable: pool ${pool} response from ${url} did not include a string \`status\` field`);
30
+ }
31
+ if (status !== 'Available') {
32
+ throw new Error(`assertPoolDepositable: pool ${pool} status is ${status}, must be Available for LP add`);
33
+ }
34
+ };
35
+ //# 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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE3C,MAAM,iBAAiB,GAAG,CAAC,GAAY,EAAsB,EAAE;IAC7D,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;QACtD,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,CAAA;QAClD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IACxD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,IAAY,EAAiB,EAAE;IACzE,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACvB,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAA;IACzF,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAU,GAAG,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,kBAAkB,GAAG,4CAA4C,CACrG,CAAA;IACH,CAAC;IACD,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,cAAc,MAAM,gCAAgC,CACxF,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructSigningPayload.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/polkadot/dapp/constructSigningPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAInD,MAAM,mCAAmC,GAAG,GAAG,CAAA;AAE/C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,OAAkC,EACtB,EAAE;IACd,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA;IACvD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAEhE,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IACrC,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,SAAS,CACxC,CAAC,EACD,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EACjC,IAAI,CACL,CAAA;IAED,MAAM,kBAAkB,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAC5C,IAAI,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,SAAS,CAC/C,CAAC,EACD,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,EACxC,IAAI,CACL,CAAA;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAE7C,MAAM,GAAG,GAAG,SAAS,CACnB,MAAM,EACN,GAAG,EACH,KAAK,EACL,GAAG,EACH,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,SAAS,CACV,CAAA;IAED,IAAI,GAAG,CAAC,MAAM,GAAG,mCAAmC,EAAE,CAAC;QACrD,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** Fetches the median of non-zero recent prioritization fees from the Solana RPC. */
2
+ export declare const getDynamicPriorityFeePrice: () => Promise<number>;
3
+ //# sourceMappingURL=getDynamicPriorityFeePrice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDynamicPriorityFeePrice.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/getDynamicPriorityFeePrice.ts"],"names":[],"mappings":"AAGA,qFAAqF;AACrF,eAAO,MAAM,0BAA0B,QAAa,OAAO,CAAC,MAAM,CAqBjE,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { getSolanaClient } from './client.js';
2
+ import { solanaConfig } from './solanaConfig.js';
3
+ /** Fetches the median of non-zero recent prioritization fees from the Solana RPC. */
4
+ export const getDynamicPriorityFeePrice = async () => {
5
+ const client = getSolanaClient();
6
+ const recentFees = await client.getRecentPrioritizationFees();
7
+ const nonZeroFees = recentFees
8
+ .map(entry => entry.prioritizationFee)
9
+ .filter(fee => fee > 0)
10
+ .sort((a, b) => a - b);
11
+ if (nonZeroFees.length === 0) {
12
+ return solanaConfig.priorityFeePrice;
13
+ }
14
+ const mid = Math.floor(nonZeroFees.length / 2);
15
+ if (nonZeroFees.length % 2 === 0) {
16
+ return Math.round((nonZeroFees[mid - 1] + nonZeroFees[mid]) / 2);
17
+ }
18
+ return nonZeroFees[mid];
19
+ };
20
+ //# sourceMappingURL=getDynamicPriorityFeePrice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDynamicPriorityFeePrice.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/getDynamicPriorityFeePrice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,qFAAqF;AACrF,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,IAAqB,EAAE;IAClE,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAEhC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,2BAA2B,EAAE,CAAA;IAE7D,MAAM,WAAW,GAAG,UAAU;SACzB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC;SACrC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAE1B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC,gBAAgB,CAAA;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAE9C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,WAAW,CAAC,GAAG,CAAC,CAAA;AAC3B,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Submit a single signed transaction via JITO's sendTransaction endpoint.
3
+ * Provides free MEV protection (private mempool) without requiring a bundle or tip.
4
+ */
5
+ export declare function sendJitoTransaction(rawTransaction: Uint8Array): Promise<string>;
6
+ //# sourceMappingURL=jito.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jito.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/jito.ts"],"names":[],"mappings":"AA6BA;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,UAAU,GACzB,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -0,0 +1,40 @@
1
+ import base58 from 'bs58';
2
+ const JITO_BLOCK_ENGINE_URL = 'https://mainnet.block-engine.jito.wtf';
3
+ const JITO_HTTP_TIMEOUT_MS = 8_000;
4
+ async function jitoFetch(url, body) {
5
+ const controller = new AbortController();
6
+ const timeout = setTimeout(() => controller.abort(), JITO_HTTP_TIMEOUT_MS);
7
+ try {
8
+ const response = await fetch(url, {
9
+ method: 'POST',
10
+ headers: { 'Content-Type': 'application/json' },
11
+ body: JSON.stringify(body),
12
+ signal: controller.signal,
13
+ });
14
+ if (!response.ok) {
15
+ throw new Error(`JITO request failed: ${response.status} ${response.statusText}`);
16
+ }
17
+ return response.json();
18
+ }
19
+ finally {
20
+ clearTimeout(timeout);
21
+ }
22
+ }
23
+ /**
24
+ * Submit a single signed transaction via JITO's sendTransaction endpoint.
25
+ * Provides free MEV protection (private mempool) without requiring a bundle or tip.
26
+ */
27
+ export async function sendJitoTransaction(rawTransaction) {
28
+ const encoded = base58.encode(rawTransaction);
29
+ const data = await jitoFetch(`${JITO_BLOCK_ENGINE_URL}/api/v1/transactions`, {
30
+ jsonrpc: '2.0',
31
+ id: 1,
32
+ method: 'sendTransaction',
33
+ params: [encoded, { encoding: 'base58' }],
34
+ });
35
+ if (data.error) {
36
+ throw new Error(`JITO sendTransaction failed: ${JSON.stringify(data.error)}`);
37
+ }
38
+ return data.result;
39
+ }
40
+ //# sourceMappingURL=jito.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jito.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/jito.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,MAAM,CAAA;AAEzB,MAAM,qBAAqB,GAAG,uCAAuC,CAAA;AACrE,MAAM,oBAAoB,GAAG,KAAK,CAAA;AAOlC,KAAK,UAAU,SAAS,CAAc,GAAW,EAAE,IAAa;IAC9D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,oBAAoB,CAAC,CAAA;IAC1E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;QACnF,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,cAA0B;IAE1B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IAE7C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAS,GAAG,qBAAqB,sBAAsB,EAAE;QACnF,OAAO,EAAE,KAAK;QACd,EAAE,EAAE,CAAC;QACL,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;KAC1C,CAAC,CAAA;IACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,gCAAgC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAC7D,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Converts a user-friendly TON address (EQ.../UQ...) to raw format (workchain:hex).
3
+ * The toncenter v3 API requires raw addresses.
4
+ */
5
+ export declare const tonAddressToRaw: (userFriendlyAddress: string) => string;
6
+ //# sourceMappingURL=address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/address.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,qBAAqB,MAAM,KAAG,MAM7D,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { fromBase64 } from '@vultisig/lib-utils/fromBase64';
2
+ /** Converts base64url encoding to standard base64 so `Buffer.from` can decode it. */
3
+ const fromBase64Url = (value) => {
4
+ const standardBase64 = value.replace(/-/g, '+').replace(/_/g, '/');
5
+ return fromBase64(standardBase64);
6
+ };
7
+ /**
8
+ * Converts a user-friendly TON address (EQ.../UQ...) to raw format (workchain:hex).
9
+ * The toncenter v3 API requires raw addresses.
10
+ */
11
+ export const tonAddressToRaw = (userFriendlyAddress) => {
12
+ const decoded = fromBase64Url(userFriendlyAddress);
13
+ const workchain = decoded[1] >= 128 ? decoded[1] - 256 : decoded[1];
14
+ const hash = decoded.subarray(2, 34).toString('hex');
15
+ return `${workchain}:${hash}`;
16
+ };
17
+ //# sourceMappingURL=address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAE3D,qFAAqF;AACrF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE;IAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAClE,OAAO,UAAU,CAAC,cAAc,CAAC,CAAA;AACnC,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,mBAA2B,EAAU,EAAE;IACrE,MAAM,OAAO,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAA;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEpD,OAAO,GAAG,SAAS,IAAI,IAAI,EAAE,CAAA;AAC/B,CAAC,CAAA"}
@@ -1,6 +1,11 @@
1
- export declare const getJettonWalletAddress: ({ ownerAddress, jettonMasterAddress, }: {
1
+ type GetJettonWalletInput = {
2
2
  ownerAddress: string;
3
3
  jettonMasterAddress: string;
4
- }) => Promise<string>;
4
+ };
5
+ /** Resolves the user-friendly jetton wallet address for a given owner and jetton master. */
6
+ export declare const getJettonWalletAddress: (input: GetJettonWalletInput) => Promise<string>;
7
+ /** Fetches the balance of a specific jetton for a given owner address. */
8
+ export declare const getJettonBalance: (input: GetJettonWalletInput) => Promise<bigint>;
5
9
  export declare const getTonWalletState: (address: string) => Promise<string>;
10
+ export {};
6
11
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/api.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,sBAAsB,GAAU,wCAG1C;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,KAAG,OAAO,CAAC,MAAM,CAWjB,CAAA;AAOD,eAAO,MAAM,iBAAiB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,CAKvE,CAAA"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/api.ts"],"names":[],"mappings":"AAqBA,KAAK,oBAAoB,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAaD,4FAA4F;AAC5F,eAAO,MAAM,sBAAsB,GACjC,OAAO,oBAAoB,KAC1B,OAAO,CAAC,MAAM,CAYhB,CAAA;AAED,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,GAC3B,OAAO,oBAAoB,KAC1B,OAAO,CAAC,MAAM,CAOhB,CAAA;AAOD,eAAO,MAAM,iBAAiB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,CAKvE,CAAA"}