@sequence0/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +154 -0
  2. package/dist/chains/bitcoin.d.ts +44 -0
  3. package/dist/chains/bitcoin.d.ts.map +1 -0
  4. package/dist/chains/bitcoin.js +152 -0
  5. package/dist/chains/bitcoin.js.map +1 -0
  6. package/dist/chains/ethereum.d.ts +60 -0
  7. package/dist/chains/ethereum.d.ts.map +1 -0
  8. package/dist/chains/ethereum.js +179 -0
  9. package/dist/chains/ethereum.js.map +1 -0
  10. package/dist/chains/solana.d.ts +48 -0
  11. package/dist/chains/solana.d.ts.map +1 -0
  12. package/dist/chains/solana.js +157 -0
  13. package/dist/chains/solana.js.map +1 -0
  14. package/dist/core/client.d.ts +123 -0
  15. package/dist/core/client.d.ts.map +1 -0
  16. package/dist/core/client.js +311 -0
  17. package/dist/core/client.js.map +1 -0
  18. package/dist/core/types.d.ts +150 -0
  19. package/dist/core/types.d.ts.map +1 -0
  20. package/dist/core/types.js +8 -0
  21. package/dist/core/types.js.map +1 -0
  22. package/dist/index.d.ts +30 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +54 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/utils/errors.d.ts +26 -0
  27. package/dist/utils/errors.d.ts.map +1 -0
  28. package/dist/utils/errors.js +53 -0
  29. package/dist/utils/errors.js.map +1 -0
  30. package/dist/utils/http.d.ts +23 -0
  31. package/dist/utils/http.d.ts.map +1 -0
  32. package/dist/utils/http.js +64 -0
  33. package/dist/utils/http.js.map +1 -0
  34. package/dist/utils/websocket.d.ts +45 -0
  35. package/dist/utils/websocket.d.ts.map +1 -0
  36. package/dist/utils/websocket.js +130 -0
  37. package/dist/utils/websocket.js.map +1 -0
  38. package/dist/wallet/wallet.d.ts +144 -0
  39. package/dist/wallet/wallet.d.ts.map +1 -0
  40. package/dist/wallet/wallet.js +254 -0
  41. package/dist/wallet/wallet.js.map +1 -0
  42. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # @sequence0/sdk
