@satelink/sdk 0.2.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 +240 -0
- package/dist/adapters.d.ts +113 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +178 -0
- package/dist/adapters.js.map +1 -0
- package/dist/ai.d.ts +12 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +71 -0
- package/dist/ai.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/mev.d.ts +101 -0
- package/dist/mev.d.ts.map +1 -0
- package/dist/mev.js +133 -0
- package/dist/mev.js.map +1 -0
- package/dist/provider.d.ts +36 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +97 -0
- package/dist/provider.js.map +1 -0
- package/dist/rpc.d.ts +32 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +101 -0
- package/dist/rpc.js.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/eslint.config.js +1 -0
- package/package.json +71 -0
- package/src/adapters.ts +207 -0
- package/src/ai.ts +100 -0
- package/src/index.ts +43 -0
- package/src/mev.ts +213 -0
- package/src/provider.ts +134 -0
- package/src/rpc.ts +132 -0
- package/src/types.ts +73 -0
- package/tsconfig.json +19 -0
package/dist/mev.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MEV Relay Client
|
|
3
|
+
* L8-002: Satelink MEV private relay for searchers
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Private transaction submission
|
|
7
|
+
* - Bundle submission (Flashbots-compatible)
|
|
8
|
+
* - Bundle simulation (eth_callBundle)
|
|
9
|
+
* - Bundle status tracking
|
|
10
|
+
*/
|
|
11
|
+
export interface MevSubmitResult {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
txHash?: string;
|
|
14
|
+
bundleHash?: string;
|
|
15
|
+
provider?: string;
|
|
16
|
+
requestId?: string;
|
|
17
|
+
priceUsdt?: number;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface MevSimulationResult {
|
|
21
|
+
ok: boolean;
|
|
22
|
+
simulation?: {
|
|
23
|
+
bundleHash?: string;
|
|
24
|
+
coinbaseDiff?: string;
|
|
25
|
+
ethSentToCoinbase?: string;
|
|
26
|
+
gasFees?: string;
|
|
27
|
+
totalGasUsed?: number;
|
|
28
|
+
results?: unknown[];
|
|
29
|
+
};
|
|
30
|
+
profitable?: boolean;
|
|
31
|
+
latency_ms?: number;
|
|
32
|
+
fee_usdt?: number;
|
|
33
|
+
error?: string;
|
|
34
|
+
requestId?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface MevBundleStatus {
|
|
37
|
+
ok: boolean;
|
|
38
|
+
bundleHash: string;
|
|
39
|
+
status: 'pending' | 'pending_high_priority' | 'not_found' | 'unknown';
|
|
40
|
+
stats?: {
|
|
41
|
+
isSimulated?: boolean;
|
|
42
|
+
isSentToMiners?: boolean;
|
|
43
|
+
isHighPriority?: boolean;
|
|
44
|
+
simulatedAt?: string;
|
|
45
|
+
submittedAt?: string;
|
|
46
|
+
sentToMinersAt?: string;
|
|
47
|
+
};
|
|
48
|
+
fee_usdt?: number;
|
|
49
|
+
error?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface MevClientOptions {
|
|
52
|
+
apiKey: string;
|
|
53
|
+
baseUrl?: string;
|
|
54
|
+
chain?: 'ethereum' | 'polygon' | 'arbitrum';
|
|
55
|
+
}
|
|
56
|
+
export declare class SatelinkMEV {
|
|
57
|
+
private apiKey;
|
|
58
|
+
private baseUrl;
|
|
59
|
+
private chain;
|
|
60
|
+
constructor(options: MevClientOptions);
|
|
61
|
+
private getHeaders;
|
|
62
|
+
/**
|
|
63
|
+
* Submit a signed transaction to the private mempool
|
|
64
|
+
* Transaction is NOT broadcast publicly — goes directly to validators
|
|
65
|
+
*/
|
|
66
|
+
submitPrivateTransaction(signedTx: string): Promise<MevSubmitResult>;
|
|
67
|
+
/**
|
|
68
|
+
* Submit a bundle of transactions (Flashbots-compatible)
|
|
69
|
+
* All transactions execute atomically or none do
|
|
70
|
+
*/
|
|
71
|
+
submitBundle(txs: string[], options?: {
|
|
72
|
+
blockNumber?: string | number;
|
|
73
|
+
minTimestamp?: number;
|
|
74
|
+
maxTimestamp?: number;
|
|
75
|
+
}): Promise<MevSubmitResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Simulate a bundle without submitting (eth_callBundle)
|
|
78
|
+
* Use this to check profitability before paying for submission
|
|
79
|
+
*/
|
|
80
|
+
simulateBundle(txs: string[], options?: {
|
|
81
|
+
blockNumber?: string;
|
|
82
|
+
stateBlockNumber?: string;
|
|
83
|
+
}): Promise<MevSimulationResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Check if a bundle was included on-chain
|
|
86
|
+
*/
|
|
87
|
+
getBundleStatus(bundleHash: string, blockNumber?: string): Promise<MevBundleStatus>;
|
|
88
|
+
/**
|
|
89
|
+
* Get MEV relay status and stats
|
|
90
|
+
*/
|
|
91
|
+
getStatus(): Promise<unknown>;
|
|
92
|
+
/**
|
|
93
|
+
* Set the target chain for MEV operations
|
|
94
|
+
*/
|
|
95
|
+
setChain(chain: 'ethereum' | 'polygon' | 'arbitrum'): void;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create a Satelink MEV client
|
|
99
|
+
*/
|
|
100
|
+
export declare function createMevClient(options: MevClientOptions): SatelinkMEV;
|
|
101
|
+
//# sourceMappingURL=mev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mev.d.ts","sourceRoot":"","sources":["../src/mev.ts"],"names":[],"mappings":"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"}
|
package/dist/mev.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MEV Relay Client
|
|
3
|
+
* L8-002: Satelink MEV private relay for searchers
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Private transaction submission
|
|
7
|
+
* - Bundle submission (Flashbots-compatible)
|
|
8
|
+
* - Bundle simulation (eth_callBundle)
|
|
9
|
+
* - Bundle status tracking
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_BASE_URL = 'https://rpc.satelink.network';
|
|
12
|
+
export class SatelinkMEV {
|
|
13
|
+
apiKey;
|
|
14
|
+
baseUrl;
|
|
15
|
+
chain;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
if (!options.apiKey) {
|
|
18
|
+
throw new Error('MEV relay requires an API key');
|
|
19
|
+
}
|
|
20
|
+
this.apiKey = options.apiKey;
|
|
21
|
+
this.baseUrl = options.baseUrl || DEFAULT_BASE_URL;
|
|
22
|
+
this.chain = options.chain || 'ethereum';
|
|
23
|
+
}
|
|
24
|
+
getHeaders() {
|
|
25
|
+
return {
|
|
26
|
+
'Content-Type': 'application/json',
|
|
27
|
+
'X-API-Key': this.apiKey
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Submit a signed transaction to the private mempool
|
|
32
|
+
* Transaction is NOT broadcast publicly — goes directly to validators
|
|
33
|
+
*/
|
|
34
|
+
async submitPrivateTransaction(signedTx) {
|
|
35
|
+
const response = await fetch(`${this.baseUrl}/rpc/mev?chain=${this.chain}`, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: this.getHeaders(),
|
|
38
|
+
body: JSON.stringify({
|
|
39
|
+
jsonrpc: '2.0',
|
|
40
|
+
id: Date.now(),
|
|
41
|
+
method: 'eth_sendRawTransaction',
|
|
42
|
+
params: [signedTx]
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
const data = await response.json();
|
|
46
|
+
if (data.error) {
|
|
47
|
+
return { ok: false, error: data.error.message || data.error };
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
ok: true,
|
|
51
|
+
txHash: data.result,
|
|
52
|
+
provider: data._mev?.provider,
|
|
53
|
+
requestId: data._mev?.requestId,
|
|
54
|
+
priceUsdt: data._mev?.priceUsdt
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Submit a bundle of transactions (Flashbots-compatible)
|
|
59
|
+
* All transactions execute atomically or none do
|
|
60
|
+
*/
|
|
61
|
+
async submitBundle(txs, options = {}) {
|
|
62
|
+
const response = await fetch(`${this.baseUrl}/rpc/mev/bundle?chain=${this.chain}`, {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: this.getHeaders(),
|
|
65
|
+
body: JSON.stringify({
|
|
66
|
+
txs,
|
|
67
|
+
blockNumber: options.blockNumber,
|
|
68
|
+
minTimestamp: options.minTimestamp,
|
|
69
|
+
maxTimestamp: options.maxTimestamp
|
|
70
|
+
})
|
|
71
|
+
});
|
|
72
|
+
const data = await response.json();
|
|
73
|
+
if (!data.ok) {
|
|
74
|
+
return { ok: false, error: data.error || data.message };
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
ok: true,
|
|
78
|
+
bundleHash: data.bundleHash,
|
|
79
|
+
provider: data.provider,
|
|
80
|
+
requestId: data.requestId,
|
|
81
|
+
priceUsdt: data.priceUsdt
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Simulate a bundle without submitting (eth_callBundle)
|
|
86
|
+
* Use this to check profitability before paying for submission
|
|
87
|
+
*/
|
|
88
|
+
async simulateBundle(txs, options = {}) {
|
|
89
|
+
const response = await fetch(`${this.baseUrl}/rpc/mev/bundle/simulate`, {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
headers: this.getHeaders(),
|
|
92
|
+
body: JSON.stringify({
|
|
93
|
+
txs,
|
|
94
|
+
blockNumber: options.blockNumber,
|
|
95
|
+
stateBlockNumber: options.stateBlockNumber
|
|
96
|
+
})
|
|
97
|
+
});
|
|
98
|
+
return response.json();
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if a bundle was included on-chain
|
|
102
|
+
*/
|
|
103
|
+
async getBundleStatus(bundleHash, blockNumber) {
|
|
104
|
+
const url = new URL(`${this.baseUrl}/rpc/mev/bundle/${bundleHash}`);
|
|
105
|
+
if (blockNumber)
|
|
106
|
+
url.searchParams.set('blockNumber', blockNumber);
|
|
107
|
+
const response = await fetch(url.toString(), {
|
|
108
|
+
method: 'GET',
|
|
109
|
+
headers: this.getHeaders()
|
|
110
|
+
});
|
|
111
|
+
return response.json();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get MEV relay status and stats
|
|
115
|
+
*/
|
|
116
|
+
async getStatus() {
|
|
117
|
+
const response = await fetch(`${this.baseUrl}/rpc/mev/status`);
|
|
118
|
+
return response.json();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Set the target chain for MEV operations
|
|
122
|
+
*/
|
|
123
|
+
setChain(chain) {
|
|
124
|
+
this.chain = chain;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Create a Satelink MEV client
|
|
129
|
+
*/
|
|
130
|
+
export function createMevClient(options) {
|
|
131
|
+
return new SatelinkMEV(options);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=mev.js.map
|
package/dist/mev.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mev.js","sourceRoot":"","sources":["../src/mev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmDH,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AAExD,MAAM,OAAO,WAAW;IACd,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,KAAK,CAAS;IAEtB,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC;IAC3C,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,MAAM;SACzB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,wBAAwB,CAAC,QAAgB;QAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,IAAI,CAAC,KAAK,EAAE,EAAE;YAC1E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,CAAC,QAAQ,CAAC;aACnB,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChE,CAAC;QAED,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ;YAC7B,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS;YAC/B,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS;SAChC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAChB,GAAa,EACb,UAII,EAAE;QAEN,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,yBAAyB,IAAI,CAAC,KAAK,EAAE,EAAE;YACjF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG;gBACH,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1D,CAAC;QAED,OAAO;YACL,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,GAAa,EACb,UAGI,EAAE;QAEN,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,0BAA0B,EAAE;YACtE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG;gBACH,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;aAC3C,CAAC;SACH,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,WAAoB;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,UAAU,EAAE,CAAC,CAAC;QACpE,IAAI,WAAW;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAElE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAA0C;QACjD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EIP-1193 Compatible Provider
|
|
3
|
+
* S4-003: Standard Ethereum provider interface for Satelink RPC
|
|
4
|
+
*/
|
|
5
|
+
type RequestArguments = {
|
|
6
|
+
method: string;
|
|
7
|
+
params?: unknown[] | object;
|
|
8
|
+
};
|
|
9
|
+
type EventHandler = (...args: unknown[]) => void;
|
|
10
|
+
export interface EIP1193Provider {
|
|
11
|
+
request(args: RequestArguments): Promise<unknown>;
|
|
12
|
+
on(event: string, handler: EventHandler): void;
|
|
13
|
+
removeListener(event: string, handler: EventHandler): void;
|
|
14
|
+
}
|
|
15
|
+
export interface SatelinkProviderOptions {
|
|
16
|
+
chainId?: number;
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
baseUrl?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class SatelinkProvider implements EIP1193Provider {
|
|
21
|
+
private _chainId;
|
|
22
|
+
private _apiKey;
|
|
23
|
+
private _baseUrl;
|
|
24
|
+
private _listeners;
|
|
25
|
+
constructor(options?: SatelinkProviderOptions);
|
|
26
|
+
get chainId(): string;
|
|
27
|
+
get connected(): boolean;
|
|
28
|
+
request({ method, params }: RequestArguments): Promise<unknown>;
|
|
29
|
+
on(event: string, handler: EventHandler): void;
|
|
30
|
+
removeListener(event: string, handler: EventHandler): void;
|
|
31
|
+
private _emit;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
}
|
|
34
|
+
export declare function createSatelinkProvider(options?: SatelinkProviderOptions): SatelinkProvider;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,gBAAgB,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;CAC7B,CAAC;AAEF,KAAK,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/C,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5D;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,qBAAa,gBAAiB,YAAW,eAAe;IACtD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAA6C;gBAEnD,OAAO,GAAE,uBAA4B;IAMjD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0DrE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAO9C,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAI1D,OAAO,CAAC,KAAK;IAIb,UAAU,IAAI,IAAI;CAInB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB,CAE1F"}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EIP-1193 Compatible Provider
|
|
3
|
+
* S4-003: Standard Ethereum provider interface for Satelink RPC
|
|
4
|
+
*/
|
|
5
|
+
const CHAIN_MAP = {
|
|
6
|
+
1: 'ethereum',
|
|
7
|
+
137: 'polygon',
|
|
8
|
+
80002: 'polygon-amoy',
|
|
9
|
+
42161: 'arbitrum',
|
|
10
|
+
8453: 'base'
|
|
11
|
+
};
|
|
12
|
+
export class SatelinkProvider {
|
|
13
|
+
_chainId;
|
|
14
|
+
_apiKey;
|
|
15
|
+
_baseUrl;
|
|
16
|
+
_listeners = new Map();
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this._chainId = options.chainId || 137;
|
|
19
|
+
this._apiKey = options.apiKey || '';
|
|
20
|
+
this._baseUrl = options.baseUrl || 'https://rpc.satelink.network';
|
|
21
|
+
}
|
|
22
|
+
get chainId() {
|
|
23
|
+
return `0x${this._chainId.toString(16)}`;
|
|
24
|
+
}
|
|
25
|
+
get connected() {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
async request({ method, params }) {
|
|
29
|
+
if (method === 'eth_chainId') {
|
|
30
|
+
return this.chainId;
|
|
31
|
+
}
|
|
32
|
+
if (method === 'eth_accounts' || method === 'eth_requestAccounts') {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
if (method === 'wallet_switchEthereumChain') {
|
|
36
|
+
const chainIdHex = params?.[0]?.chainId;
|
|
37
|
+
if (chainIdHex) {
|
|
38
|
+
const newChainId = parseInt(chainIdHex, 16);
|
|
39
|
+
if (CHAIN_MAP[newChainId]) {
|
|
40
|
+
const oldChainId = this._chainId;
|
|
41
|
+
this._chainId = newChainId;
|
|
42
|
+
if (oldChainId !== newChainId) {
|
|
43
|
+
this._emit('chainChanged', this.chainId);
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
throw { code: 4902, message: 'Chain not supported' };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const chain = CHAIN_MAP[this._chainId] || 'polygon';
|
|
51
|
+
const url = `${this._baseUrl}/rpc/${chain}`;
|
|
52
|
+
const headers = {
|
|
53
|
+
'Content-Type': 'application/json'
|
|
54
|
+
};
|
|
55
|
+
if (this._apiKey) {
|
|
56
|
+
headers['X-API-Key'] = this._apiKey;
|
|
57
|
+
}
|
|
58
|
+
const response = await fetch(url, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers,
|
|
61
|
+
body: JSON.stringify({
|
|
62
|
+
jsonrpc: '2.0',
|
|
63
|
+
id: Date.now(),
|
|
64
|
+
method,
|
|
65
|
+
params: params || []
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
const data = await response.json();
|
|
69
|
+
if (data.error) {
|
|
70
|
+
throw {
|
|
71
|
+
code: data.error.code || -32000,
|
|
72
|
+
message: data.error.message || 'RPC error'
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return data.result;
|
|
76
|
+
}
|
|
77
|
+
on(event, handler) {
|
|
78
|
+
if (!this._listeners.has(event)) {
|
|
79
|
+
this._listeners.set(event, new Set());
|
|
80
|
+
}
|
|
81
|
+
this._listeners.get(event).add(handler);
|
|
82
|
+
}
|
|
83
|
+
removeListener(event, handler) {
|
|
84
|
+
this._listeners.get(event)?.delete(handler);
|
|
85
|
+
}
|
|
86
|
+
_emit(event, ...args) {
|
|
87
|
+
this._listeners.get(event)?.forEach(handler => handler(...args));
|
|
88
|
+
}
|
|
89
|
+
disconnect() {
|
|
90
|
+
this._emit('disconnect', { code: 1000, message: 'User disconnected' });
|
|
91
|
+
this._listeners.clear();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function createSatelinkProvider(options) {
|
|
95
|
+
return new SatelinkProvider(options);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SatelinkRPCOptions, TransactionRequest } from './types.js';
|
|
2
|
+
export declare class SatelinkRPC {
|
|
3
|
+
private apiKey?;
|
|
4
|
+
private chain;
|
|
5
|
+
private baseUrl;
|
|
6
|
+
private requestId;
|
|
7
|
+
constructor(options?: SatelinkRPCOptions);
|
|
8
|
+
private getNextId;
|
|
9
|
+
private getRpcUrl;
|
|
10
|
+
request<T = unknown>(method: string, params?: unknown[]): Promise<T>;
|
|
11
|
+
getBlockNumber(): Promise<bigint>;
|
|
12
|
+
getBalance(address: string, block?: string): Promise<bigint>;
|
|
13
|
+
getTransactionCount(address: string, block?: string): Promise<bigint>;
|
|
14
|
+
call(tx: TransactionRequest, block?: string): Promise<string>;
|
|
15
|
+
estimateGas(tx: TransactionRequest): Promise<bigint>;
|
|
16
|
+
getGasPrice(): Promise<bigint>;
|
|
17
|
+
sendRawTransaction(signedTx: string): Promise<string>;
|
|
18
|
+
getTransactionByHash(hash: string): Promise<unknown>;
|
|
19
|
+
getTransactionReceipt(hash: string): Promise<unknown>;
|
|
20
|
+
getBlockByNumber(block: string | number, fullTx?: boolean): Promise<unknown>;
|
|
21
|
+
getChainId(): Promise<bigint>;
|
|
22
|
+
setChain(chain: string): void;
|
|
23
|
+
toProvider(): EIP1193Provider;
|
|
24
|
+
}
|
|
25
|
+
export interface EIP1193Provider {
|
|
26
|
+
request: (args: {
|
|
27
|
+
method: string;
|
|
28
|
+
params?: unknown[];
|
|
29
|
+
}) => Promise<unknown>;
|
|
30
|
+
}
|
|
31
|
+
export declare function createProvider(options?: SatelinkRPCOptions): EIP1193Provider;
|
|
32
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAmC,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAK1G,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;gBAEV,OAAO,GAAE,kBAAuB;IAM5C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,SAAS;IAIX,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAmCxE,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAKjC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/E,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,KAAK,GAAE,MAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvE,WAAW,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAKpD,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnF,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,UAAU,IAAI,eAAe;CAO9B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,eAAe,CAGhF"}
|
package/dist/rpc.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
const DEFAULT_BASE_URL = 'https://rpc.satelink.network';
|
|
2
|
+
const DEFAULT_CHAIN = 'polygon';
|
|
3
|
+
export class SatelinkRPC {
|
|
4
|
+
apiKey;
|
|
5
|
+
chain;
|
|
6
|
+
baseUrl;
|
|
7
|
+
requestId = 0;
|
|
8
|
+
constructor(options = {}) {
|
|
9
|
+
this.apiKey = options.apiKey;
|
|
10
|
+
this.chain = options.chain || DEFAULT_CHAIN;
|
|
11
|
+
this.baseUrl = options.baseUrl || DEFAULT_BASE_URL;
|
|
12
|
+
}
|
|
13
|
+
getNextId() {
|
|
14
|
+
return ++this.requestId;
|
|
15
|
+
}
|
|
16
|
+
getRpcUrl() {
|
|
17
|
+
return `${this.baseUrl}/rpc/${this.chain}`;
|
|
18
|
+
}
|
|
19
|
+
async request(method, params = []) {
|
|
20
|
+
const body = {
|
|
21
|
+
jsonrpc: '2.0',
|
|
22
|
+
method,
|
|
23
|
+
params,
|
|
24
|
+
id: this.getNextId()
|
|
25
|
+
};
|
|
26
|
+
const headers = {
|
|
27
|
+
'Content-Type': 'application/json'
|
|
28
|
+
};
|
|
29
|
+
if (this.apiKey) {
|
|
30
|
+
headers['x-api-key'] = this.apiKey;
|
|
31
|
+
}
|
|
32
|
+
const response = await fetch(this.getRpcUrl(), {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers,
|
|
35
|
+
body: JSON.stringify(body)
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
throw new Error(`RPC request failed: ${response.status} ${response.statusText}`);
|
|
39
|
+
}
|
|
40
|
+
const data = await response.json();
|
|
41
|
+
if (data.error) {
|
|
42
|
+
throw new Error(`RPC error: ${data.error.message} (code: ${data.error.code})`);
|
|
43
|
+
}
|
|
44
|
+
return data.result;
|
|
45
|
+
}
|
|
46
|
+
async getBlockNumber() {
|
|
47
|
+
const result = await this.request('eth_blockNumber');
|
|
48
|
+
return BigInt(result);
|
|
49
|
+
}
|
|
50
|
+
async getBalance(address, block = 'latest') {
|
|
51
|
+
const result = await this.request('eth_getBalance', [address, block]);
|
|
52
|
+
return BigInt(result);
|
|
53
|
+
}
|
|
54
|
+
async getTransactionCount(address, block = 'latest') {
|
|
55
|
+
const result = await this.request('eth_getTransactionCount', [address, block]);
|
|
56
|
+
return BigInt(result);
|
|
57
|
+
}
|
|
58
|
+
async call(tx, block = 'latest') {
|
|
59
|
+
return this.request('eth_call', [tx, block]);
|
|
60
|
+
}
|
|
61
|
+
async estimateGas(tx) {
|
|
62
|
+
const result = await this.request('eth_estimateGas', [tx]);
|
|
63
|
+
return BigInt(result);
|
|
64
|
+
}
|
|
65
|
+
async getGasPrice() {
|
|
66
|
+
const result = await this.request('eth_gasPrice');
|
|
67
|
+
return BigInt(result);
|
|
68
|
+
}
|
|
69
|
+
async sendRawTransaction(signedTx) {
|
|
70
|
+
return this.request('eth_sendRawTransaction', [signedTx]);
|
|
71
|
+
}
|
|
72
|
+
async getTransactionByHash(hash) {
|
|
73
|
+
return this.request('eth_getTransactionByHash', [hash]);
|
|
74
|
+
}
|
|
75
|
+
async getTransactionReceipt(hash) {
|
|
76
|
+
return this.request('eth_getTransactionReceipt', [hash]);
|
|
77
|
+
}
|
|
78
|
+
async getBlockByNumber(block, fullTx = false) {
|
|
79
|
+
const blockParam = typeof block === 'number' ? `0x${block.toString(16)}` : block;
|
|
80
|
+
return this.request('eth_getBlockByNumber', [blockParam, fullTx]);
|
|
81
|
+
}
|
|
82
|
+
async getChainId() {
|
|
83
|
+
const result = await this.request('eth_chainId');
|
|
84
|
+
return BigInt(result);
|
|
85
|
+
}
|
|
86
|
+
setChain(chain) {
|
|
87
|
+
this.chain = chain;
|
|
88
|
+
}
|
|
89
|
+
toProvider() {
|
|
90
|
+
return {
|
|
91
|
+
request: async ({ method, params }) => {
|
|
92
|
+
return this.request(method, params || []);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function createProvider(options = {}) {
|
|
98
|
+
const rpc = new SatelinkRPC(options);
|
|
99
|
+
return rpc.toProvider();
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=rpc.js.map
|
package/dist/rpc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export interface SatelinkRPCOptions {
|
|
2
|
+
apiKey?: string;
|
|
3
|
+
chain?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SatelinkAIOptions {
|
|
7
|
+
apiKey: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface JsonRpcRequest {
|
|
11
|
+
jsonrpc: '2.0';
|
|
12
|
+
method: string;
|
|
13
|
+
params?: unknown[];
|
|
14
|
+
id: number | string;
|
|
15
|
+
}
|
|
16
|
+
export interface JsonRpcResponse<T = unknown> {
|
|
17
|
+
jsonrpc: '2.0';
|
|
18
|
+
id: number | string;
|
|
19
|
+
result?: T;
|
|
20
|
+
error?: {
|
|
21
|
+
code: number;
|
|
22
|
+
message: string;
|
|
23
|
+
data?: unknown;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface ChatMessage {
|
|
27
|
+
role: 'system' | 'user' | 'assistant';
|
|
28
|
+
content: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ChatCompletionOptions {
|
|
31
|
+
model?: string;
|
|
32
|
+
max_tokens?: number;
|
|
33
|
+
temperature?: number;
|
|
34
|
+
stream?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface ChatCompletionResponse {
|
|
37
|
+
id: string;
|
|
38
|
+
object: 'chat.completion';
|
|
39
|
+
created: number;
|
|
40
|
+
model: string;
|
|
41
|
+
choices: Array<{
|
|
42
|
+
index: number;
|
|
43
|
+
message: ChatMessage;
|
|
44
|
+
finish_reason: string;
|
|
45
|
+
}>;
|
|
46
|
+
usage: {
|
|
47
|
+
prompt_tokens: number;
|
|
48
|
+
completion_tokens: number;
|
|
49
|
+
total_tokens: number;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface Model {
|
|
53
|
+
id: string;
|
|
54
|
+
object: 'model';
|
|
55
|
+
owned_by: string;
|
|
56
|
+
created: number;
|
|
57
|
+
}
|
|
58
|
+
export interface TransactionRequest {
|
|
59
|
+
to?: string;
|
|
60
|
+
from?: string;
|
|
61
|
+
data?: string;
|
|
62
|
+
value?: string;
|
|
63
|
+
gas?: string;
|
|
64
|
+
gasPrice?: string;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,WAAW,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default []
|