@vultisig/rujira 1.0.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 (118) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +254 -0
  3. package/dist/assets/amount.d.ts +80 -0
  4. package/dist/assets/amount.d.ts.map +1 -0
  5. package/dist/assets/amount.js +186 -0
  6. package/dist/assets/asset.d.ts +43 -0
  7. package/dist/assets/asset.d.ts.map +1 -0
  8. package/dist/assets/asset.js +1 -0
  9. package/dist/assets/formats.d.ts +54 -0
  10. package/dist/assets/formats.d.ts.map +1 -0
  11. package/dist/assets/formats.js +164 -0
  12. package/dist/assets/index.d.ts +27 -0
  13. package/dist/assets/index.d.ts.map +1 -0
  14. package/dist/assets/index.js +45 -0
  15. package/dist/assets/registry.d.ts +37 -0
  16. package/dist/assets/registry.d.ts.map +1 -0
  17. package/dist/assets/registry.js +487 -0
  18. package/dist/assets/router.d.ts +44 -0
  19. package/dist/assets/router.d.ts.map +1 -0
  20. package/dist/assets/router.js +142 -0
  21. package/dist/client.d.ts +70 -0
  22. package/dist/client.d.ts.map +1 -0
  23. package/dist/client.js +250 -0
  24. package/dist/config/constants.d.ts +25 -0
  25. package/dist/config/constants.d.ts.map +1 -0
  26. package/dist/config/constants.js +36 -0
  27. package/dist/config.d.ts +41 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +72 -0
  30. package/dist/discovery/discovery.d.ts +39 -0
  31. package/dist/discovery/discovery.d.ts.map +1 -0
  32. package/dist/discovery/discovery.js +250 -0
  33. package/dist/discovery/graphql-client.d.ts +46 -0
  34. package/dist/discovery/graphql-client.d.ts.map +1 -0
  35. package/dist/discovery/graphql-client.js +137 -0
  36. package/dist/discovery/index.d.ts +9 -0
  37. package/dist/discovery/index.d.ts.map +1 -0
  38. package/dist/discovery/index.js +7 -0
  39. package/dist/discovery/types.d.ts +62 -0
  40. package/dist/discovery/types.d.ts.map +1 -0
  41. package/dist/discovery/types.js +5 -0
  42. package/dist/easy-routes.d.ts +216 -0
  43. package/dist/easy-routes.d.ts.map +1 -0
  44. package/dist/easy-routes.js +241 -0
  45. package/dist/errors.d.ts +65 -0
  46. package/dist/errors.d.ts.map +1 -0
  47. package/dist/errors.js +184 -0
  48. package/dist/index.d.ts +46 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +46 -0
  51. package/dist/modules/assets.d.ts +68 -0
  52. package/dist/modules/assets.d.ts.map +1 -0
  53. package/dist/modules/assets.js +127 -0
  54. package/dist/modules/deposit.d.ts +152 -0
  55. package/dist/modules/deposit.d.ts.map +1 -0
  56. package/dist/modules/deposit.js +233 -0
  57. package/dist/modules/index.d.ts +12 -0
  58. package/dist/modules/index.d.ts.map +1 -0
  59. package/dist/modules/index.js +9 -0
  60. package/dist/modules/orderbook.d.ts +80 -0
  61. package/dist/modules/orderbook.d.ts.map +1 -0
  62. package/dist/modules/orderbook.js +320 -0
  63. package/dist/modules/swap.d.ts +48 -0
  64. package/dist/modules/swap.d.ts.map +1 -0
  65. package/dist/modules/swap.js +318 -0
  66. package/dist/modules/withdraw.d.ts +46 -0
  67. package/dist/modules/withdraw.d.ts.map +1 -0
  68. package/dist/modules/withdraw.js +218 -0
  69. package/dist/services/fee-estimator.d.ts +14 -0
  70. package/dist/services/fee-estimator.d.ts.map +1 -0
  71. package/dist/services/fee-estimator.js +89 -0
  72. package/dist/services/price-impact.d.ts +11 -0
  73. package/dist/services/price-impact.d.ts.map +1 -0
  74. package/dist/services/price-impact.js +58 -0
  75. package/dist/signer/index.d.ts +3 -0
  76. package/dist/signer/index.d.ts.map +1 -0
  77. package/dist/signer/index.js +1 -0
  78. package/dist/signer/keysign-builder.d.ts +21 -0
  79. package/dist/signer/keysign-builder.d.ts.map +1 -0
  80. package/dist/signer/keysign-builder.js +106 -0
  81. package/dist/signer/types.d.ts +81 -0
  82. package/dist/signer/types.d.ts.map +1 -0
  83. package/dist/signer/types.js +8 -0
  84. package/dist/signer/vultisig-provider.d.ts +33 -0
  85. package/dist/signer/vultisig-provider.d.ts.map +1 -0
  86. package/dist/signer/vultisig-provider.js +242 -0
  87. package/dist/types.d.ts +375 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +18 -0
  90. package/dist/utils/cache.d.ts +87 -0
  91. package/dist/utils/cache.d.ts.map +1 -0
  92. package/dist/utils/cache.js +124 -0
  93. package/dist/utils/denom-conversion.d.ts +47 -0
  94. package/dist/utils/denom-conversion.d.ts.map +1 -0
  95. package/dist/utils/denom-conversion.js +105 -0
  96. package/dist/utils/encoding.d.ts +17 -0
  97. package/dist/utils/encoding.d.ts.map +1 -0
  98. package/dist/utils/encoding.js +55 -0
  99. package/dist/utils/format.d.ts +108 -0
  100. package/dist/utils/format.d.ts.map +1 -0
  101. package/dist/utils/format.js +213 -0
  102. package/dist/utils/index.d.ts +10 -0
  103. package/dist/utils/index.d.ts.map +1 -0
  104. package/dist/utils/index.js +9 -0
  105. package/dist/utils/memo.d.ts +107 -0
  106. package/dist/utils/memo.d.ts.map +1 -0
  107. package/dist/utils/memo.js +190 -0
  108. package/dist/utils/rate-limiter.d.ts +38 -0
  109. package/dist/utils/rate-limiter.d.ts.map +1 -0
  110. package/dist/utils/rate-limiter.js +67 -0
  111. package/dist/utils/type-guards.d.ts +22 -0
  112. package/dist/utils/type-guards.d.ts.map +1 -0
  113. package/dist/utils/type-guards.js +27 -0
  114. package/dist/validation/address-validator.d.ts +15 -0
  115. package/dist/validation/address-validator.d.ts.map +1 -0
  116. package/dist/validation/address-validator.js +75 -0
  117. package/package.json +98 -0
  118. package/src/__tests__/live/README.md +47 -0
