@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.
- package/README.md +154 -0
- package/dist/chains/bitcoin.d.ts +44 -0
- package/dist/chains/bitcoin.d.ts.map +1 -0
- package/dist/chains/bitcoin.js +152 -0
- package/dist/chains/bitcoin.js.map +1 -0
- package/dist/chains/ethereum.d.ts +60 -0
- package/dist/chains/ethereum.d.ts.map +1 -0
- package/dist/chains/ethereum.js +179 -0
- package/dist/chains/ethereum.js.map +1 -0
- package/dist/chains/solana.d.ts +48 -0
- package/dist/chains/solana.d.ts.map +1 -0
- package/dist/chains/solana.js +157 -0
- package/dist/chains/solana.js.map +1 -0
- package/dist/core/client.d.ts +123 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +311 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/types.d.ts +150 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/errors.d.ts +26 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +53 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/http.d.ts +23 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +64 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/websocket.d.ts +45 -0
- package/dist/utils/websocket.d.ts.map +1 -0
- package/dist/utils/websocket.js +130 -0
- package/dist/utils/websocket.js.map +1 -0
- package/dist/wallet/wallet.d.ts +144 -0
- package/dist/wallet/wallet.d.ts.map +1 -0
- package/dist/wallet/wallet.js +254 -0
- package/dist/wallet/wallet.js.map +1 -0
- 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"}
|