@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.
- package/CHANGELOG.md +23 -0
- package/README.md +254 -0
- package/dist/assets/amount.d.ts +80 -0
- package/dist/assets/amount.d.ts.map +1 -0
- package/dist/assets/amount.js +186 -0
- package/dist/assets/asset.d.ts +43 -0
- package/dist/assets/asset.d.ts.map +1 -0
- package/dist/assets/asset.js +1 -0
- package/dist/assets/formats.d.ts +54 -0
- package/dist/assets/formats.d.ts.map +1 -0
- package/dist/assets/formats.js +164 -0
- package/dist/assets/index.d.ts +27 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +45 -0
- package/dist/assets/registry.d.ts +37 -0
- package/dist/assets/registry.d.ts.map +1 -0
- package/dist/assets/registry.js +487 -0
- package/dist/assets/router.d.ts +44 -0
- package/dist/assets/router.d.ts.map +1 -0
- package/dist/assets/router.js +142 -0
- package/dist/client.d.ts +70 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +250 -0
- package/dist/config/constants.d.ts +25 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +36 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +72 -0
- package/dist/discovery/discovery.d.ts +39 -0
- package/dist/discovery/discovery.d.ts.map +1 -0
- package/dist/discovery/discovery.js +250 -0
- package/dist/discovery/graphql-client.d.ts +46 -0
- package/dist/discovery/graphql-client.d.ts.map +1 -0
- package/dist/discovery/graphql-client.js +137 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +7 -0
- package/dist/discovery/types.d.ts +62 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +5 -0
- package/dist/easy-routes.d.ts +216 -0
- package/dist/easy-routes.d.ts.map +1 -0
- package/dist/easy-routes.js +241 -0
- package/dist/errors.d.ts +65 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +184 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/modules/assets.d.ts +68 -0
- package/dist/modules/assets.d.ts.map +1 -0
- package/dist/modules/assets.js +127 -0
- package/dist/modules/deposit.d.ts +152 -0
- package/dist/modules/deposit.d.ts.map +1 -0
- package/dist/modules/deposit.js +233 -0
- package/dist/modules/index.d.ts +12 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +9 -0
- package/dist/modules/orderbook.d.ts +80 -0
- package/dist/modules/orderbook.d.ts.map +1 -0
- package/dist/modules/orderbook.js +320 -0
- package/dist/modules/swap.d.ts +48 -0
- package/dist/modules/swap.d.ts.map +1 -0
- package/dist/modules/swap.js +318 -0
- package/dist/modules/withdraw.d.ts +46 -0
- package/dist/modules/withdraw.d.ts.map +1 -0
- package/dist/modules/withdraw.js +218 -0
- package/dist/services/fee-estimator.d.ts +14 -0
- package/dist/services/fee-estimator.d.ts.map +1 -0
- package/dist/services/fee-estimator.js +89 -0
- package/dist/services/price-impact.d.ts +11 -0
- package/dist/services/price-impact.d.ts.map +1 -0
- package/dist/services/price-impact.js +58 -0
- package/dist/signer/index.d.ts +3 -0
- package/dist/signer/index.d.ts.map +1 -0
- package/dist/signer/index.js +1 -0
- package/dist/signer/keysign-builder.d.ts +21 -0
- package/dist/signer/keysign-builder.d.ts.map +1 -0
- package/dist/signer/keysign-builder.js +106 -0
- package/dist/signer/types.d.ts +81 -0
- package/dist/signer/types.d.ts.map +1 -0
- package/dist/signer/types.js +8 -0
- package/dist/signer/vultisig-provider.d.ts +33 -0
- package/dist/signer/vultisig-provider.d.ts.map +1 -0
- package/dist/signer/vultisig-provider.js +242 -0
- package/dist/types.d.ts +375 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/utils/cache.d.ts +87 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +124 -0
- package/dist/utils/denom-conversion.d.ts +47 -0
- package/dist/utils/denom-conversion.d.ts.map +1 -0
- package/dist/utils/denom-conversion.js +105 -0
- package/dist/utils/encoding.d.ts +17 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +55 -0
- package/dist/utils/format.d.ts +108 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +213 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/memo.d.ts +107 -0
- package/dist/utils/memo.d.ts.map +1 -0
- package/dist/utils/memo.js +190 -0
- package/dist/utils/rate-limiter.d.ts +38 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +67 -0
- package/dist/utils/type-guards.d.ts +22 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +27 -0
- package/dist/validation/address-validator.d.ts +15 -0
- package/dist/validation/address-validator.d.ts.map +1 -0
- package/dist/validation/address-validator.js +75 -0
- package/package.json +98 -0
- 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
|
+
}
|
package/dist/index.d.ts
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 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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"}
|