2
+
3
+ > **Decentralized threshold signatures for any blockchain.**
4
+ > Create wallets, sign transactions, and broadcast to 60+ chains — no private keys required.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ npm install @sequence0/sdk
10
+ ```
11
+
12
+ ## Quick Start
13
+
14
+ ```typescript
15
+ import { Sequence0 } from '@sequence0/sdk';
16
+
17
+ // 1. Initialize the SDK
18
+ const s0 = new Sequence0({ network: 'mainnet' });
19
+
20
+ // 2. Create a threshold wallet (DKG ceremony with 24 agents)
21
+ const wallet = await s0.createWallet({ chain: 'ethereum' });
22
+ console.log('Address:', wallet.address);
23
+ console.log('Threshold:', wallet.threshold); // { t: 17, n: 24 }
24
+
25
+ // 3. Sign and send a transaction
26
+ const txHash = await wallet.sendTransaction({
27
+ to: '0xRecipientAddress',
28
+ value: '1000000000000000000', // 1 ETH in wei
29
+ });
30
+ console.log('TX Hash:', txHash);
31
+ ```
32
+
33
+ ## Features
34
+
35
+ | Feature | Description |
36
+ |---------|-------------|
37
+ | **Multi-Chain** | Ethereum, Bitcoin, Solana, Polygon, Arbitrum, Base, and 20+ more |
38
+ | **Threshold Signing** | FROST (t-of-n) — no single point of failure |
39
+ | **No Private Keys** | Keys are sharded across the agent network |
40
+ | **Real-Time Events** | WebSocket subscriptions for signing progress |
41
+ | **Chain Adapters** | Auto-builds chain-native transactions |
42
+
43
+ ## Supported Chains
44
+
45
+ ### EVM (secp256k1)
46
+ Ethereum, Polygon, Arbitrum, Optimism, Base, BSC, Avalanche
47
+
48
+ ### Non-EVM
49
+ Bitcoin (Schnorr/Taproot), Solana (Ed25519)
50
+
51
+ ## API Reference
52
+
53
+ ### `Sequence0` — Main Client
54
+
55
+ ```typescript
56
+ const s0 = new Sequence0({
57
+ network: 'mainnet', // 'mainnet' | 'testnet'
58
+ agentUrl: '...', // Agent node URL (optional)
59
+ apiKey: '...', // API key (optional)
60
+ timeout: 30000, // Request timeout (optional)
61
+ });
62
+ ```
63
+
64
+ #### Methods
65
+
66
+ | Method | Returns | Description |
67
+ |--------|---------|-------------|
68
+ | `createWallet(options)` | `Promise<Wallet>` | Create a new threshold wallet via DKG |
69
+ | `getWallet(walletId)` | `Promise<Wallet>` | Get an existing wallet |
70
+ | `listWallets()` | `Promise<WalletDetail[]>` | List all wallets |
71
+ | `requestSignature(walletId, message)` | `Promise<string>` | Submit a signing request (returns requestId) |
72
+ | `signAndWait(walletId, message, timeout?)` | `Promise<string>` | Sign and wait for result |
73
+ | `getStatus()` | `Promise<StatusResponse>` | Get network status |
74
+ | `health()` | `Promise<HealthResponse>` | Health check |
75
+ | `subscribe(walletId?)` | `Promise<WsClient>` | Subscribe to real-time events |
76
+ | `refreshKeys(walletId)` | `Promise<void>` | Proactive key rotation |
77
+
78
+ ### `Wallet` — Threshold Wallet
79
+
80
+ ```typescript
81
+ const wallet = await s0.createWallet({
82
+ chain: 'ethereum',
83
+ threshold: { t: 17, n: 24 }, // optional, default shown
84
+ curve: 'secp256k1', // auto-detected from chain
85
+ });
86
+ ```
87
+
88
+ #### Methods
89
+
90
+ | Method | Returns | Description |
91
+ |--------|---------|-------------|
92
+ | `sign(transaction)` | `Promise<SignedTransaction>` | Sign a transaction |
93
+ | `sendTransaction(transaction)` | `Promise<string>` | Sign + broadcast (returns tx hash) |
94
+ | `broadcast(signedTx)` | `Promise<string>` | Broadcast a signed transaction |
95
+ | `signMessage(message)` | `Promise<string>` | Sign a message (EIP-191 for EVM) |
96
+ | `signTypedData(typedData)` | `Promise<string>` | Sign EIP-712 typed data |
97
+ | `getBalance()` | `Promise<string>` | Get native token balance |
98
+ | `info()` | `Record<string, unknown>` | Get wallet summary |
99
+
100
+ ### Chain Adapters
101
+
102
+ Use chain adapters directly for advanced control:
103
+
104
+ ```typescript
105
+ import { EthereumAdapter, BitcoinAdapter, SolanaAdapter } from '@sequence0/sdk';
106
+
107
+ const eth = new EthereumAdapter('ethereum', 'https://eth.llamarpc.com');
108
+ const btc = new BitcoinAdapter('mainnet');
109
+ const sol = new SolanaAdapter('mainnet');
110
+ ```
111
+
112
+ ### WebSocket Events
113
+
114
+ ```typescript
115
+ const ws = await s0.subscribe('my-wallet-id');
116
+
117
+ ws.on('SigningStarted', (e) => console.log('Signing started:', e));
118
+ ws.on('SigningComplete', (e) => console.log('Signature:', e.signature));
119
+ ws.on('WalletCreated', (e) => console.log('New wallet:', e.public_key));
120
+ ws.on('FeeCollected', (e) => console.log('Fee collected:', e.tx_hash));
121
+ ws.on('Heartbeat', (e) => console.log('Peers:', e.connected_peers));
122
+ ```
123
+
124
+ ## Error Handling
125
+
126
+ ```typescript
127
+ import { Sequence0Error, DkgError, SigningError, TimeoutError } from '@sequence0/sdk';
128
+
129
+ try {
130
+ await wallet.sendTransaction({ to: '0x...', value: '100' });
131
+ } catch (e) {
132
+ if (e instanceof TimeoutError) {
133
+ console.log('Signing network busy, try again');
134
+ } else if (e instanceof SigningError) {
135
+ console.log('Signing failed:', e.message);
136
+ }
137
+ }
138
+ ```
139
+
140
+ ## Networks
141
+
142
+ | | Mainnet | Testnet |
143
+ |---|---|---|
144
+ | **Chain ID** | 800801 | 800800 |
145
+ | **RPC** | `https://rpc.sequence0.network` | `https://testnet-rpc.sequence0.network` |
146
+ | **Explorer** | `https://explorer.sequence0.network` | `https://testnet.sequence0.network` |
147
+
148
+ ## Economics
149
+
150
+ Signing fees are always paid in the **target chain's native token** (ETH on Ethereum, SOL on Solana, BTC on Bitcoin, etc.). Fees are collected by the FeeCollector contract and distributed to participating agents.
151
+
152
+ ## License
153
+
154
+ MIT © Sequence0 Network
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Bitcoin Chain Adapter
3
+ *
4
+ * Builds Bitcoin transactions, attaches Schnorr (Taproot) signatures,
5
+ * and broadcasts via public APIs (Blockstream / Mempool.space).
6
+ */
7
+ import { ChainAdapter, BtcTransaction } from '../core/types';
8
+ export declare class BitcoinAdapter implements ChainAdapter {
9
+ private apiUrl;
10
+ private isTestnet;
11
+ constructor(network?: 'mainnet' | 'testnet', apiUrl?: string);
12
+ getRpcUrl(): string;
13
+ /**
14
+ * Build an unsigned Bitcoin transaction
15
+ *
16
+ * Fetches UTXOs, selects inputs, constructs outputs, and returns
17
+ * the serialized unsigned transaction for Schnorr signing.
18
+ *
19
+ * @returns hex-encoded sighash for FROST signing
20
+ */
21
+ buildTransaction(tx: BtcTransaction, fromAddress: string): Promise<string>;
22
+ /**
23
+ * Attach a Schnorr signature to the unsigned transaction
24
+ */
25
+ attachSignature(unsignedTx: string, signature: string): Promise<string>;
26
+ /**
27
+ * Broadcast a signed transaction to the Bitcoin network
28
+ */
29
+ broadcast(signedTx: string): Promise<string>;
30
+ /**
31
+ * Get Bitcoin address balance in satoshis
32
+ */
33
+ getBalance(address: string): Promise<string>;
34
+ /** Fetch UTXOs for an address */
35
+ private fetchUtxos;
36
+ /** Get recommended fee rates */
37
+ getFeeRates(): Promise<{
38
+ fastest: number;
39
+ halfHour: number;
40
+ hour: number;
41
+ }>;
42
+ }
43
+ export declare function createBitcoinAdapter(network?: 'mainnet' | 'testnet'): BitcoinAdapter;
44
+ //# sourceMappingURL=bitcoin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitcoin.d.ts","sourceRoot":"","sources":["../../src/chains/bitcoin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAc7D,qBAAa,cAAe,YAAW,YAAY;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAU;gBAEf,OAAO,GAAE,SAAS,GAAG,SAAqB,EAAE,MAAM,CAAC,EAAE,MAAM;IAKvE,SAAS,IAAI,MAAM;IAInB;;;;;;;OAOG;IACG,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqDhF;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB7E;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBlD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYlD,iCAAiC;YACnB,UAAU;IAMxB,gCAAgC;IAC1B,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CASpF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,SAAS,GAAG,SAAqB,GAAG,cAAc,CAE/F"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * Bitcoin Chain Adapter
4
+ *
5
+ * Builds Bitcoin transactions, attaches Schnorr (Taproot) signatures,
6
+ * and broadcasts via public APIs (Blockstream / Mempool.space).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.BitcoinAdapter = void 0;
10
+ exports.createBitcoinAdapter = createBitcoinAdapter;
11
+ const errors_1 = require("../utils/errors");
12
+ const DEFAULT_API = 'https://mempool.space/api';
13
+ const TESTNET_API = 'https://mempool.space/testnet/api';
14
+ class BitcoinAdapter {
15
+ constructor(network = 'mainnet', apiUrl) {
16
+ this.isTestnet = network === 'testnet';
17
+ this.apiUrl = apiUrl || (this.isTestnet ? TESTNET_API : DEFAULT_API);
18
+ }
19
+ getRpcUrl() {
20
+ return this.apiUrl;
21
+ }
22
+ /**
23
+ * Build an unsigned Bitcoin transaction
24
+ *
25
+ * Fetches UTXOs, selects inputs, constructs outputs, and returns
26
+ * the serialized unsigned transaction for Schnorr signing.
27
+ *
28
+ * @returns hex-encoded sighash for FROST signing
29
+ */
30
+ async buildTransaction(tx, fromAddress) {
31
+ try {
32
+ // Fetch UTXOs
33
+ const utxos = await this.fetchUtxos(fromAddress);
34
+ if (utxos.length === 0) {
35
+ throw new Error('No UTXOs available');
36
+ }
37
+ // Select UTXOs to cover amount + fee
38
+ const feeRate = tx.feeRate || 10; // sat/vByte default
39
+ const estimatedSize = 150; // rough P2TR estimate
40
+ const fee = feeRate * estimatedSize;
41
+ const needed = tx.amount + fee;
42
+ let total = 0;
43
+ const selectedUtxos = [];
44
+ for (const utxo of utxos.sort((a, b) => b.value - a.value)) {
45
+ selectedUtxos.push(utxo);
46
+ total += utxo.value;
47
+ if (total >= needed)
48
+ break;
49
+ }
50
+ if (total < needed) {
51
+ throw new Error(`Insufficient balance: have ${total} sat, need ${needed} sat`);
52
+ }
53
+ // Construct a simplified transaction representation
54
+ // In production, bitcoinjs-lib would handle full serialization
55
+ const txData = {
56
+ inputs: selectedUtxos.map(u => ({
57
+ txid: u.txid,
58
+ vout: u.vout,
59
+ value: u.value,
60
+ })),
61
+ outputs: [
62
+ { address: tx.to, value: tx.amount },
63
+ ...(total - needed > 546 // dust threshold
64
+ ? [{ address: fromAddress, value: total - needed }]
65
+ : []),
66
+ ],
67
+ fee,
68
+ };
69
+ // Return hex-encoded transaction data for signing
70
+ return Buffer.from(JSON.stringify(txData)).toString('hex');
71
+ }
72
+ catch (e) {
73
+ throw new errors_1.ChainError(`Failed to build Bitcoin transaction: ${e.message}`, 'bitcoin');
74
+ }
75
+ }
76
+ /**
77
+ * Attach a Schnorr signature to the unsigned transaction
78
+ */
79
+ async attachSignature(unsignedTx, signature) {
80
+ try {
81
+ const txData = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
82
+ // In production: use bitcoinjs-lib to construct the witness with
83
+ // the Schnorr signature. For now, package the data together.
84
+ const signedTx = {
85
+ ...txData,
86
+ witness: [signature],
87
+ signed: true,
88
+ };
89
+ return Buffer.from(JSON.stringify(signedTx)).toString('hex');
90
+ }
91
+ catch (e) {
92
+ throw new errors_1.ChainError(`Failed to attach Bitcoin signature: ${e.message}`, 'bitcoin');
93
+ }
94
+ }
95
+ /**
96
+ * Broadcast a signed transaction to the Bitcoin network
97
+ */
98
+ async broadcast(signedTx) {
99
+ try {
100
+ const response = await fetch(`${this.apiUrl}/tx`, {
101
+ method: 'POST',
102
+ headers: { 'Content-Type': 'text/plain' },
103
+ body: signedTx,
104
+ });
105
+ if (!response.ok) {
106
+ const error = await response.text();
107
+ throw new Error(`Broadcast failed: ${error}`);
108
+ }
109
+ return await response.text(); // txid
110
+ }
111
+ catch (e) {
112
+ throw new errors_1.ChainError(`Failed to broadcast Bitcoin tx: ${e.message}`, 'bitcoin');
113
+ }
114
+ }
115
+ /**
116
+ * Get Bitcoin address balance in satoshis
117
+ */
118
+ async getBalance(address) {
119
+ try {
120
+ const response = await fetch(`${this.apiUrl}/address/${address}`);
121
+ const data = await response.json();
122
+ const confirmed = data.chain_stats?.funded_txo_sum - data.chain_stats?.spent_txo_sum || 0;
123
+ const unconfirmed = data.mempool_stats?.funded_txo_sum - data.mempool_stats?.spent_txo_sum || 0;
124
+ return (confirmed + unconfirmed).toString();
125
+ }
126
+ catch {
127
+ return '0';
128
+ }
129
+ }
130
+ /** Fetch UTXOs for an address */
131
+ async fetchUtxos(address) {
132
+ const response = await fetch(`${this.apiUrl}/address/${address}/utxo`);
133
+ if (!response.ok)
134
+ throw new Error('Failed to fetch UTXOs');
135
+ return (await response.json());
136
+ }
137
+ /** Get recommended fee rates */
138
+ async getFeeRates() {
139
+ const response = await fetch(`${this.apiUrl}/v1/fees/recommended`);
140
+ const data = await response.json();
141
+ return {
142
+ fastest: data.fastestFee,
143
+ halfHour: data.halfHourFee,
144
+ hour: data.hourFee,
145
+ };
146
+ }
147
+ }
148
+ exports.BitcoinAdapter = BitcoinAdapter;
149
+ function createBitcoinAdapter(network = 'mainnet') {
150
+ return new BitcoinAdapter(network);
151
+ }
152
+ //# sourceMappingURL=bitcoin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitcoin.js","sourceRoot":"","sources":["../../src/chains/bitcoin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Ethereum Chain Adapter
3
+ *
4
+ * Builds EVM transactions, attaches FROST signatures, and broadcasts
5
+ * via ethers.js JsonRpcProvider. Works with Ethereum, Polygon, Arbitrum,
6
+ * Optimism, Base, BSC, Avalanche — any EVM-compatible chain.
7
+ */
8
+ import { ChainAdapter, EvmTransaction } from '../core/types';
9
+ export declare class EthereumAdapter implements ChainAdapter {
10
+ private provider;
11
+ private chainName;
12
+ private chainId;
13
+ constructor(chain?: string, rpcUrl?: string);
14
+ getRpcUrl(): string;
15
+ /**
16
+ * Build an unsigned EVM transaction and serialize for signing
17
+ *
18
+ * @returns hex-encoded unsigned transaction hash (keccak256)
19
+ */
20
+ buildTransaction(tx: EvmTransaction, fromAddress: string): Promise<string>;
21
+ /**
22
+ * Attach a FROST-generated signature to the unsigned transaction
23
+ *
24
+ * @param unsignedTx - RLP-encoded unsigned transaction
25
+ * @param signature - hex-encoded 65-byte signature (r || s || v)
26
+ * @returns hex-encoded signed transaction ready for broadcast
27
+ */
28
+ attachSignature(unsignedTx: string, signature: string): Promise<string>;
29
+ /**
30
+ * Broadcast a signed transaction to the EVM chain
31
+ *
32
+ * @returns transaction hash
33
+ */
34
+ broadcast(signedTx: string): Promise<string>;
35
+ /**
36
+ * Get ETH/native token balance
37
+ *
38
+ * @returns balance in wei as string
39
+ */
40
+ getBalance(address: string): Promise<string>;
41
+ /** Estimate gas for a transaction */
42
+ estimateGas(tx: EvmTransaction, from: string): Promise<bigint>;
43
+ /** Get current gas price info */
44
+ getGasPrice(): Promise<{
45
+ maxFeePerGas: bigint;
46
+ maxPriorityFeePerGas: bigint;
47
+ }>;
48
+ /** Get current block number */
49
+ getBlockNumber(): Promise<number>;
50
+ /** Get transaction receipt */
51
+ getTransactionReceipt(hash: string): Promise<any>;
52
+ /** Wait for transaction confirmation */
53
+ waitForTransaction(hash: string, confirmations?: number): Promise<any>;
54
+ }
55
+ /** Convenience factory function */
56
+ export declare function createEthereumAdapter(rpcUrl?: string): EthereumAdapter;
57
+ export declare function createPolygonAdapter(rpcUrl?: string): EthereumAdapter;
58
+ export declare function createArbitrumAdapter(rpcUrl?: string): EthereumAdapter;
59
+ export declare function createBaseAdapter(rpcUrl?: string): EthereumAdapter;
60
+ //# sourceMappingURL=ethereum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethereum.d.ts","sourceRoot":"","sources":["../../src/chains/ethereum.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAyB7D,qBAAa,eAAgB,YAAW,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;gBAEZ,KAAK,GAAE,MAAmB,EAAE,MAAM,CAAC,EAAE,MAAM;IAOvD,SAAS,IAAI,MAAM;IAKnB;;;;OAIG;IACG,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4ChF;;;;;;OAMG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB7E;;;;OAIG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYlD;;;;OAIG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,qCAAqC;IAC/B,WAAW,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASpE,iCAAiC;IAC3B,WAAW,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAA;KAAE,CAAC;IAQpF,+BAA+B;IACzB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIvC,8BAA8B;IACxB,qBAAqB,CAAC,IAAI,EAAE,MAAM;IAIxC,wCAAwC;IAClC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,SAAI;CAG3D;AAED,mCAAmC;AACnC,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAEtE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAErE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAEtE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAElE"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * Ethereum Chain Adapter
4
+ *
5
+ * Builds EVM transactions, attaches FROST signatures, and broadcasts
6
+ * via ethers.js JsonRpcProvider. Works with Ethereum, Polygon, Arbitrum,
7
+ * Optimism, Base, BSC, Avalanche — any EVM-compatible chain.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.EthereumAdapter = void 0;
11
+ exports.createEthereumAdapter = createEthereumAdapter;
12
+ exports.createPolygonAdapter = createPolygonAdapter;
13
+ exports.createArbitrumAdapter = createArbitrumAdapter;
14
+ exports.createBaseAdapter = createBaseAdapter;
15
+ const ethers_1 = require("ethers");
16
+ const errors_1 = require("../utils/errors");
17
+ /** Default RPC URLs per EVM chain */
18
+ const DEFAULT_RPC = {
19
+ ethereum: 'https://eth.llamarpc.com',
20
+ polygon: 'https://polygon-rpc.com',
21
+ arbitrum: 'https://arb1.arbitrum.io/rpc',
22
+ optimism: 'https://mainnet.optimism.io',
23
+ base: 'https://mainnet.base.org',
24
+ bsc: 'https://bsc-dataseed.binance.org',
25
+ avalanche: 'https://api.avax.network/ext/bc/C/rpc',
26
+ };
27
+ /** Default chain IDs */
28
+ const CHAIN_IDS = {
29
+ ethereum: 1,
30
+ polygon: 137,
31
+ arbitrum: 42161,
32
+ optimism: 10,
33
+ base: 8453,
34
+ bsc: 56,
35
+ avalanche: 43114,
36
+ };
37
+ class EthereumAdapter {
38
+ constructor(chain = 'ethereum', rpcUrl) {
39
+ this.chainName = chain;
40
+ const url = rpcUrl || DEFAULT_RPC[chain] || DEFAULT_RPC.ethereum;
41
+ this.chainId = CHAIN_IDS[chain] || 1;
42
+ this.provider = new ethers_1.JsonRpcProvider(url);
43
+ }
44
+ getRpcUrl() {
45
+ // @ts-ignore - accessing internal URL
46
+ return this.provider._getConnection?.().url || '';
47
+ }
48
+ /**
49
+ * Build an unsigned EVM transaction and serialize for signing
50
+ *
51
+ * @returns hex-encoded unsigned transaction hash (keccak256)
52
+ */
53
+ async buildTransaction(tx, fromAddress) {
54
+ try {
55
+ // Auto-fill nonce
56
+ const nonce = tx.nonce ?? await this.provider.getTransactionCount(fromAddress, 'latest');
57
+ // Auto-fill gas
58
+ const feeData = await this.provider.getFeeData();
59
+ const gasLimit = tx.gasLimit
60
+ ? BigInt(tx.gasLimit)
61
+ : await this.provider.estimateGas({
62
+ from: fromAddress,
63
+ to: tx.to,
64
+ value: tx.value ? BigInt(tx.value) : 0n,
65
+ data: tx.data || '0x',
66
+ }).catch(() => 21000n);
67
+ // Build the transaction object
68
+ const txObj = {
69
+ to: tx.to,
70
+ value: tx.value ? BigInt(tx.value) : 0n,
71
+ data: tx.data || '0x',
72
+ nonce,
73
+ gasLimit,
74
+ chainId: tx.chainId || this.chainId,
75
+ type: 2, // EIP-1559
76
+ maxFeePerGas: tx.maxFeePerGas
77
+ ? BigInt(tx.maxFeePerGas)
78
+ : (feeData.maxFeePerGas || 30000000000n),
79
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas
80
+ ? BigInt(tx.maxPriorityFeePerGas)
81
+ : (feeData.maxPriorityFeePerGas || 1500000000n),
82
+ };
83
+ // Serialize unsigned TX and return the hash for signing
84
+ const unsignedTx = ethers_1.Transaction.from(txObj);
85
+ return unsignedTx.unsignedSerialized;
86
+ }
87
+ catch (e) {
88
+ throw new errors_1.ChainError(`Failed to build ${this.chainName} transaction: ${e.message}`, this.chainName);
89
+ }
90
+ }
91
+ /**
92
+ * Attach a FROST-generated signature to the unsigned transaction
93
+ *
94
+ * @param unsignedTx - RLP-encoded unsigned transaction
95
+ * @param signature - hex-encoded 65-byte signature (r || s || v)
96
+ * @returns hex-encoded signed transaction ready for broadcast
97
+ */
98
+ async attachSignature(unsignedTx, signature) {
99
+ try {
100
+ const sig = signature.startsWith('0x') ? signature.slice(2) : signature;
101
+ const r = '0x' + sig.slice(0, 64);
102
+ const s = '0x' + sig.slice(64, 128);
103
+ const v = parseInt(sig.slice(128, 130), 16) || 27;
104
+ const tx = ethers_1.Transaction.from(unsignedTx);
105
+ tx.signature = ethers_1.Signature.from({ r, s, v });
106
+ return tx.serialized;
107
+ }
108
+ catch (e) {
109
+ throw new errors_1.ChainError(`Failed to attach signature: ${e.message}`, this.chainName);
110
+ }
111
+ }
112
+ /**
113
+ * Broadcast a signed transaction to the EVM chain
114
+ *
115
+ * @returns transaction hash
116
+ */
117
+ async broadcast(signedTx) {
118
+ try {
119
+ const response = await this.provider.broadcastTransaction(signedTx);
120
+ return response.hash;
121
+ }
122
+ catch (e) {
123
+ throw new errors_1.ChainError(`Failed to broadcast on ${this.chainName}: ${e.message}`, this.chainName);
124
+ }
125
+ }
126
+ /**
127
+ * Get ETH/native token balance
128
+ *
129
+ * @returns balance in wei as string
130
+ */
131
+ async getBalance(address) {
132
+ const balance = await this.provider.getBalance(address);
133
+ return balance.toString();
134
+ }
135
+ /** Estimate gas for a transaction */
136
+ async estimateGas(tx, from) {
137
+ return this.provider.estimateGas({
138
+ from,
139
+ to: tx.to,
140
+ value: tx.value ? BigInt(tx.value) : 0n,
141
+ data: tx.data || '0x',
142
+ });
143
+ }
144
+ /** Get current gas price info */
145
+ async getGasPrice() {
146
+ const feeData = await this.provider.getFeeData();
147
+ return {
148
+ maxFeePerGas: feeData.maxFeePerGas || 30000000000n,
149
+ maxPriorityFeePerGas: feeData.maxPriorityFeePerGas || 1500000000n,
150
+ };
151
+ }
152
+ /** Get current block number */
153
+ async getBlockNumber() {
154
+ return this.provider.getBlockNumber();
155
+ }
156
+ /** Get transaction receipt */
157
+ async getTransactionReceipt(hash) {
158
+ return this.provider.getTransactionReceipt(hash);
159
+ }
160
+ /** Wait for transaction confirmation */
161
+ async waitForTransaction(hash, confirmations = 1) {
162
+ return this.provider.waitForTransaction(hash, confirmations);
163
+ }
164
+ }
165
+ exports.EthereumAdapter = EthereumAdapter;
166
+ /** Convenience factory function */
167
+ function createEthereumAdapter(rpcUrl) {
168
+ return new EthereumAdapter('ethereum', rpcUrl);
169
+ }
170
+ function createPolygonAdapter(rpcUrl) {
171
+ return new EthereumAdapter('polygon', rpcUrl);
172
+ }
173
+ function createArbitrumAdapter(rpcUrl) {
174
+ return new EthereumAdapter('arbitrum', rpcUrl);
175
+ }
176
+ function createBaseAdapter(rpcUrl) {
177
+ return new EthereumAdapter('base', rpcUrl);
178
+ }
179
+ //# sourceMappingURL=ethereum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethereum.js","sourceRoot":"","sources":["../../src/chains/ethereum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Solana Chain Adapter
3
+ *
4
+ * Builds Solana transactions, attaches Ed25519 signatures generated
5
+ * by the FROST threshold signing network, and broadcasts via
6
+ * @solana/web3.js Connection.
7
+ */
8
+ import { ChainAdapter, SolTransaction } from '../core/types';
9
+ export declare class SolanaAdapter implements ChainAdapter {
10
+ private connection;
11
+ private rpcUrl;
12
+ constructor(network?: 'mainnet' | 'devnet', rpcUrl?: string);
13
+ getRpcUrl(): string;
14
+ /**
15
+ * Build an unsigned Solana transaction
16
+ *
17
+ * Creates a SOL transfer instruction, fetches recent blockhash,
18
+ * and serializes the message for Ed25519 signing via FROST.
19
+ *
20
+ * @returns base64-encoded unsigned transaction message
21
+ */
22
+ buildTransaction(tx: SolTransaction, fromAddress: string): Promise<string>;
23
+ /**
24
+ * Attach an Ed25519 signature from FROST to the Solana transaction
25
+ */
26
+ attachSignature(unsignedTx: string, signature: string): Promise<string>;
27
+ /**
28
+ * Broadcast a signed Solana transaction
29
+ *
30
+ * @returns transaction signature (hash)
31
+ */
32
+ broadcast(signedTx: string): Promise<string>;
33
+ /**
34
+ * Get SOL balance in lamports
35
+ */
36
+ getBalance(address: string): Promise<string>;
37
+ /** Get SOL balance in SOL (human-readable) */
38
+ getBalanceSol(address: string): Promise<number>;
39
+ /** Get recent block height */
40
+ getSlot(): Promise<number>;
41
+ /** Get transaction details */
42
+ getTransaction(signature: string): Promise<any>;
43
+ /** Confirm transaction */
44
+ confirmTransaction(signature: string): Promise<any>;
45
+ }
46
+ export declare function createSolanaAdapter(rpcUrl?: string): SolanaAdapter;
47
+ export declare function createSolanaDevnetAdapter(rpcUrl?: string): SolanaAdapter;
48
+ //# sourceMappingURL=solana.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/chains/solana.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM7D,qBAAa,aAAc,YAAW,YAAY;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,SAAS,GAAG,QAAoB,EAAE,MAAM,CAAC,EAAE,MAAM;IAKtE,SAAS,IAAI,MAAM;IAInB;;;;;;;OAOG;IACG,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4ChF;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB7E;;;;OAIG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BlD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUlD,8CAA8C;IACxC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKrD,8BAA8B;IACxB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,8BAA8B;IACxB,cAAc,CAAC,SAAS,EAAE,MAAM;IAMtC,0BAA0B;IACpB,kBAAkB,CAAC,SAAS,EAAE,MAAM;CAQ7C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAElE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAExE"}