@@ -0,0 +1,164 @@
1
+ import { findAssetByFormat } from './registry.js';
2
+ /**
3
+ * Convert asset to THORChain format
4
+ */
5
+ export function toThorchainFormat(asset) {
6
+ return asset.formats.thorchain;
7
+ }
8
+ /**
9
+ * Convert asset to FIN format
10
+ */
11
+ export function toFinFormat(asset) {
12
+ return asset.formats.fin;
13
+ }
14
+ /**
15
+ * Convert asset to L1/native format
16
+ */
17
+ export function toL1Format(asset) {
18
+ return asset.formats.l1;
19
+ }
20
+ /**
21
+ * Parse asset identifier from any format
22
+ */
23
+ export function parseAsset(input) {
24
+ return findAssetByFormat(input);
25
+ }
26
+ /**
27
+ * Normalize THORChain pool name to standard format
28
+ */
29
+ export function normalizeThorchainPool(pool) {
30
+ // Convert to uppercase and ensure proper format
31
+ const upper = pool.toUpperCase();
32
+ // Handle special cases
33
+ if (upper === 'BTC.BTC')
34
+ return 'BTC.BTC';
35
+ if (upper === 'ETH.ETH')
36
+ return 'ETH.ETH';
37
+ if (upper === 'THOR.RUNE')
38
+ return 'THOR.RUNE';
39
+ // Handle ERC20 tokens - ensure contract address is uppercase
40
+ if (upper.includes('-0X')) {
41
+ const [chainSymbol, contract] = upper.split('-');
42
+ return `${chainSymbol}-${contract}`;
43
+ }
44
+ return upper;
45
+ }
46
+ /**
47
+ * Normalize FIN format to lowercase with hyphens
48
+ */
49
+ export function normalizeFinFormat(format) {
50
+ return format.toLowerCase().replace(/[^a-z0-9-]/g, '-');
51
+ }
52
+ /**
53
+ * Extract chain from THORChain format
54
+ */
55
+ export function extractChainFromThorchain(thorchainFormat) {
56
+ const parts = thorchainFormat.split('.');
57
+ if (parts.length < 2) {
58
+ throw new Error(`Invalid THORChain format: ${thorchainFormat}`);
59
+ }
60
+ const chainMap = {
61
+ BTC: 'bitcoin',
62
+ ETH: 'ethereum',
63
+ THOR: 'thorchain',
64
+ AVAX: 'avalanche',
65
+ GAIA: 'cosmos',
66
+ DOGE: 'dogecoin',
67
+ LTC: 'litecoin',
68
+ BCH: 'bitcoincash',
69
+ BNB: 'binance',
70
+ BASE: 'base',
71
+ XRP: 'xrp',
72
+ };
73
+ return chainMap[parts[0]] || parts[0].toLowerCase();
74
+ }
75
+ /**
76
+ * Extract symbol from THORChain format
77
+ */
78
+ export function extractSymbolFromThorchain(thorchainFormat) {
79
+ const parts = thorchainFormat.split('.');
80
+ if (parts.length < 2) {
81
+ throw new Error(`Invalid THORChain format: ${thorchainFormat}`);
82
+ }
83
+ // Handle contract addresses
84
+ const symbolPart = parts[1];
85
+ if (symbolPart.includes('-')) {
86
+ return symbolPart.split('-')[0];
87
+ }
88
+ return symbolPart;
89
+ }
90
+ /**
91
+ * Extract contract from THORChain format (if present)
92
+ */
93
+ export function extractContractFromThorchain(thorchainFormat) {
94
+ const parts = thorchainFormat.split('.');
95
+ if (parts.length < 2)
96
+ return undefined;
97
+ const symbolPart = parts[1];
98
+ if (symbolPart.includes('-0X')) {
99
+ return symbolPart.split('-')[1];
100
+ }
101
+ return undefined;
102
+ }
103
+ /**
104
+ * Build THORChain format from components
105
+ */
106
+ export function buildThorchainFormat(chain, symbol, contract) {
107
+ const chainPrefix = chain.toUpperCase();
108
+ if (contract) {
109
+ return `${chainPrefix}.${symbol.toUpperCase()}-${contract.toUpperCase()}`;
110
+ }
111
+ return `${chainPrefix}.${symbol.toUpperCase()}`;
112
+ }
113
+ /**
114
+ * Build FIN format from components
115
+ */
116
+ export function buildFinFormat(chain, symbol, contract) {
117
+ let format = `${chain.toLowerCase()}-${symbol.toLowerCase()}`;
118
+ if (contract) {
119
+ format += `-${contract.toLowerCase()}`;
120
+ }
121
+ return format;
122
+ }
123
+ /**
124
+ * Convert between any two formats
125
+ */
126
+ export function convertFormat(input, targetFormat) {
127
+ const asset = parseAsset(input);
128
+ if (!asset)
129
+ return null;
130
+ switch (targetFormat) {
131
+ case 'l1':
132
+ return toL1Format(asset);
133
+ case 'thorchain':
134
+ return toThorchainFormat(asset);
135
+ case 'fin':
136
+ return toFinFormat(asset);
137
+ default:
138
+ return null;
139
+ }
140
+ }
141
+ /**
142
+ * Detect format type of input string
143
+ */
144
+ export function detectFormat(input) {
145
+ const normalized = input.toLowerCase();
146
+ // FIN special formats first (before THORChain, since thor.xxx overlaps)
147
+ // Test thor.xxx against original input so uppercase THOR.RUNE isn't matched
148
+ if (/^x\/[a-z]+$/.test(normalized) || /^thor\.[a-z]+$/.test(input) || /^(rune|tcy)$/.test(normalized)) {
149
+ return 'fin';
150
+ }
151
+ // THORChain format: CHAIN.SYMBOL or CHAIN.SYMBOL-CONTRACT
152
+ if (/^[a-z]+\.[a-z]+(-.+)?$/i.test(input)) {
153
+ return 'thorchain';
154
+ }
155
+ // FIN format: chain-symbol or chain-symbol-contract (chain is 2-5 chars)
156
+ if (/^[a-z]{2,5}-[a-z0-9]+(-.+)?$/.test(normalized)) {
157
+ return 'fin';
158
+ }
159
+ // L1 format: symbol or contract address
160
+ if (/^0x[a-f0-9]{40}$/i.test(input) || /^[a-z]{2,5}$/i.test(input)) {
161
+ return 'l1';
162
+ }
163
+ return 'unknown';
164
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Asset registry - Unified asset and decimal handling for THORChain layers
3
+ *
4
+ * This module provides a unified interface for handling assets and amounts
5
+ * across three layers: native L1, THORChain, and Rujira FIN.
6
+ */
7
+ export type { Asset, Layer, Quote } from './asset.js';
8
+ import type { Layer } from './asset.js';
9
+ export { Amount } from './amount.js';
10
+ import { Amount } from './amount.js';
11
+ export { finToNative, finToThorchain, nativeToFin, nativeToThorchain, thorchainToFin, thorchainToNative, } from './amount.js';
12
+ export { findAssetByFormat, getAllAssets, getAsset, KNOWN_ASSETS } from './registry.js';
13
+ export { buildFinFormat, buildThorchainFormat, convertFormat, detectFormat, extractChainFromThorchain, extractContractFromThorchain, extractSymbolFromThorchain, normalizeFinFormat, normalizeThorchainPool, parseAsset, toFinFormat, toL1Format, toThorchainFormat, } from './formats.js';
14
+ export { SwapRouter } from './router.js';
15
+ /**
16
+ * Create an Amount from a human-readable string and asset ID
17
+ */
18
+ export declare function createAmount(human: string, assetId: string, layer?: Layer): Amount;
19
+ /**
20
+ * Parse an asset from any format and create an amount
21
+ */
22
+ export declare function parseAmount(human: string, assetFormat: string, layer?: Layer): Amount;
23
+ /**
24
+ * Quick conversion between layers
25
+ */
26
+ export declare function convert(amount: Amount, targetLayer: Layer): Amount;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAIvF,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,MAAM,CAM5F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,MAAM,CAM/F;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,GAAG,MAAM,CAElE"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Asset registry - Unified asset and decimal handling for THORChain layers
3
+ *
4
+ * This module provides a unified interface for handling assets and amounts
5
+ * across three layers: native L1, THORChain, and Rujira FIN.
6
+ */
7
+ // Amount class and conversion utilities
8
+ export { Amount } from './amount.js';
9
+ import { Amount } from './amount.js';
10
+ export { finToNative, finToThorchain, nativeToFin, nativeToThorchain, thorchainToFin, thorchainToNative, } from './amount.js';
11
+ // Asset registry
12
+ export { findAssetByFormat, getAllAssets, getAsset, KNOWN_ASSETS } from './registry.js';
13
+ import { getAsset } from './registry.js';
14
+ // Format converters
15
+ export { buildFinFormat, buildThorchainFormat, convertFormat, detectFormat, extractChainFromThorchain, extractContractFromThorchain, extractSymbolFromThorchain, normalizeFinFormat, normalizeThorchainPool, parseAsset, toFinFormat, toL1Format, toThorchainFormat, } from './formats.js';
16
+ import { parseAsset } from './formats.js';
17
+ // Swap router
18
+ export { SwapRouter } from './router.js';
19
+ // Convenience functions
20
+ /**
21
+ * Create an Amount from a human-readable string and asset ID
22
+ */
23
+ export function createAmount(human, assetId, layer = 'native') {
24
+ const asset = getAsset(assetId);
25
+ if (!asset) {
26
+ throw new Error(`Unknown asset: ${assetId}`);
27
+ }
28
+ return Amount.from(human, asset, layer);
29
+ }
30
+ /**
31
+ * Parse an asset from any format and create an amount
32
+ */
33
+ export function parseAmount(human, assetFormat, layer = 'native') {
34
+ const asset = parseAsset(assetFormat);
35
+ if (!asset) {
36
+ throw new Error(`Cannot parse asset format: ${assetFormat}`);
37
+ }
38
+ return Amount.from(human, asset, layer);
39
+ }
40
+ /**
41
+ * Quick conversion between layers
42
+ */
43
+ export function convert(amount, targetLayer) {
44
+ return amount.toLayer(targetLayer);
45
+ }
@@ -0,0 +1,37 @@
1
+ import { Asset } from './asset.js';
2
+ /**
3
+ * Registry of known assets with their formats and decimal specifications
4
+ * Complete Rujira asset coverage with correct FIN denom formats
5
+ */
6
+ export declare const KNOWN_ASSETS: Record<string, Asset>;
7
+ /**
8
+ * Get asset by ID
9
+ */
10
+ export declare function getAsset(id: string): Asset | null;
11
+ /**
12
+ * Get all known assets
13
+ */
14
+ export declare function getAllAssets(): Asset[];
15
+ /**
16
+ * Find asset by any format
17
+ */
18
+ export declare function findAssetByFormat(format: string): Asset | null;
19
+ /**
20
+ * Get assets by chain
21
+ */
22
+ export declare function getAssetsByChain(chain: string): Asset[];
23
+ /**
24
+ * Get all supported chains
25
+ */
26
+ export declare function getSupportedChains(): string[];
27
+ /**
28
+ * Get asset statistics
29
+ */
30
+ export declare function getAssetStats(): {
31
+ totalAssets: number;
32
+ supportedChains: number;
33
+ nativeAssets: number;
34
+ tokenAssets: number;
35
+ chains: string[];
36
+ };
37
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/assets/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CA4a9C,CAAA;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,EAAE,CAEtC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAe9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAM7C;AAED;;GAEG;AACH,wBAAgB,aAAa;;;;;;EAa5B"}