@secondlayer/stacks 5.1.2 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -340
- package/dist/src/filters/index.d.cts +3 -3
- package/dist/src/filters/index.d.ts +3 -3
- package/dist/src/index.d.cts +2 -2
- package/dist/src/index.d.ts +2 -2
- package/package.json +4 -24
- package/dist/src/tools/btc/index.cjs +0 -131
- package/dist/src/tools/btc/index.cjs.map +0 -10
- package/dist/src/tools/btc/index.d.cts +0 -10
- package/dist/src/tools/btc/index.d.ts +0 -10
- package/dist/src/tools/btc/index.js +0 -90
- package/dist/src/tools/btc/index.js.map +0 -10
- package/dist/src/tools/index.cjs +0 -3865
- package/dist/src/tools/index.cjs.map +0 -80
- package/dist/src/tools/index.d.cts +0 -206
- package/dist/src/tools/index.d.ts +0 -206
- package/dist/src/tools/index.js +0 -3827
- package/dist/src/tools/index.js.map +0 -80
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { Tool } from "ai";
|
|
2
|
-
/** Account derived from a local private key (mnemonic or raw key). */
|
|
3
|
-
type LocalAccount = {
|
|
4
|
-
type: "local"
|
|
5
|
-
address: string
|
|
6
|
-
/** Compressed public key (hex) */
|
|
7
|
-
publicKey: string
|
|
8
|
-
/** Raw ECDSA sign over a hash */
|
|
9
|
-
sign(hash: Uint8Array): Uint8Array
|
|
10
|
-
/** Sign a raw UTF-8 / byte message (`sha256(bytes)`). Not SIP-018. */
|
|
11
|
-
signMessage(message: string | Uint8Array): string
|
|
12
|
-
};
|
|
13
|
-
/** Account with a user-provided signing function (sync or async). */
|
|
14
|
-
type CustomAccount = {
|
|
15
|
-
type: "custom"
|
|
16
|
-
address: string
|
|
17
|
-
publicKey: string
|
|
18
|
-
sign(hash: Uint8Array): Promise<Uint8Array> | Uint8Array
|
|
19
|
-
};
|
|
20
|
-
/** Browser wallet provider interface (e.g. Leather, Xverse). */
|
|
21
|
-
type StacksProvider = {
|
|
22
|
-
request(method: string, params?: any): Promise<any>
|
|
23
|
-
};
|
|
24
|
-
/** Account backed by a browser wallet {@link StacksProvider}. */
|
|
25
|
-
type ProviderAccount = {
|
|
26
|
-
type: "provider"
|
|
27
|
-
address: string
|
|
28
|
-
publicKey: string
|
|
29
|
-
provider: StacksProvider
|
|
30
|
-
};
|
|
31
|
-
/** Allocates mempool-safe sequential nonces across rapid broadcasts from one account. */
|
|
32
|
-
type NonceManager = {
|
|
33
|
-
consume(params: {
|
|
34
|
-
client: Client
|
|
35
|
-
address: string
|
|
36
|
-
}): Promise<bigint>
|
|
37
|
-
reset(params: {
|
|
38
|
-
client: Client
|
|
39
|
-
address: string
|
|
40
|
-
}): void | Promise<void>
|
|
41
|
-
/**
|
|
42
|
-
* Give back a nonce from {@link NonceManager.consume} whose transaction
|
|
43
|
-
* was never accepted by the node. No-op unless it is the latest issued.
|
|
44
|
-
*/
|
|
45
|
-
release(params: {
|
|
46
|
-
client: Client
|
|
47
|
-
address: string
|
|
48
|
-
nonce: bigint
|
|
49
|
-
}): void | Promise<void>
|
|
50
|
-
/** Next nonce that {@link NonceManager.consume} would return without consuming it, or `undefined` if untracked. */
|
|
51
|
-
peek(params: {
|
|
52
|
-
client: Client
|
|
53
|
-
address: string
|
|
54
|
-
}): Promise<bigint | undefined>
|
|
55
|
-
};
|
|
56
|
-
/** Full chain descriptor used by clients and transports for network-aware operations. */
|
|
57
|
-
type StacksChain = {
|
|
58
|
-
/** Chain ID (e.g. 0x00000001 for mainnet) */
|
|
59
|
-
id: number
|
|
60
|
-
/** Human-readable name */
|
|
61
|
-
name: string
|
|
62
|
-
/** Network type */
|
|
63
|
-
network: "mainnet" | "testnet"
|
|
64
|
-
/** Transaction version byte for serialization */
|
|
65
|
-
transactionVersion: number
|
|
66
|
-
/** Peer network ID for P2P broadcasting */
|
|
67
|
-
peerNetworkId: number
|
|
68
|
-
/** Address version bytes */
|
|
69
|
-
addressVersion: {
|
|
70
|
-
singleSig: number
|
|
71
|
-
multiSig: number
|
|
72
|
-
}
|
|
73
|
-
/** Magic bytes for network identification */
|
|
74
|
-
magicBytes: string
|
|
75
|
-
/** Boot address (system contracts deployer) */
|
|
76
|
-
bootAddress: string
|
|
77
|
-
/** Native currency info */
|
|
78
|
-
nativeCurrency: {
|
|
79
|
-
name: string
|
|
80
|
-
symbol: string
|
|
81
|
-
decimals: number
|
|
82
|
-
}
|
|
83
|
-
/** Default RPC URLs */
|
|
84
|
-
rpcUrls: {
|
|
85
|
-
default: {
|
|
86
|
-
http: string[]
|
|
87
|
-
ws?: string[]
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/** Block explorer URLs */
|
|
91
|
-
blockExplorers?: {
|
|
92
|
-
default: {
|
|
93
|
-
name: string
|
|
94
|
-
url: string
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
/** Function that sends an HTTP request to a Stacks node API path. */
|
|
99
|
-
type RequestFn = (path: string, options?: RequestOptions) => Promise<any>;
|
|
100
|
-
/** Options for a transport-level HTTP request. */
|
|
101
|
-
type RequestOptions = {
|
|
102
|
-
method?: "GET" | "POST" | "PUT" | "DELETE"
|
|
103
|
-
body?: unknown
|
|
104
|
-
headers?: Record<string, string>
|
|
105
|
-
/**
|
|
106
|
-
* Cancel the request from the caller's side. An aborted signal rejects
|
|
107
|
-
* with the signal's reason immediately and never retries; it is combined
|
|
108
|
-
* with the transport's own per-attempt timeout.
|
|
109
|
-
*/
|
|
110
|
-
signal?: AbortSignal
|
|
111
|
-
/**
|
|
112
|
-
* Override the transport's retry budget for this one request. Broadcasts
|
|
113
|
-
* pass `0`: re-sending a transaction the node may already hold trades a
|
|
114
|
-
* transient failure for a confusing nonce conflict.
|
|
115
|
-
*/
|
|
116
|
-
retryCount?: number
|
|
117
|
-
};
|
|
118
|
-
/** Shared configuration for all transport types. */
|
|
119
|
-
type TransportConfig = {
|
|
120
|
-
url?: string
|
|
121
|
-
/**
|
|
122
|
-
* Per-attempt deadline in ms covering headers AND body. A stalled body
|
|
123
|
-
* rejects with `TimeoutError` instead of hanging. Default 30_000.
|
|
124
|
-
*/
|
|
125
|
-
timeout?: number
|
|
126
|
-
retryCount?: number
|
|
127
|
-
retryDelay?: number
|
|
128
|
-
fetchOptions?: RequestInit
|
|
129
|
-
/** Sent as `x-api-key`. Held in the request closure and stripped from
|
|
130
|
-
* `Transport.config` so it never prints with the client. */
|
|
131
|
-
apiKey?: string
|
|
132
|
-
};
|
|
133
|
-
/** A resolved transport instance with a bound request function. */
|
|
134
|
-
type Transport = {
|
|
135
|
-
type: string
|
|
136
|
-
request: RequestFn
|
|
137
|
-
config: TransportConfig
|
|
138
|
-
destroy?: () => void
|
|
139
|
-
};
|
|
140
|
-
/** Union of all supported account types (local key, custom signer, or browser provider). */
|
|
141
|
-
type Account = LocalAccount | CustomAccount | ProviderAccount;
|
|
142
|
-
/**
|
|
143
|
-
* Core client instance that holds chain context, transport, and extensible actions.
|
|
144
|
-
* Created via {@link createClient}, {@link createPublicClient}, or {@link createWalletClient}.
|
|
145
|
-
*/
|
|
146
|
-
type Client<TExtended extends Record<string, unknown> = Record<string, unknown>> = {
|
|
147
|
-
chain?: StacksChain
|
|
148
|
-
account?: Account
|
|
149
|
-
transport: Transport
|
|
150
|
-
request: RequestFn
|
|
151
|
-
/** Optional nonce manager for mempool-safe sequential nonces across rapid broadcasts. */
|
|
152
|
-
nonceManager?: NonceManager
|
|
153
|
-
extend: <const TNew extends Record<string, unknown>>(fn: (client: Client<TExtended>) => TNew) => Client<TExtended & TNew> & TNew
|
|
154
|
-
} & TExtended;
|
|
155
|
-
/**
|
|
156
|
-
* Any Stacks client that can perform read-only RPC requests. We only need
|
|
157
|
-
* the base `Client.request` contract; public actions are invoked as
|
|
158
|
-
* free functions in `tools/index.ts`, so we keep this loose.
|
|
159
|
-
*/
|
|
160
|
-
type StacksReadClient = Client<Record<string, unknown>>;
|
|
161
|
-
type LooseTool = Tool<any, any>;
|
|
162
|
-
interface StacksTools {
|
|
163
|
-
getStxBalance: LooseTool;
|
|
164
|
-
getAccountInfo: LooseTool;
|
|
165
|
-
getBlock: LooseTool;
|
|
166
|
-
getBlockHeight: LooseTool;
|
|
167
|
-
readContract: LooseTool;
|
|
168
|
-
estimateFee: LooseTool;
|
|
169
|
-
bnsResolve: LooseTool;
|
|
170
|
-
bnsReverse: LooseTool;
|
|
171
|
-
getTransaction: LooseTool;
|
|
172
|
-
getAccountHistory: LooseTool;
|
|
173
|
-
getMempoolStats: LooseTool;
|
|
174
|
-
getNftHoldings: LooseTool;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Bind the tool set to an explicit client.
|
|
178
|
-
*
|
|
179
|
-
* @deprecated Use `@secondlayer/mcp` for agent access to Stacks reads.
|
|
180
|
-
*/
|
|
181
|
-
declare function createStacksTools(client: StacksReadClient): StacksTools;
|
|
182
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
183
|
-
declare const getStxBalance: LooseTool;
|
|
184
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
185
|
-
declare const getAccountInfo: LooseTool;
|
|
186
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
187
|
-
declare const getBlock: LooseTool;
|
|
188
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
189
|
-
declare const getBlockHeight: LooseTool;
|
|
190
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
191
|
-
declare const readContract: LooseTool;
|
|
192
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
193
|
-
declare const estimateFee: LooseTool;
|
|
194
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
195
|
-
declare const bnsResolve: LooseTool;
|
|
196
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
197
|
-
declare const bnsReverse: LooseTool;
|
|
198
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
199
|
-
declare const getTransaction: LooseTool;
|
|
200
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
201
|
-
declare const getAccountHistory: LooseTool;
|
|
202
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
203
|
-
declare const getMempoolStats: LooseTool;
|
|
204
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
205
|
-
declare const getNftHoldings: LooseTool;
|
|
206
|
-
export { readContract, getTransaction, getStxBalance, getNftHoldings, getMempoolStats, getBlockHeight, getBlock, getAccountInfo, getAccountHistory, estimateFee, createStacksTools, bnsReverse, bnsResolve, StacksTools };
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { Tool } from "ai";
|
|
2
|
-
/** Account derived from a local private key (mnemonic or raw key). */
|
|
3
|
-
type LocalAccount = {
|
|
4
|
-
type: "local"
|
|
5
|
-
address: string
|
|
6
|
-
/** Compressed public key (hex) */
|
|
7
|
-
publicKey: string
|
|
8
|
-
/** Raw ECDSA sign over a hash */
|
|
9
|
-
sign(hash: Uint8Array): Uint8Array
|
|
10
|
-
/** Sign a raw UTF-8 / byte message (`sha256(bytes)`). Not SIP-018. */
|
|
11
|
-
signMessage(message: string | Uint8Array): string
|
|
12
|
-
};
|
|
13
|
-
/** Account with a user-provided signing function (sync or async). */
|
|
14
|
-
type CustomAccount = {
|
|
15
|
-
type: "custom"
|
|
16
|
-
address: string
|
|
17
|
-
publicKey: string
|
|
18
|
-
sign(hash: Uint8Array): Promise<Uint8Array> | Uint8Array
|
|
19
|
-
};
|
|
20
|
-
/** Browser wallet provider interface (e.g. Leather, Xverse). */
|
|
21
|
-
type StacksProvider = {
|
|
22
|
-
request(method: string, params?: any): Promise<any>
|
|
23
|
-
};
|
|
24
|
-
/** Account backed by a browser wallet {@link StacksProvider}. */
|
|
25
|
-
type ProviderAccount = {
|
|
26
|
-
type: "provider"
|
|
27
|
-
address: string
|
|
28
|
-
publicKey: string
|
|
29
|
-
provider: StacksProvider
|
|
30
|
-
};
|
|
31
|
-
/** Allocates mempool-safe sequential nonces across rapid broadcasts from one account. */
|
|
32
|
-
type NonceManager = {
|
|
33
|
-
consume(params: {
|
|
34
|
-
client: Client
|
|
35
|
-
address: string
|
|
36
|
-
}): Promise<bigint>
|
|
37
|
-
reset(params: {
|
|
38
|
-
client: Client
|
|
39
|
-
address: string
|
|
40
|
-
}): void | Promise<void>
|
|
41
|
-
/**
|
|
42
|
-
* Give back a nonce from {@link NonceManager.consume} whose transaction
|
|
43
|
-
* was never accepted by the node. No-op unless it is the latest issued.
|
|
44
|
-
*/
|
|
45
|
-
release(params: {
|
|
46
|
-
client: Client
|
|
47
|
-
address: string
|
|
48
|
-
nonce: bigint
|
|
49
|
-
}): void | Promise<void>
|
|
50
|
-
/** Next nonce that {@link NonceManager.consume} would return without consuming it, or `undefined` if untracked. */
|
|
51
|
-
peek(params: {
|
|
52
|
-
client: Client
|
|
53
|
-
address: string
|
|
54
|
-
}): Promise<bigint | undefined>
|
|
55
|
-
};
|
|
56
|
-
/** Full chain descriptor used by clients and transports for network-aware operations. */
|
|
57
|
-
type StacksChain = {
|
|
58
|
-
/** Chain ID (e.g. 0x00000001 for mainnet) */
|
|
59
|
-
id: number
|
|
60
|
-
/** Human-readable name */
|
|
61
|
-
name: string
|
|
62
|
-
/** Network type */
|
|
63
|
-
network: "mainnet" | "testnet"
|
|
64
|
-
/** Transaction version byte for serialization */
|
|
65
|
-
transactionVersion: number
|
|
66
|
-
/** Peer network ID for P2P broadcasting */
|
|
67
|
-
peerNetworkId: number
|
|
68
|
-
/** Address version bytes */
|
|
69
|
-
addressVersion: {
|
|
70
|
-
singleSig: number
|
|
71
|
-
multiSig: number
|
|
72
|
-
}
|
|
73
|
-
/** Magic bytes for network identification */
|
|
74
|
-
magicBytes: string
|
|
75
|
-
/** Boot address (system contracts deployer) */
|
|
76
|
-
bootAddress: string
|
|
77
|
-
/** Native currency info */
|
|
78
|
-
nativeCurrency: {
|
|
79
|
-
name: string
|
|
80
|
-
symbol: string
|
|
81
|
-
decimals: number
|
|
82
|
-
}
|
|
83
|
-
/** Default RPC URLs */
|
|
84
|
-
rpcUrls: {
|
|
85
|
-
default: {
|
|
86
|
-
http: string[]
|
|
87
|
-
ws?: string[]
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/** Block explorer URLs */
|
|
91
|
-
blockExplorers?: {
|
|
92
|
-
default: {
|
|
93
|
-
name: string
|
|
94
|
-
url: string
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
/** Function that sends an HTTP request to a Stacks node API path. */
|
|
99
|
-
type RequestFn = (path: string, options?: RequestOptions) => Promise<any>;
|
|
100
|
-
/** Options for a transport-level HTTP request. */
|
|
101
|
-
type RequestOptions = {
|
|
102
|
-
method?: "GET" | "POST" | "PUT" | "DELETE"
|
|
103
|
-
body?: unknown
|
|
104
|
-
headers?: Record<string, string>
|
|
105
|
-
/**
|
|
106
|
-
* Cancel the request from the caller's side. An aborted signal rejects
|
|
107
|
-
* with the signal's reason immediately and never retries; it is combined
|
|
108
|
-
* with the transport's own per-attempt timeout.
|
|
109
|
-
*/
|
|
110
|
-
signal?: AbortSignal
|
|
111
|
-
/**
|
|
112
|
-
* Override the transport's retry budget for this one request. Broadcasts
|
|
113
|
-
* pass `0`: re-sending a transaction the node may already hold trades a
|
|
114
|
-
* transient failure for a confusing nonce conflict.
|
|
115
|
-
*/
|
|
116
|
-
retryCount?: number
|
|
117
|
-
};
|
|
118
|
-
/** Shared configuration for all transport types. */
|
|
119
|
-
type TransportConfig = {
|
|
120
|
-
url?: string
|
|
121
|
-
/**
|
|
122
|
-
* Per-attempt deadline in ms covering headers AND body. A stalled body
|
|
123
|
-
* rejects with `TimeoutError` instead of hanging. Default 30_000.
|
|
124
|
-
*/
|
|
125
|
-
timeout?: number
|
|
126
|
-
retryCount?: number
|
|
127
|
-
retryDelay?: number
|
|
128
|
-
fetchOptions?: RequestInit
|
|
129
|
-
/** Sent as `x-api-key`. Held in the request closure and stripped from
|
|
130
|
-
* `Transport.config` so it never prints with the client. */
|
|
131
|
-
apiKey?: string
|
|
132
|
-
};
|
|
133
|
-
/** A resolved transport instance with a bound request function. */
|
|
134
|
-
type Transport = {
|
|
135
|
-
type: string
|
|
136
|
-
request: RequestFn
|
|
137
|
-
config: TransportConfig
|
|
138
|
-
destroy?: () => void
|
|
139
|
-
};
|
|
140
|
-
/** Union of all supported account types (local key, custom signer, or browser provider). */
|
|
141
|
-
type Account = LocalAccount | CustomAccount | ProviderAccount;
|
|
142
|
-
/**
|
|
143
|
-
* Core client instance that holds chain context, transport, and extensible actions.
|
|
144
|
-
* Created via {@link createClient}, {@link createPublicClient}, or {@link createWalletClient}.
|
|
145
|
-
*/
|
|
146
|
-
type Client<TExtended extends Record<string, unknown> = Record<string, unknown>> = {
|
|
147
|
-
chain?: StacksChain
|
|
148
|
-
account?: Account
|
|
149
|
-
transport: Transport
|
|
150
|
-
request: RequestFn
|
|
151
|
-
/** Optional nonce manager for mempool-safe sequential nonces across rapid broadcasts. */
|
|
152
|
-
nonceManager?: NonceManager
|
|
153
|
-
extend: <const TNew extends Record<string, unknown>>(fn: (client: Client<TExtended>) => TNew) => Client<TExtended & TNew> & TNew
|
|
154
|
-
} & TExtended;
|
|
155
|
-
/**
|
|
156
|
-
* Any Stacks client that can perform read-only RPC requests. We only need
|
|
157
|
-
* the base `Client.request` contract; public actions are invoked as
|
|
158
|
-
* free functions in `tools/index.ts`, so we keep this loose.
|
|
159
|
-
*/
|
|
160
|
-
type StacksReadClient = Client<Record<string, unknown>>;
|
|
161
|
-
type LooseTool = Tool<any, any>;
|
|
162
|
-
interface StacksTools {
|
|
163
|
-
getStxBalance: LooseTool;
|
|
164
|
-
getAccountInfo: LooseTool;
|
|
165
|
-
getBlock: LooseTool;
|
|
166
|
-
getBlockHeight: LooseTool;
|
|
167
|
-
readContract: LooseTool;
|
|
168
|
-
estimateFee: LooseTool;
|
|
169
|
-
bnsResolve: LooseTool;
|
|
170
|
-
bnsReverse: LooseTool;
|
|
171
|
-
getTransaction: LooseTool;
|
|
172
|
-
getAccountHistory: LooseTool;
|
|
173
|
-
getMempoolStats: LooseTool;
|
|
174
|
-
getNftHoldings: LooseTool;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Bind the tool set to an explicit client.
|
|
178
|
-
*
|
|
179
|
-
* @deprecated Use `@secondlayer/mcp` for agent access to Stacks reads.
|
|
180
|
-
*/
|
|
181
|
-
declare function createStacksTools(client: StacksReadClient): StacksTools;
|
|
182
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
183
|
-
declare const getStxBalance: LooseTool;
|
|
184
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
185
|
-
declare const getAccountInfo: LooseTool;
|
|
186
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
187
|
-
declare const getBlock: LooseTool;
|
|
188
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
189
|
-
declare const getBlockHeight: LooseTool;
|
|
190
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
191
|
-
declare const readContract: LooseTool;
|
|
192
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
193
|
-
declare const estimateFee: LooseTool;
|
|
194
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
195
|
-
declare const bnsResolve: LooseTool;
|
|
196
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
197
|
-
declare const bnsReverse: LooseTool;
|
|
198
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
199
|
-
declare const getTransaction: LooseTool;
|
|
200
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
201
|
-
declare const getAccountHistory: LooseTool;
|
|
202
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
203
|
-
declare const getMempoolStats: LooseTool;
|
|
204
|
-
/** @deprecated Use `@secondlayer/mcp`. */
|
|
205
|
-
declare const getNftHoldings: LooseTool;
|
|
206
|
-
export { readContract, getTransaction, getStxBalance, getNftHoldings, getMempoolStats, getBlockHeight, getBlock, getAccountInfo, getAccountHistory, estimateFee, createStacksTools, bnsReverse, bnsResolve, StacksTools };
|