@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,89 @@
1
+ /**
2
+ * Withdraw fee estimation service
3
+ * @module services/fee-estimator
4
+ */
5
+ import { FALLBACK_OUTBOUND_FEES } from '../config/constants.js';
6
+ import { parseAsset } from '../utils/denom-conversion.js';
7
+ import { thornodeRateLimiter } from '../utils/rate-limiter.js';
8
+ /** Maps chain ID to its native gas asset in THORChain format */
9
+ const CHAIN_GAS_ASSETS = {
10
+ BTC: 'BTC.BTC',
11
+ ETH: 'ETH.ETH',
12
+ BSC: 'BSC.BNB',
13
+ AVAX: 'AVAX.AVAX',
14
+ GAIA: 'GAIA.ATOM',
15
+ DOGE: 'DOGE.DOGE',
16
+ LTC: 'LTC.LTC',
17
+ BCH: 'BCH.BCH',
18
+ BASE: 'BASE.ETH',
19
+ TRON: 'TRON.TRX',
20
+ XRP: 'XRP.XRP',
21
+ };
22
+ /**
23
+ * Estimate the outbound fee for a withdrawal.
24
+ *
25
+ * Resolution order:
26
+ * 1. Fetch live outbound_fee from THORNode inbound_addresses
27
+ * 2. Fall back to hardcoded FALLBACK_OUTBOUND_FEES
28
+ * 3. For non-gas-asset tokens, convert via pool ratio
29
+ */
30
+ export async function estimateWithdrawFee(thornodeUrl, asset, _amount) {
31
+ const { chain } = parseAsset(asset);
32
+ let gasAssetOutboundFee = '0';
33
+ try {
34
+ const response = await thornodeRateLimiter.fetch(`${thornodeUrl}/thorchain/inbound_addresses`);
35
+ if (response.ok) {
36
+ const addresses = (await response.json());
37
+ const chainInfo = addresses.find((a) => a.chain === chain);
38
+ if (chainInfo?.outbound_fee) {
39
+ gasAssetOutboundFee = chainInfo.outbound_fee;
40
+ }
41
+ }
42
+ }
43
+ catch {
44
+ // ignore and fall back below
45
+ }
46
+ if (gasAssetOutboundFee === '0') {
47
+ gasAssetOutboundFee = FALLBACK_OUTBOUND_FEES[chain] || '0';
48
+ if (gasAssetOutboundFee !== '0') {
49
+ console.warn(`[RujiraWithdraw] Using hardcoded fallback gas fee for ${chain}: ${gasAssetOutboundFee}. ` +
50
+ 'THORNode inbound_addresses endpoint may be unreachable. Fee estimate may be stale.');
51
+ }
52
+ }
53
+ // For native gas assets (e.g. BTC.BTC, BSC.BNB), the outbound fee is directly the gas fee
54
+ const gasAsset = CHAIN_GAS_ASSETS[chain] || `${chain}.${chain}`;
55
+ if (asset.toUpperCase() === gasAsset) {
56
+ return gasAssetOutboundFee;
57
+ }
58
+ // For non-gas tokens, convert fee via pool ratios
59
+ try {
60
+ const gasPoolAsset = gasAsset;
61
+ const [gasPoolResp, targetPoolResp] = await Promise.all([
62
+ thornodeRateLimiter.fetch(`${thornodeUrl}/thorchain/pool/${gasPoolAsset}`),
63
+ thornodeRateLimiter.fetch(`${thornodeUrl}/thorchain/pool/${asset.toUpperCase()}`),
64
+ ]);
65
+ if (!gasPoolResp.ok || !targetPoolResp.ok) {
66
+ return gasAssetOutboundFee;
67
+ }
68
+ const gasPool = (await gasPoolResp.json());
69
+ const targetPool = (await targetPoolResp.json());
70
+ const gasFee = BigInt(gasAssetOutboundFee);
71
+ const gasBalAsset = BigInt(gasPool.balance_asset);
72
+ const gasBalRune = BigInt(gasPool.balance_rune);
73
+ const tgtBalAsset = BigInt(targetPool.balance_asset);
74
+ const tgtBalRune = BigInt(targetPool.balance_rune);
75
+ if (gasFee === 0n ||
76
+ gasBalAsset === 0n ||
77
+ gasBalRune === 0n ||
78
+ tgtBalAsset === 0n ||
79
+ tgtBalRune === 0n) {
80
+ return gasAssetOutboundFee;
81
+ }
82
+ const runeFee = (gasFee * gasBalRune) / gasBalAsset;
83
+ const assetFee = (runeFee * tgtBalAsset) / tgtBalRune;
84
+ return assetFee.toString();
85
+ }
86
+ catch {
87
+ return gasAssetOutboundFee;
88
+ }
89
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Price impact calculation for swap quotes
3
+ * @module services/price-impact
4
+ */
5
+ import type { OrderBook } from '../types.js';
6
+ /**
7
+ * Calculate price impact for a swap using orderbook data when available.
8
+ * Falls back to heuristic estimates when orderbook data is unavailable.
9
+ */
10
+ export declare function calculatePriceImpact(inputAmount: string, outputAmount: string, orderbook: OrderBook | null): string;
11
+ //# sourceMappingURL=price-impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price-impact.d.ts","sourceRoot":"","sources":["../../src/services/price-impact.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,SAAS,GAAG,IAAI,GAC1B,MAAM,CA6CR"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Price impact calculation for swap quotes
3
+ * @module services/price-impact
4
+ */
5
+ import Big from 'big.js';
6
+ import { LARGE_SWAP_THRESHOLD } from '../config/constants.js';
7
+ /**
8
+ * Calculate price impact for a swap using orderbook data when available.
9
+ * Falls back to heuristic estimates when orderbook data is unavailable.
10
+ */
11
+ export function calculatePriceImpact(inputAmount, outputAmount, orderbook) {
12
+ if (!orderbook) {
13
+ return estimatePriceImpactWithoutOrderbook(inputAmount);
14
+ }
15
+ const bestBid = orderbook.bids[0]?.price;
16
+ const bestAsk = orderbook.asks[0]?.price;
17
+ if (!bestBid || !bestAsk) {
18
+ return estimatePriceImpactWithoutOrderbook(inputAmount);
19
+ }
20
+ const bidPrice = Big(bestBid);
21
+ const askPrice = Big(bestAsk);
22
+ if (bidPrice.lte(0) || askPrice.lte(0)) {
23
+ return '0';
24
+ }
25
+ const midPrice = bidPrice.plus(askPrice).div(2);
26
+ const input = Big(inputAmount);
27
+ const output = Big(outputAmount);
28
+ if (input.lte(0) || output.lte(0)) {
29
+ return '0';
30
+ }
31
+ // execution_price = output / input
32
+ const executionPrice = output.div(input);
33
+ // Detect unit mismatch from reversed-pair contract
34
+ const ratio = executionPrice.div(midPrice);
35
+ if (ratio.gt(100) || ratio.lt(0.01)) {
36
+ return 'unknown';
37
+ }
38
+ // impact = abs((execution_price - midPrice) / midPrice) * 100
39
+ const impact = executionPrice.minus(midPrice).div(midPrice).abs().mul(100);
40
+ if (impact.gt(50)) {
41
+ return '50.00';
42
+ }
43
+ return impact.toFixed(4);
44
+ }
45
+ /**
46
+ * Estimate price impact heuristically when orderbook data is unavailable.
47
+ */
48
+ function estimatePriceImpactWithoutOrderbook(inputAmount) {
49
+ const amount = BigInt(inputAmount);
50
+ if (amount >= LARGE_SWAP_THRESHOLD) {
51
+ return 'unknown';
52
+ }
53
+ const mediumSwapThreshold = BigInt('100000000000');
54
+ if (amount >= mediumSwapThreshold) {
55
+ return '2.0-5.0';
56
+ }
57
+ return '1.0-3.0';
58
+ }
@@ -0,0 +1,3 @@
1
+ export type { ExtendedAccountData, KeysignPayload, RujiraSigner, SignDirectInput, SigningPayload, SigningResult, VultisigChain, VultisigSignature, VultisigVault, } from './types.js';
2
+ export { isVultisigVault, VultisigRujiraProvider } from './vultisig-provider.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signer/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1 @@
1
+ export { isVultisigVault, VultisigRujiraProvider } from './vultisig-provider.js';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Keysign payload builder for withdrawal transactions
3
+ * @module signer/keysign-builder
4
+ */
5
+ import type { PreparedWithdraw } from '../modules/withdraw.js';
6
+ import type { KeysignPayload, VultisigVault } from './types.js';
7
+ export type KeysignBuildParams = {
8
+ vault: VultisigVault;
9
+ senderAddress: string;
10
+ prepared: PreparedWithdraw;
11
+ accountInfo: {
12
+ accountNumber: string;
13
+ sequence: string;
14
+ };
15
+ fee: bigint;
16
+ };
17
+ /**
18
+ * Build a keysign payload for a withdrawal transaction.
19
+ */
20
+ export declare function buildWithdrawalKeysignPayload(params: KeysignBuildParams): Promise<KeysignPayload>;
21
+ //# sourceMappingURL=keysign-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keysign-builder.d.ts","sourceRoot":"","sources":["../../src/signer/keysign-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAG9D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,aAAa,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,WAAW,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACxD,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAsGvG"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Keysign payload builder for withdrawal transactions
3
+ * @module signer/keysign-builder
4
+ */
5
+ import { create } from '@bufbuild/protobuf';
6
+ import { KeysignPayloadSchema } from '@vultisig/sdk';
7
+ import { THORCHAIN_TO_SDK_CHAIN } from '../config.js';
8
+ import { THORCHAIN_DECIMALS } from '../config/constants.js';
9
+ import { parseAsset } from '../utils/denom-conversion.js';
10
+ import { base64Encode } from '../utils/encoding.js';
11
+ /**
12
+ * Build a keysign payload for a withdrawal transaction.
13
+ */
14
+ export async function buildWithdrawalKeysignPayload(params) {
15
+ const { vault, senderAddress, prepared, accountInfo, fee } = params;
16
+ const { chain: thorchainChainId, symbol: fullSymbol } = parseAsset(prepared.asset);
17
+ const ticker = fullSymbol.split('-')[0] || fullSymbol;
18
+ const l1Chain = THORCHAIN_TO_SDK_CHAIN[thorchainChainId] || thorchainChainId;
19
+ const basePayload = await vault.prepareSignDirectTx({
20
+ chain: 'THORChain',
21
+ coin: {
22
+ chain: 'THORChain',
23
+ address: senderAddress,
24
+ decimals: THORCHAIN_DECIMALS,
25
+ ticker: 'RUNE',
26
+ },
27
+ bodyBytes: base64Encode('dummy'),
28
+ authInfoBytes: base64Encode('dummy'),
29
+ chainId: 'thorchain-1',
30
+ accountNumber: accountInfo.accountNumber,
31
+ memo: prepared.memo,
32
+ }, { skipChainSpecificFetch: true });
33
+ const derivedPublicKey = basePayload.coin?.hexPublicKey || vault.publicKeys.ecdsa;
34
+ const contractAddress = fullSymbol.includes('-') ? fullSymbol.split('-')[1]?.toUpperCase() || '' : '';
35
+ const keysignPayload = create(KeysignPayloadSchema, {
36
+ coin: {
37
+ chain: 'THORChain',
38
+ ticker: 'RUNE',
39
+ address: senderAddress,
40
+ contractAddress: '',
41
+ decimals: THORCHAIN_DECIMALS,
42
+ priceProviderId: '',
43
+ isNativeToken: true,
44
+ hexPublicKey: derivedPublicKey,
45
+ logo: '',
46
+ },
47
+ toAddress: '',
48
+ toAmount: prepared.amount,
49
+ blockchainSpecific: {
50
+ case: 'thorchainSpecific',
51
+ value: {
52
+ accountNumber: BigInt(accountInfo.accountNumber),
53
+ sequence: BigInt(accountInfo.sequence),
54
+ fee: fee,
55
+ isDeposit: true,
56
+ transactionType: 0,
57
+ },
58
+ },
59
+ memo: prepared.memo,
60
+ vaultPublicKeyEcdsa: vault.publicKeys.ecdsa,
61
+ vaultLocalPartyId: basePayload.vaultLocalPartyId || '',
62
+ libType: basePayload.libType || 'GG20',
63
+ utxoInfo: [],
64
+ swapPayload: {
65
+ case: 'thorchainSwapPayload',
66
+ value: {
67
+ fromAddress: senderAddress,
68
+ fromCoin: {
69
+ chain: l1Chain,
70
+ ticker: ticker,
71
+ contractAddress: contractAddress,
72
+ decimals: THORCHAIN_DECIMALS,
73
+ address: '',
74
+ priceProviderId: '',
75
+ isNativeToken: fullSymbol === ticker,
76
+ hexPublicKey: '',
77
+ logo: '',
78
+ },
79
+ toCoin: {
80
+ chain: l1Chain,
81
+ ticker: ticker,
82
+ contractAddress: contractAddress,
83
+ decimals: THORCHAIN_DECIMALS,
84
+ address: prepared.destination,
85
+ priceProviderId: '',
86
+ isNativeToken: false,
87
+ hexPublicKey: '',
88
+ logo: '',
89
+ },
90
+ vaultAddress: '',
91
+ routerAddress: '',
92
+ fromAmount: prepared.amount,
93
+ toAmountDecimal: '0',
94
+ toAmountLimit: '0',
95
+ streamingInterval: '0',
96
+ streamingQuantity: '0',
97
+ expirationTime: BigInt(0),
98
+ isAffiliate: false,
99
+ fee: '0',
100
+ },
101
+ },
102
+ contractPayload: { case: undefined, value: undefined },
103
+ signData: { case: undefined, value: undefined },
104
+ });
105
+ return keysignPayload;
106
+ }
@@ -0,0 +1,81 @@
1
+ import type { AccountData, DirectSignResponse, OfflineDirectSigner } from '@cosmjs/proto-signing';
2
+ type SignDoc = Parameters<OfflineDirectSigner['signDirect']>[1];
3
+ export type RujiraSigner = {
4
+ getAccounts(): Promise<readonly AccountData[]>;
5
+ signDirect(signerAddress: string, signDoc: SignDoc): Promise<DirectSignResponse>;
6
+ } & OfflineDirectSigner;
7
+ export type VultisigChain = 'THORChain' | 'MayaChain' | string;
8
+ export type VultisigSignature = {
9
+ signature: string;
10
+ recovery?: number;
11
+ format: 'DER' | 'ECDSA' | 'EdDSA' | 'Ed25519';
12
+ };
13
+ export type SignDirectInput = {
14
+ chain: VultisigChain;
15
+ coin: {
16
+ chain: VultisigChain;
17
+ address: string;
18
+ decimals: number;
19
+ ticker: string;
20
+ };
21
+ bodyBytes: string;
22
+ authInfoBytes: string;
23
+ chainId: string;
24
+ accountNumber: string;
25
+ memo?: string;
26
+ };
27
+ export type SigningPayload = {
28
+ transaction: KeysignPayload;
29
+ chain: VultisigChain;
30
+ messageHashes: string[];
31
+ };
32
+ import type { KeysignPayload } from '@vultisig/sdk';
33
+ export type { KeysignPayload };
34
+ export type VultisigVault = {
35
+ address(chain: VultisigChain): Promise<string>;
36
+ readonly publicKeys: {
37
+ readonly ecdsa: string;
38
+ readonly eddsa: string;
39
+ };
40
+ prepareSignDirectTx(input: SignDirectInput, options?: {
41
+ skipChainSpecificFetch?: boolean;
42
+ }): Promise<KeysignPayload>;
43
+ extractMessageHashes(keysignPayload: KeysignPayload): Promise<string[]>;
44
+ sign(payload: SigningPayload, options?: {
45
+ signal?: AbortSignal;
46
+ }): Promise<VultisigSignature>;
47
+ broadcastTx(params: {
48
+ chain: VultisigChain;
49
+ keysignPayload: KeysignPayload;
50
+ signature: VultisigSignature;
51
+ }): Promise<string>;
52
+ };
53
+ /**
54
+ * Vault with full withdraw capabilities (sign + broadcast).
55
+ * Used by RujiraWithdraw to execute MsgDeposit-based withdrawals.
56
+ */
57
+ export type WithdrawCapableVault = {
58
+ extractMessageHashes(keysignPayload: KeysignPayload): Promise<string[]>;
59
+ sign(payload: SigningPayload, options?: {
60
+ signal?: AbortSignal;
61
+ }): Promise<VultisigSignature>;
62
+ broadcastTx(params: {
63
+ chain: VultisigChain;
64
+ keysignPayload: KeysignPayload;
65
+ signature: VultisigSignature;
66
+ }): Promise<string>;
67
+ } & VultisigVault;
68
+ /**
69
+ * Type guard: checks if a VultisigVault satisfies WithdrawCapableVault
70
+ */
71
+ export declare function isWithdrawCapable(vault: VultisigVault): vault is WithdrawCapableVault;
72
+ export type ExtendedAccountData = {
73
+ accountNumber?: number;
74
+ sequence?: number;
75
+ } & AccountData;
76
+ export type SigningResult = {
77
+ signedTxBytes: Uint8Array;
78
+ signature: Uint8Array;
79
+ pubKey: Uint8Array;
80
+ };
81
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/signer/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Type guard: checks if a VultisigVault satisfies WithdrawCapableVault
3
+ */
4
+ export function isWithdrawCapable(vault) {
5
+ return (typeof vault.extractMessageHashes === 'function' &&
6
+ typeof vault.sign === 'function' &&
7
+ typeof vault.broadcastTx === 'function');
8
+ }
@@ -0,0 +1,33 @@
1
+ import type { AccountData, DirectSignResponse } from '@cosmjs/proto-signing';
2
+ import type { RujiraSigner, VultisigVault } from './types.js';
3
+ type SignDoc = {
4
+ bodyBytes: Uint8Array;
5
+ authInfoBytes: Uint8Array;
6
+ chainId: string;
7
+ accountNumber: bigint;
8
+ };
9
+ export declare class VultisigRujiraProvider implements RujiraSigner {
10
+ private readonly vault;
11
+ private readonly chainId;
12
+ private cachedAddress;
13
+ private cachedChainPubKey;
14
+ constructor(vault: VultisigVault, chainId?: string);
15
+ getVault(): VultisigVault;
16
+ private getChainPublicKey;
17
+ getAccounts(): Promise<readonly AccountData[]>;
18
+ signDirect(signerAddress: string, signDoc: SignDoc): Promise<DirectSignResponse>;
19
+ private derToRaw;
20
+ private normalizeSignature;
21
+ getAddress(): Promise<string>;
22
+ getPublicKeyBytes(): Uint8Array;
23
+ getPublicKeyHex(): string;
24
+ getChainId(): string;
25
+ clearCache(): void;
26
+ signAndBroadcast(signDoc: SignDoc): Promise<string>;
27
+ private hexToBytes;
28
+ private hexToBase64;
29
+ private uint8ArrayToBase64;
30
+ }
31
+ export declare function isVultisigVault(vault: unknown): vault is VultisigVault;
32
+ export {};
33
+ //# sourceMappingURL=vultisig-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vultisig-provider.d.ts","sourceRoot":"","sources":["../../src/signer/vultisig-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAG5E,OAAO,KAAK,EAAE,YAAY,EAAqB,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhF,KAAK,OAAO,GAAG;IACb,SAAS,EAAE,UAAU,CAAA;IACrB,aAAa,EAAE,UAAU,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAQD,qBAAa,sBAAuB,YAAW,YAAY;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,iBAAiB,CAA0B;gBAEvC,KAAK,EAAE,aAAa,EAAE,OAAO,SAAgB;IAKzD,QAAQ,IAAI,aAAa;YAIX,iBAAiB;IAgCzB,WAAW,IAAI,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC;IAM9C,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkDtF,OAAO,CAAC,QAAQ;IAiChB,OAAO,CAAC,kBAAkB;IA+DpB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAOnC,iBAAiB,IAAI,UAAU;IAI/B,eAAe,IAAI,MAAM;IAIzB,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,IAAI;IAIZ,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCzD,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,kBAAkB;CAG3B;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAYtE"}