@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
package/dist/errors.js ADDED
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Error types for Rujira SDK
3
+ * @module errors
4
+ */
5
+ /**
6
+ * Error codes for Rujira operations
7
+ */
8
+ export var RujiraErrorCode;
9
+ (function (RujiraErrorCode) {
10
+ // Network errors
11
+ RujiraErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR";
12
+ RujiraErrorCode["RPC_ERROR"] = "RPC_ERROR";
13
+ RujiraErrorCode["TIMEOUT"] = "TIMEOUT";
14
+ RujiraErrorCode["NOT_CONNECTED"] = "NOT_CONNECTED";
15
+ // Validation errors
16
+ RujiraErrorCode["INVALID_ASSET"] = "INVALID_ASSET";
17
+ RujiraErrorCode["INVALID_AMOUNT"] = "INVALID_AMOUNT";
18
+ RujiraErrorCode["INVALID_ADDRESS"] = "INVALID_ADDRESS";
19
+ RujiraErrorCode["INVALID_PAIR"] = "INVALID_PAIR";
20
+ RujiraErrorCode["INVALID_SLIPPAGE"] = "INVALID_SLIPPAGE";
21
+ // Balance errors
22
+ RujiraErrorCode["INSUFFICIENT_BALANCE"] = "INSUFFICIENT_BALANCE";
23
+ RujiraErrorCode["INSUFFICIENT_GAS"] = "INSUFFICIENT_GAS";
24
+ // Swap errors
25
+ RujiraErrorCode["NO_ROUTE"] = "NO_ROUTE";
26
+ RujiraErrorCode["SLIPPAGE_EXCEEDED"] = "SLIPPAGE_EXCEEDED";
27
+ RujiraErrorCode["QUOTE_EXPIRED"] = "QUOTE_EXPIRED";
28
+ RujiraErrorCode["PRICE_IMPACT_TOO_HIGH"] = "PRICE_IMPACT_TOO_HIGH";
29
+ // Order errors
30
+ RujiraErrorCode["ORDER_NOT_FOUND"] = "ORDER_NOT_FOUND";
31
+ RujiraErrorCode["INVALID_PRICE"] = "INVALID_PRICE";
32
+ RujiraErrorCode["MIN_ORDER_SIZE"] = "MIN_ORDER_SIZE";
33
+ RujiraErrorCode["ORDER_ALREADY_FILLED"] = "ORDER_ALREADY_FILLED";
34
+ // Transaction errors
35
+ RujiraErrorCode["SIGNING_FAILED"] = "SIGNING_FAILED";
36
+ RujiraErrorCode["BROADCAST_FAILED"] = "BROADCAST_FAILED";
37
+ RujiraErrorCode["TX_FAILED"] = "TX_FAILED";
38
+ RujiraErrorCode["TX_NOT_FOUND"] = "TX_NOT_FOUND";
39
+ // Contract errors
40
+ RujiraErrorCode["CONTRACT_NOT_FOUND"] = "CONTRACT_NOT_FOUND";
41
+ RujiraErrorCode["CONTRACT_ERROR"] = "CONTRACT_ERROR";
42
+ // Configuration errors
43
+ RujiraErrorCode["INVALID_CONFIG"] = "INVALID_CONFIG";
44
+ RujiraErrorCode["MISSING_SIGNER"] = "MISSING_SIGNER";
45
+ })(RujiraErrorCode || (RujiraErrorCode = {}));
46
+ /**
47
+ * Base error class for Rujira SDK
48
+ */
49
+ export class RujiraError extends Error {
50
+ constructor(code, message, details, retryable = false) {
51
+ super(message);
52
+ this.name = 'RujiraError';
53
+ this.code = code;
54
+ this.details = details;
55
+ this.retryable = retryable;
56
+ // Maintain proper stack trace (Node.js specific)
57
+ if (typeof Error.captureStackTrace === 'function') {
58
+ Error.captureStackTrace(this, RujiraError);
59
+ }
60
+ }
61
+ /**
62
+ * Create a user-friendly error message
63
+ */
64
+ toUserMessage() {
65
+ return USER_FRIENDLY_MESSAGES[this.code] || this.message;
66
+ }
67
+ /**
68
+ * Convert to JSON for logging
69
+ */
70
+ toJSON() {
71
+ return {
72
+ name: this.name,
73
+ code: this.code,
74
+ message: this.message,
75
+ details: this.details,
76
+ retryable: this.retryable,
77
+ stack: this.stack,
78
+ };
79
+ }
80
+ }
81
+ /**
82
+ * User-friendly error messages
83
+ */
84
+ const USER_FRIENDLY_MESSAGES = {
85
+ [RujiraErrorCode.NETWORK_ERROR]: 'Network connection failed. Please check your internet connection.',
86
+ [RujiraErrorCode.RPC_ERROR]: 'Failed to communicate with the blockchain. Please try again.',
87
+ [RujiraErrorCode.TIMEOUT]: 'Request timed out. Please try again.',
88
+ [RujiraErrorCode.NOT_CONNECTED]: 'Not connected to the network. Please connect first.',
89
+ [RujiraErrorCode.INVALID_ASSET]: 'Invalid asset. Please check the asset identifier.',
90
+ [RujiraErrorCode.INVALID_AMOUNT]: 'Invalid amount. Please enter a valid number.',
91
+ [RujiraErrorCode.INVALID_ADDRESS]: 'Invalid address format.',
92
+ [RujiraErrorCode.INVALID_PAIR]: 'Trading pair not found or not supported.',
93
+ [RujiraErrorCode.INVALID_SLIPPAGE]: 'Invalid slippage tolerance. Must be between 0.01% and 50%.',
94
+ [RujiraErrorCode.INSUFFICIENT_BALANCE]: 'Insufficient balance for this transaction.',
95
+ [RujiraErrorCode.INSUFFICIENT_GAS]: 'Insufficient RUNE for gas fees.',
96
+ [RujiraErrorCode.NO_ROUTE]: 'No swap route available for this pair.',
97
+ [RujiraErrorCode.SLIPPAGE_EXCEEDED]: 'Price moved too much. Try increasing slippage tolerance.',
98
+ [RujiraErrorCode.QUOTE_EXPIRED]: 'Quote expired. Please get a new quote.',
99
+ [RujiraErrorCode.PRICE_IMPACT_TOO_HIGH]: 'Price impact is too high. Consider reducing the amount.',
100
+ [RujiraErrorCode.ORDER_NOT_FOUND]: 'Order not found.',
101
+ [RujiraErrorCode.INVALID_PRICE]: 'Invalid order price.',
102
+ [RujiraErrorCode.MIN_ORDER_SIZE]: 'Order size is below the minimum.',
103
+ [RujiraErrorCode.ORDER_ALREADY_FILLED]: 'Order has already been filled.',
104
+ [RujiraErrorCode.SIGNING_FAILED]: 'Failed to sign the transaction.',
105
+ [RujiraErrorCode.BROADCAST_FAILED]: 'Failed to broadcast the transaction.',
106
+ [RujiraErrorCode.TX_FAILED]: 'Transaction failed on chain.',
107
+ [RujiraErrorCode.TX_NOT_FOUND]: 'Transaction not found.',
108
+ [RujiraErrorCode.CONTRACT_NOT_FOUND]: 'Contract not found at the specified address.',
109
+ [RujiraErrorCode.CONTRACT_ERROR]: 'Contract execution failed.',
110
+ [RujiraErrorCode.INVALID_CONFIG]: 'Invalid configuration.',
111
+ [RujiraErrorCode.MISSING_SIGNER]: 'No signer provided. Connect a wallet first.',
112
+ };
113
+ /**
114
+ * Retryable error codes
115
+ */
116
+ const RETRYABLE_ERRORS = new Set([
117
+ RujiraErrorCode.NETWORK_ERROR,
118
+ RujiraErrorCode.RPC_ERROR,
119
+ RujiraErrorCode.TIMEOUT,
120
+ ]);
121
+ /**
122
+ * Check if an error is retryable
123
+ */
124
+ export function isRetryableError(error) {
125
+ if (error instanceof RujiraError) {
126
+ return error.retryable || RETRYABLE_ERRORS.has(error.code);
127
+ }
128
+ return false;
129
+ }
130
+ /**
131
+ * Wrap an error in RujiraError
132
+ */
133
+ export function wrapError(error, defaultCode = RujiraErrorCode.NETWORK_ERROR) {
134
+ if (error instanceof RujiraError) {
135
+ return error;
136
+ }
137
+ if (error instanceof Error) {
138
+ // 1. Check typed error classes (CosmJS TimeoutError, etc.)
139
+ if (error.name === 'TimeoutError' || error.constructor.name === 'TimeoutError') {
140
+ return new RujiraError(RujiraErrorCode.TIMEOUT, error.message, error, true);
141
+ }
142
+ // 2. Check error.code property (gRPC codes, Node.js error codes)
143
+ const errCode = error.code;
144
+ if (errCode !== undefined) {
145
+ if (errCode === 'ECONNREFUSED' || errCode === 'ENOTFOUND' || errCode === 'ECONNRESET') {
146
+ return new RujiraError(RujiraErrorCode.NETWORK_ERROR, error.message, error, true);
147
+ }
148
+ if (errCode === 'ETIMEDOUT' || errCode === 'ESOCKETTIMEDOUT') {
149
+ return new RujiraError(RujiraErrorCode.TIMEOUT, error.message, error, true);
150
+ }
151
+ // gRPC DEADLINE_EXCEEDED = 4
152
+ if (errCode === 4 || errCode === 'DEADLINE_EXCEEDED') {
153
+ return new RujiraError(RujiraErrorCode.TIMEOUT, error.message, error, true);
154
+ }
155
+ // gRPC NOT_FOUND = 5
156
+ if (errCode === 5 || errCode === 'NOT_FOUND') {
157
+ return new RujiraError(RujiraErrorCode.CONTRACT_NOT_FOUND, error.message, error);
158
+ }
159
+ // gRPC UNAVAILABLE = 14
160
+ if (errCode === 14 || errCode === 'UNAVAILABLE') {
161
+ return new RujiraError(RujiraErrorCode.RPC_ERROR, error.message, error, true);
162
+ }
163
+ }
164
+ // 3. String matching as last resort
165
+ const message = error.message.toLowerCase();
166
+ if (message.includes('insufficient funds') || message.includes('insufficient balance')) {
167
+ return new RujiraError(RujiraErrorCode.INSUFFICIENT_BALANCE, error.message, error);
168
+ }
169
+ if (message.includes('timeout') || message.includes('timed out')) {
170
+ return new RujiraError(RujiraErrorCode.TIMEOUT, error.message, error, true);
171
+ }
172
+ if (message.includes('slippage') || message.includes('min_return')) {
173
+ return new RujiraError(RujiraErrorCode.SLIPPAGE_EXCEEDED, error.message, error);
174
+ }
175
+ if (message.includes('out of gas')) {
176
+ return new RujiraError(RujiraErrorCode.INSUFFICIENT_GAS, error.message, error);
177
+ }
178
+ if (message.includes('not found') && message.includes('contract')) {
179
+ return new RujiraError(RujiraErrorCode.CONTRACT_NOT_FOUND, error.message, error);
180
+ }
181
+ return new RujiraError(defaultCode, error.message, error);
182
+ }
183
+ return new RujiraError(defaultCode, String(error), error);
184
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @vultisig/rujira - Rujira DEX Integration for Vultisig SDK
3
+ *
4
+ * A modular TypeScript SDK for interacting with Rujira DEX on THORChain.
5
+ * Designed for wallets, trading bots, and AI agents.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { RujiraClient, RujiraSwap } from '@vultisig/rujira';
10
+ *
11
+ * // Initialize client
12
+ * const client = new RujiraClient({ network: 'mainnet' });
13
+ * await client.connect();
14
+ *
15
+ * // Get a quote
16
+ * const quote = await client.swap.getQuote({
17
+ * fromAsset: 'THOR.RUNE',
18
+ * toAsset: 'BTC.BTC',
19
+ * amount: '100000000'
20
+ * });
21
+ *
22
+ * // Execute swap (with Vultisig signer)
23
+ * const result = await client.swap.execute(quote, { slippageBps: 100 });
24
+ * ```
25
+ *
26
+ * @packageDocumentation
27
+ */
28
+ export type { AssetName, EasyAsset, EasyQuoteResponse, EasyRoute, EasyRouteName, EasySwapRequest, } from './easy-routes.js';
29
+ export { ASSETS, EASY_ROUTES, findRoute, getRoute, getRoutesSummary, listEasyRoutes, routesForAsset, routesFrom, routesTo, } from './easy-routes.js';
30
+ export * from './config.js';
31
+ export * from './errors.js';
32
+ export * from './types.js';
33
+ export type { RujiraClientOptions } from './client.js';
34
+ export { RujiraClient } from './client.js';
35
+ export { RujiraAssets } from './modules/assets.js';
36
+ export { RujiraOrderbook } from './modules/orderbook.js';
37
+ export { RujiraSwap } from './modules/swap.js';
38
+ export type { RujiraSigner, VultisigVault } from './signer/types.js';
39
+ export { VultisigRujiraProvider } from './signer/vultisig-provider.js';
40
+ export * from './assets/index.js';
41
+ export * from './utils/format.js';
42
+ export * from './utils/memo.js';
43
+ export { RujiraDiscovery } from './discovery/discovery.js';
44
+ export { GraphQLClient } from './discovery/graphql-client.js';
45
+ export type { DiscoveredContracts, Market } from './discovery/types.js';
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,YAAY,EACV,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,eAAe,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,MAAM,EACN,WAAW,EACX,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,QAAQ,GACT,MAAM,kBAAkB,CAAA;AAGzB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAG1B,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAG9C,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAGtE,cAAc,mBAAmB,CAAA;AAGjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAG/B,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,YAAY,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @vultisig/rujira - Rujira DEX Integration for Vultisig SDK
3
+ *
4
+ * A modular TypeScript SDK for interacting with Rujira DEX on THORChain.
5
+ * Designed for wallets, trading bots, and AI agents.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { RujiraClient, RujiraSwap } from '@vultisig/rujira';
10
+ *
11
+ * // Initialize client
12
+ * const client = new RujiraClient({ network: 'mainnet' });
13
+ * await client.connect();
14
+ *
15
+ * // Get a quote
16
+ * const quote = await client.swap.getQuote({
17
+ * fromAsset: 'THOR.RUNE',
18
+ * toAsset: 'BTC.BTC',
19
+ * amount: '100000000'
20
+ * });
21
+ *
22
+ * // Execute swap (with Vultisig signer)
23
+ * const result = await client.swap.execute(quote, { slippageBps: 100 });
24
+ * ```
25
+ *
26
+ * @packageDocumentation
27
+ */
28
+ export { ASSETS, EASY_ROUTES, findRoute, getRoute, getRoutesSummary, listEasyRoutes, routesForAsset, routesFrom, routesTo, } from './easy-routes.js';
29
+ // CORE SDK
30
+ export * from './config.js';
31
+ export * from './errors.js';
32
+ export * from './types.js';
33
+ export { RujiraClient } from './client.js';
34
+ // Module exports
35
+ export { RujiraAssets } from './modules/assets.js';
36
+ export { RujiraOrderbook } from './modules/orderbook.js';
37
+ export { RujiraSwap } from './modules/swap.js';
38
+ export { VultisigRujiraProvider } from './signer/vultisig-provider.js';
39
+ // Asset registry (formerly @vultisig/assets)
40
+ export * from './assets/index.js';
41
+ // Utility exports
42
+ export * from './utils/format.js';
43
+ export * from './utils/memo.js';
44
+ // Discovery exports
45
+ export { RujiraDiscovery } from './discovery/discovery.js';
46
+ export { GraphQLClient } from './discovery/graphql-client.js';
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Assets module for managing Rujira assets
3
+ * @module modules/assets
4
+ */
5
+ import type { RujiraClient } from '../client.js';
6
+ import type { RujiraAsset, TradingPair } from '../types.js';
7
+ /**
8
+ * Assets module for querying asset information
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const client = new RujiraClient({ network: 'mainnet' });
13
+ * await client.connect();
14
+ *
15
+ * // Get all supported assets
16
+ * const assets = await client.assets.getAssets();
17
+ *
18
+ * // Get specific asset info
19
+ * const btc = await client.assets.getAsset('BTC.BTC');
20
+ * console.log(`BTC decimals: ${btc.decimals}`);
21
+ * ```
22
+ */
23
+ export declare class RujiraAssets {
24
+ private readonly client;
25
+ constructor(client: RujiraClient);
26
+ /**
27
+ * Get all supported assets
28
+ */
29
+ getAssets(): Promise<RujiraAsset[]>;
30
+ /**
31
+ * Get information about a specific asset
32
+ */
33
+ getAsset(assetFormat: string): Promise<RujiraAsset | null>;
34
+ /**
35
+ * Get available trading pairs
36
+ */
37
+ getTradingPairs(): Promise<TradingPair[]>;
38
+ /**
39
+ * Check if an asset is supported
40
+ */
41
+ isSupported(asset: string): boolean;
42
+ /**
43
+ * Get the denom for an asset
44
+ */
45
+ getDenom(asset: string): string | undefined;
46
+ /**
47
+ * Get decimals for an asset
48
+ */
49
+ getDecimals(asset: string): number | undefined;
50
+ /**
51
+ * Parse asset string to components
52
+ */
53
+ parseAsset(asset: string): {
54
+ chain: string;
55
+ symbol: string;
56
+ ticker: string;
57
+ contractAddress?: string;
58
+ };
59
+ /**
60
+ * Format asset string from components
61
+ */
62
+ formatAsset(chain: string, symbol: string): string;
63
+ /**
64
+ * Determine asset type
65
+ */
66
+ private getAssetType;
67
+ }
68
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/modules/assets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI3D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAEjD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAYzC;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAkBhE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAoB/C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKnC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK9C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG;QACzB,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,CAAC,EAAE,MAAM,CAAA;KACzB;IAID;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMlD;;OAEG;IACH,OAAO,CAAC,YAAY;CASrB"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Assets module for managing Rujira assets
3
+ * @module modules/assets
4
+ */
5
+ import { findAssetByFormat, KNOWN_ASSETS } from '../assets/index.js';
6
+ import { DEFAULT_MAKER_FEE, DEFAULT_TAKER_FEE } from '../config/constants.js';
7
+ import { parseAsset as sharedParseAsset } from '../utils/denom-conversion.js';
8
+ import { isFinAsset } from '../utils/type-guards.js';
9
+ /**
10
+ * Assets module for querying asset information
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const client = new RujiraClient({ network: 'mainnet' });
15
+ * await client.connect();
16
+ *
17
+ * // Get all supported assets
18
+ * const assets = await client.assets.getAssets();
19
+ *
20
+ * // Get specific asset info
21
+ * const btc = await client.assets.getAsset('BTC.BTC');
22
+ * console.log(`BTC decimals: ${btc.decimals}`);
23
+ * ```
24
+ */
25
+ export class RujiraAssets {
26
+ constructor(client) {
27
+ this.client = client;
28
+ }
29
+ /**
30
+ * Get all supported assets
31
+ */
32
+ async getAssets() {
33
+ return Object.values(KNOWN_ASSETS).filter(isFinAsset).map(asset => ({
34
+ asset: asset.formats.thorchain,
35
+ chain: asset.chain,
36
+ symbol: asset.formats.l1,
37
+ ticker: asset.id.toUpperCase(),
38
+ decimals: asset.decimals.fin,
39
+ type: this.getAssetType(asset.formats.thorchain),
40
+ denom: asset.formats.fin,
41
+ }));
42
+ }
43
+ /**
44
+ * Get information about a specific asset
45
+ */
46
+ async getAsset(assetFormat) {
47
+ const asset = findAssetByFormat(assetFormat);
48
+ if (!isFinAsset(asset)) {
49
+ return null;
50
+ }
51
+ return {
52
+ asset: asset.formats.thorchain,
53
+ chain: asset.chain,
54
+ symbol: asset.formats.l1,
55
+ ticker: asset.id.toUpperCase(),
56
+ decimals: asset.decimals.fin,
57
+ type: this.getAssetType(asset.formats.thorchain),
58
+ denom: asset.formats.fin,
59
+ };
60
+ }
61
+ /**
62
+ * Get available trading pairs
63
+ */
64
+ async getTradingPairs() {
65
+ // Return known pairs from config
66
+ const pairs = [];
67
+ const finContracts = this.client.config.contracts.finContracts;
68
+ for (const [pairKey, address] of Object.entries(finContracts)) {
69
+ const [base, quote] = pairKey.split('/');
70
+ pairs.push({
71
+ base,
72
+ quote,
73
+ contractAddress: address,
74
+ tick: '0.0001', // Would come from contract config
75
+ takerFee: DEFAULT_TAKER_FEE,
76
+ makerFee: DEFAULT_MAKER_FEE,
77
+ });
78
+ }
79
+ return pairs;
80
+ }
81
+ /**
82
+ * Check if an asset is supported
83
+ */
84
+ isSupported(asset) {
85
+ const found = findAssetByFormat(asset);
86
+ return isFinAsset(found);
87
+ }
88
+ /**
89
+ * Get the denom for an asset
90
+ */
91
+ getDenom(asset) {
92
+ const found = findAssetByFormat(asset);
93
+ return isFinAsset(found) ? found.formats.fin : undefined;
94
+ }
95
+ /**
96
+ * Get decimals for an asset
97
+ */
98
+ getDecimals(asset) {
99
+ const found = findAssetByFormat(asset);
100
+ return isFinAsset(found) ? found.decimals.fin : undefined;
101
+ }
102
+ /**
103
+ * Parse asset string to components
104
+ */
105
+ parseAsset(asset) {
106
+ return sharedParseAsset(asset);
107
+ }
108
+ /**
109
+ * Format asset string from components
110
+ */
111
+ formatAsset(chain, symbol) {
112
+ return `${chain}.${symbol}`;
113
+ }
114
+ // INTERNAL
115
+ /**
116
+ * Determine asset type
117
+ */
118
+ getAssetType(asset) {
119
+ if (asset === 'THOR.RUNE') {
120
+ return 'native';
121
+ }
122
+ if (asset.includes('/')) {
123
+ return 'synthetic';
124
+ }
125
+ return 'secured';
126
+ }
127
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Deposit module for securing L1 assets on THORChain
3
+ * @module modules/deposit
4
+ */
5
+ import type { RujiraClient } from '../client.js';
6
+ /**
7
+ * THORChain inbound address response
8
+ */
9
+ export type InboundAddress = {
10
+ chain: string;
11
+ pub_key: string;
12
+ address: string;
13
+ halted: boolean;
14
+ global_trading_paused: boolean;
15
+ chain_trading_paused: boolean;
16
+ chain_lp_actions_paused: boolean;
17
+ gas_rate: string;
18
+ gas_rate_units: string;
19
+ outbound_tx_size: string;
20
+ outbound_fee: string;
21
+ dust_threshold: string;
22
+ };
23
+ /**
24
+ * Prepared deposit transaction details
25
+ */
26
+ export type PreparedDeposit = {
27
+ /** L1 chain to send from */
28
+ chain: string;
29
+ /** Inbound vault address to send to */
30
+ inboundAddress: string;
31
+ /** Memo to include in the L1 transaction */
32
+ memo: string;
33
+ /** Amount to send (in L1 base units) */
34
+ amount: string;
35
+ /** Asset being deposited */
36
+ asset: string;
37
+ /** Resulting secured denom on THORChain */
38
+ resultingDenom: string;
39
+ /** Estimated confirmation time in minutes */
40
+ estimatedTimeMinutes: number;
41
+ /** Minimum amount (dust threshold) */
42
+ minimumAmount: string;
43
+ /** Recommended gas rate for the L1 transaction */
44
+ gasRate: string;
45
+ /** Gas rate units */
46
+ gasRateUnits: string;
47
+ /** Warning if chain is halted or paused */
48
+ warning?: string;
49
+ };
50
+ /**
51
+ * Deposit preparation parameters
52
+ */
53
+ export type DepositParams = {
54
+ /** L1 asset to deposit (e.g., 'BTC.BTC', 'ETH.ETH') */
55
+ fromAsset: string;
56
+ /** Amount in L1 base units */
57
+ amount: string;
58
+ /** THORChain address to receive secured assets */
59
+ thorAddress: string;
60
+ /** Optional: affiliate address for fee sharing */
61
+ affiliate?: string;
62
+ /** Optional: affiliate fee in basis points */
63
+ affiliateBps?: number;
64
+ };
65
+ /**
66
+ * Secured balance on THORChain
67
+ */
68
+ export type SecuredBalance = {
69
+ /** Secured denom (e.g., 'btc-btc') */
70
+ denom: string;
71
+ /** L1 asset (e.g., 'BTC.BTC') */
72
+ asset: string;
73
+ /** Amount in base units (raw) */
74
+ amount: string;
75
+ /** Human-readable amount (formatted with decimals) */
76
+ formatted: string;
77
+ /** Decimal places (always 8 for THORChain secured assets) */
78
+ decimals: number;
79
+ /** Symbol for display (e.g., 'BTC', 'ETH', 'USDC') */
80
+ symbol: string;
81
+ };
82
+ /**
83
+ * Deposit module for securing L1 assets on THORChain
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * const client = new RujiraClient({ network: 'mainnet' });
88
+ *
89
+ * // Prepare a BTC deposit
90
+ * const deposit = await client.deposit.prepare({
91
+ * fromAsset: 'BTC.BTC',
92
+ * amount: '1000000', // 0.01 BTC in sats
93
+ * thorAddress: 'thor1...'
94
+ * });
95
+ *
96
+ * // Use the returned details to send an L1 transaction
97
+ * console.log(`Send ${deposit.amount} to ${deposit.inboundAddress}`);
98
+ * console.log(`With memo: ${deposit.memo}`);
99
+ * ```
100
+ */
101
+ export declare class RujiraDeposit {
102
+ private readonly client;
103
+ private thornodeUrl;
104
+ private inboundCache;
105
+ private readonly CACHE_TTL_MS;
106
+ constructor(client: RujiraClient);
107
+ /**
108
+ * Prepare a deposit transaction
109
+ * Returns all details needed to send an L1 transaction
110
+ */
111
+ prepare(params: DepositParams): Promise<PreparedDeposit>;
112
+ /**
113
+ * Get secured balances for a THORChain address
114
+ */
115
+ getBalances(thorAddress: string): Promise<SecuredBalance[]>;
116
+ /**
117
+ * Get balance for a specific asset
118
+ */
119
+ getBalance(thorAddress: string, asset: string): Promise<SecuredBalance | null>;
120
+ /**
121
+ * Get inbound address for a specific chain
122
+ */
123
+ getInboundAddress(chain: string): Promise<InboundAddress | null>;
124
+ /**
125
+ * Get all inbound addresses
126
+ * @param forceRefresh Bypass cache and fetch fresh data (use before executing deposits)
127
+ */
128
+ getInboundAddresses(forceRefresh?: boolean): Promise<InboundAddress[]>;
129
+ /**
130
+ * Build deposit memo for L1 transaction
131
+ */
132
+ buildDepositMemo(thorAddress: string, affiliate?: string, affiliateBps?: number): string;
133
+ /**
134
+ * Estimate deposit confirmation time in minutes
135
+ */
136
+ estimateDepositTime(chain: string): number;
137
+ /**
138
+ * Get supported chains for deposits
139
+ */
140
+ getSupportedChains(): string[];
141
+ /**
142
+ * Check if a chain is supported
143
+ */
144
+ isChainSupported(chain: string): boolean;
145
+ /**
146
+ * Check if an asset can be deposited
147
+ */
148
+ canDeposit(asset: string): boolean;
149
+ private validateDepositParams;
150
+ private validateThorAddress;
151
+ }
152
+ //# sourceMappingURL=deposit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deposit.d.ts","sourceRoot":"","sources":["../../src/modules/deposit.ts"],"names":[],"mappings":"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"}