@suisei-mcp/mcp 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 +199 -0
- package/dist/coins.d.ts +21 -0
- package/dist/coins.js +59 -0
- package/dist/coins.js.map +1 -0
- package/dist/deepbook.d.ts +20 -0
- package/dist/deepbook.js +63 -0
- package/dist/deepbook.js.map +1 -0
- package/dist/http.d.ts +24 -0
- package/dist/http.js +42 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +12 -0
- package/dist/node.js +54 -0
- package/dist/node.js.map +1 -0
- package/dist/serve.d.ts +13 -0
- package/dist/serve.js +25 -0
- package/dist/serve.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.js +569 -0
- package/dist/server.js.map +1 -0
- package/dist/sui-client.d.ts +16 -0
- package/dist/sui-client.js +64 -0
- package/dist/sui-client.js.map +1 -0
- package/dist/tools/agent_wallet_fund.d.ts +11 -0
- package/dist/tools/agent_wallet_fund.js +31 -0
- package/dist/tools/agent_wallet_fund.js.map +1 -0
- package/dist/tools/agent_wallet_status.d.ts +6 -0
- package/dist/tools/agent_wallet_status.js +22 -0
- package/dist/tools/agent_wallet_status.js.map +1 -0
- package/dist/tools/agent_wallet_sweep.d.ts +11 -0
- package/dist/tools/agent_wallet_sweep.js +34 -0
- package/dist/tools/agent_wallet_sweep.js.map +1 -0
- package/dist/tools/sui_decode_tx_bytes.d.ts +15 -0
- package/dist/tools/sui_decode_tx_bytes.js +140 -0
- package/dist/tools/sui_decode_tx_bytes.js.map +1 -0
- package/dist/tools/sui_deepbook_quote.d.ts +12 -0
- package/dist/tools/sui_deepbook_quote.js +72 -0
- package/dist/tools/sui_deepbook_quote.js.map +1 -0
- package/dist/tools/sui_deepbook_swap.d.ts +15 -0
- package/dist/tools/sui_deepbook_swap.js +72 -0
- package/dist/tools/sui_deepbook_swap.js.map +1 -0
- package/dist/tools/sui_dry_run.d.ts +6 -0
- package/dist/tools/sui_dry_run.js +24 -0
- package/dist/tools/sui_dry_run.js.map +1 -0
- package/dist/tools/sui_execute_signed_tx.d.ts +6 -0
- package/dist/tools/sui_execute_signed_tx.js +25 -0
- package/dist/tools/sui_execute_signed_tx.js.map +1 -0
- package/dist/tools/sui_get_all_balances.d.ts +5 -0
- package/dist/tools/sui_get_all_balances.js +21 -0
- package/dist/tools/sui_get_all_balances.js.map +1 -0
- package/dist/tools/sui_get_balance.d.ts +1 -0
- package/dist/tools/sui_get_balance.js +17 -0
- package/dist/tools/sui_get_balance.js.map +1 -0
- package/dist/tools/sui_get_coin_metadata.d.ts +10 -0
- package/dist/tools/sui_get_coin_metadata.js +38 -0
- package/dist/tools/sui_get_coin_metadata.js.map +1 -0
- package/dist/tools/sui_get_coins.d.ts +6 -0
- package/dist/tools/sui_get_coins.js +31 -0
- package/dist/tools/sui_get_coins.js.map +1 -0
- package/dist/tools/sui_get_dynamic_fields.d.ts +6 -0
- package/dist/tools/sui_get_dynamic_fields.js +30 -0
- package/dist/tools/sui_get_dynamic_fields.js.map +1 -0
- package/dist/tools/sui_get_object.d.ts +5 -0
- package/dist/tools/sui_get_object.js +37 -0
- package/dist/tools/sui_get_object.js.map +1 -0
- package/dist/tools/sui_get_owned_badges.d.ts +1 -0
- package/dist/tools/sui_get_owned_badges.js +64 -0
- package/dist/tools/sui_get_owned_badges.js.map +1 -0
- package/dist/tools/sui_get_owned_objects.d.ts +5 -0
- package/dist/tools/sui_get_owned_objects.js +32 -0
- package/dist/tools/sui_get_owned_objects.js.map +1 -0
- package/dist/tools/sui_get_reference_gas_price.d.ts +5 -0
- package/dist/tools/sui_get_reference_gas_price.js +15 -0
- package/dist/tools/sui_get_reference_gas_price.js.map +1 -0
- package/dist/tools/sui_get_stakes.d.ts +11 -0
- package/dist/tools/sui_get_stakes.js +54 -0
- package/dist/tools/sui_get_stakes.js.map +1 -0
- package/dist/tools/sui_get_transaction.d.ts +6 -0
- package/dist/tools/sui_get_transaction.js +26 -0
- package/dist/tools/sui_get_transaction.js.map +1 -0
- package/dist/tools/sui_get_validator.d.ts +8 -0
- package/dist/tools/sui_get_validator.js +43 -0
- package/dist/tools/sui_get_validator.js.map +1 -0
- package/dist/tools/sui_get_validators.d.ts +9 -0
- package/dist/tools/sui_get_validators.js +46 -0
- package/dist/tools/sui_get_validators.js.map +1 -0
- package/dist/tools/sui_get_validators_apy.d.ts +10 -0
- package/dist/tools/sui_get_validators_apy.js +37 -0
- package/dist/tools/sui_get_validators_apy.js.map +1 -0
- package/dist/tools/sui_mint_badge.d.ts +7 -0
- package/dist/tools/sui_mint_badge.js +35 -0
- package/dist/tools/sui_mint_badge.js.map +1 -0
- package/dist/tools/sui_move_call.d.ts +18 -0
- package/dist/tools/sui_move_call.js +88 -0
- package/dist/tools/sui_move_call.js.map +1 -0
- package/dist/tools/sui_pay_many.d.ts +10 -0
- package/dist/tools/sui_pay_many.js +40 -0
- package/dist/tools/sui_pay_many.js.map +1 -0
- package/dist/tools/sui_query_events.d.ts +12 -0
- package/dist/tools/sui_query_events.js +59 -0
- package/dist/tools/sui_query_events.js.map +1 -0
- package/dist/tools/sui_resolve_address.d.ts +6 -0
- package/dist/tools/sui_resolve_address.js +22 -0
- package/dist/tools/sui_resolve_address.js.map +1 -0
- package/dist/tools/sui_resolve_coin.d.ts +9 -0
- package/dist/tools/sui_resolve_coin.js +26 -0
- package/dist/tools/sui_resolve_coin.js.map +1 -0
- package/dist/tools/sui_stake.d.ts +6 -0
- package/dist/tools/sui_stake.js +29 -0
- package/dist/tools/sui_stake.js.map +1 -0
- package/dist/tools/sui_transfer.d.ts +5 -0
- package/dist/tools/sui_transfer.js +34 -0
- package/dist/tools/sui_transfer.js.map +1 -0
- package/dist/tools/sui_unstake.d.ts +6 -0
- package/dist/tools/sui_unstake.js +27 -0
- package/dist/tools/sui_unstake.js.map +1 -0
- package/dist/tools/walrus_fetch.d.ts +1 -0
- package/dist/tools/walrus_fetch.js +18 -0
- package/dist/tools/walrus_fetch.js.map +1 -0
- package/dist/tools/walrus_publish.d.ts +1 -0
- package/dist/tools/walrus_publish.js +42 -0
- package/dist/tools/walrus_publish.js.map +1 -0
- package/dist/tx.d.ts +12 -0
- package/dist/tx.js +18 -0
- package/dist/tx.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Every coin balance an address holds, not just SUI. Use this when the
|
|
4
|
+
* wallet might own tokens beyond the native coin.
|
|
5
|
+
*/
|
|
6
|
+
export async function suiGetAllBalances(raw) {
|
|
7
|
+
const { address, network } = raw;
|
|
8
|
+
const client = clientFor(network);
|
|
9
|
+
const balances = await client.getAllBalances({ owner: address });
|
|
10
|
+
return JSON.stringify({
|
|
11
|
+
address,
|
|
12
|
+
network,
|
|
13
|
+
count: balances.length,
|
|
14
|
+
balances: balances.map((b) => ({
|
|
15
|
+
coin_type: b.coinType,
|
|
16
|
+
total_mist: b.totalBalance,
|
|
17
|
+
coin_object_count: b.coinObjectCount,
|
|
18
|
+
})),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=sui_get_all_balances.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_all_balances.js","sourceRoot":"","sources":["../../src/tools/sui_get_all_balances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAY;IAClD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjE,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,OAAO;QACP,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,UAAU,EAAE,CAAC,CAAC,YAAY;YAC1B,iBAAiB,EAAE,CAAC,CAAC,eAAe;SACrC,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function suiGetBalance(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
export async function suiGetBalance(raw) {
|
|
3
|
+
const { address, network } = raw;
|
|
4
|
+
const client = clientFor(network);
|
|
5
|
+
const balance = await client.getBalance({ owner: address });
|
|
6
|
+
const mist = BigInt(balance.totalBalance);
|
|
7
|
+
const sui = Number(mist) / 1e9;
|
|
8
|
+
return JSON.stringify({
|
|
9
|
+
address,
|
|
10
|
+
network,
|
|
11
|
+
coin_type: balance.coinType,
|
|
12
|
+
total_mist: balance.totalBalance,
|
|
13
|
+
total_sui: sui,
|
|
14
|
+
coin_object_count: balance.coinObjectCount,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=sui_get_balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_balance.js","sourceRoot":"","sources":["../../src/tools/sui_get_balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAY;IAC9C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,UAAU,EAAE,OAAO,CAAC,YAAY;QAChC,SAAS,EAAE,GAAG;QACd,iBAAiB,EAAE,OAAO,CAAC,eAAe;KAC3C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live coin metadata: symbol, name, decimals, description, icon URL. Pass
|
|
3
|
+
* coin_type (e.g. "0x2::sui::SUI") or symbol (e.g. "USDC"). With symbol,
|
|
4
|
+
* the local registry resolves to a coin_type first — this works even when
|
|
5
|
+
* the on-chain CoinMetadata is absent or slow.
|
|
6
|
+
*
|
|
7
|
+
* Decimals are critical for every DeFi flow: a "5 USDC" transfer is 5e6
|
|
8
|
+
* smallest units (6 decimals), not 5e9.
|
|
9
|
+
*/
|
|
10
|
+
export declare function suiGetCoinMetadata(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
import { findCoin } from '../coins.js';
|
|
3
|
+
/**
|
|
4
|
+
* Live coin metadata: symbol, name, decimals, description, icon URL. Pass
|
|
5
|
+
* coin_type (e.g. "0x2::sui::SUI") or symbol (e.g. "USDC"). With symbol,
|
|
6
|
+
* the local registry resolves to a coin_type first — this works even when
|
|
7
|
+
* the on-chain CoinMetadata is absent or slow.
|
|
8
|
+
*
|
|
9
|
+
* Decimals are critical for every DeFi flow: a "5 USDC" transfer is 5e6
|
|
10
|
+
* smallest units (6 decimals), not 5e9.
|
|
11
|
+
*/
|
|
12
|
+
export async function suiGetCoinMetadata(raw) {
|
|
13
|
+
const a = raw;
|
|
14
|
+
let coinType = a.coin_type;
|
|
15
|
+
if (!coinType && a.symbol) {
|
|
16
|
+
const known = findCoin(a.network, a.symbol);
|
|
17
|
+
if (!known) {
|
|
18
|
+
throw new Error(`Unknown symbol "${a.symbol}" on ${a.network}. Pass coin_type explicitly or use sui_resolve_coin.`);
|
|
19
|
+
}
|
|
20
|
+
coinType = known.coin_type;
|
|
21
|
+
}
|
|
22
|
+
if (!coinType)
|
|
23
|
+
throw new Error('Pass coin_type or symbol.');
|
|
24
|
+
const client = clientFor(a.network);
|
|
25
|
+
const meta = await client.getCoinMetadata({ coinType });
|
|
26
|
+
const fromRegistry = findCoin(a.network, a.symbol ?? meta?.symbol ?? '');
|
|
27
|
+
return JSON.stringify({
|
|
28
|
+
network: a.network,
|
|
29
|
+
coin_type: coinType,
|
|
30
|
+
decimals: meta?.decimals ?? fromRegistry?.decimals ?? null,
|
|
31
|
+
symbol: meta?.symbol ?? fromRegistry?.symbol ?? null,
|
|
32
|
+
name: meta?.name ?? null,
|
|
33
|
+
description: meta?.description ?? fromRegistry?.description ?? null,
|
|
34
|
+
icon_url: meta?.iconUrl ?? null,
|
|
35
|
+
note: 'Multiply human amounts by 10^decimals to get smallest-unit values that every transfer / swap / stake tool expects.',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=sui_get_coin_metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_coin_metadata.js","sourceRoot":"","sources":["../../src/tools/sui_get_coin_metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAY;IACnD,MAAM,CAAC,GAAG,GAAW,CAAC;IACtB,IAAI,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC;IAE3B,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,mBAAmB,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,OAAO,sDAAsD,CACnG,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;IAEzE,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY,EAAE,QAAQ,IAAI,IAAI;QAC1D,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,IAAI;QACpD,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI;QACxB,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,YAAY,EAAE,WAAW,IAAI,IAAI;QACnE,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI;QAC/B,IAAI,EACF,oHAAoH;KACvH,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List individual coin objects of one type held by an address. Unlike
|
|
3
|
+
* sui_get_balance (which sums), this returns the concrete coin object ids
|
|
4
|
+
* an agent needs to pass into a sui_move_call or split. Paginated.
|
|
5
|
+
*/
|
|
6
|
+
export declare function suiGetCoins(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* List individual coin objects of one type held by an address. Unlike
|
|
4
|
+
* sui_get_balance (which sums), this returns the concrete coin object ids
|
|
5
|
+
* an agent needs to pass into a sui_move_call or split. Paginated.
|
|
6
|
+
*/
|
|
7
|
+
export async function suiGetCoins(raw) {
|
|
8
|
+
const { address, coin_type, cursor, limit, network } = raw;
|
|
9
|
+
const client = clientFor(network);
|
|
10
|
+
const res = await client.getCoins({
|
|
11
|
+
owner: address,
|
|
12
|
+
coinType: coin_type, // undefined → native 0x2::sui::SUI
|
|
13
|
+
cursor: cursor ?? null,
|
|
14
|
+
limit,
|
|
15
|
+
});
|
|
16
|
+
return JSON.stringify({
|
|
17
|
+
address,
|
|
18
|
+
network,
|
|
19
|
+
coin_type: coin_type ?? '0x2::sui::SUI',
|
|
20
|
+
count: res.data.length,
|
|
21
|
+
has_next_page: res.hasNextPage,
|
|
22
|
+
next_cursor: res.nextCursor ?? null,
|
|
23
|
+
coins: res.data.map((c) => ({
|
|
24
|
+
coin_object_id: c.coinObjectId,
|
|
25
|
+
balance: c.balance,
|
|
26
|
+
version: c.version,
|
|
27
|
+
digest: c.digest,
|
|
28
|
+
})),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=sui_get_coins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_coins.js","sourceRoot":"","sources":["../../src/tools/sui_get_coins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAU3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAY;IAC5C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACnE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;QAChC,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,SAAS,EAAE,mCAAmC;QACxD,MAAM,EAAE,MAAM,IAAI,IAAI;QACtB,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,OAAO;QACP,SAAS,EAAE,SAAS,IAAI,eAAe;QACvC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;QACtB,aAAa,EAAE,GAAG,CAAC,WAAW;QAC9B,WAAW,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;QACnC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,cAAc,EAAE,CAAC,CAAC,YAAY;YAC9B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List the dynamic fields attached to a parent object — the way Sui
|
|
3
|
+
* stores Tables, Bags, and other on-chain collections. Returns each
|
|
4
|
+
* field's name, type, and the child object id. Paginated.
|
|
5
|
+
*/
|
|
6
|
+
export declare function suiGetDynamicFields(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* List the dynamic fields attached to a parent object — the way Sui
|
|
4
|
+
* stores Tables, Bags, and other on-chain collections. Returns each
|
|
5
|
+
* field's name, type, and the child object id. Paginated.
|
|
6
|
+
*/
|
|
7
|
+
export async function suiGetDynamicFields(raw) {
|
|
8
|
+
const { parent_id, cursor, limit, network } = raw;
|
|
9
|
+
const client = clientFor(network);
|
|
10
|
+
const res = await client.getDynamicFields({
|
|
11
|
+
parentId: parent_id,
|
|
12
|
+
cursor: cursor ?? null,
|
|
13
|
+
limit,
|
|
14
|
+
});
|
|
15
|
+
return JSON.stringify({
|
|
16
|
+
parent_id,
|
|
17
|
+
network,
|
|
18
|
+
count: res.data.length,
|
|
19
|
+
has_next_page: res.hasNextPage,
|
|
20
|
+
next_cursor: res.nextCursor ?? null,
|
|
21
|
+
fields: res.data.map((f) => ({
|
|
22
|
+
name: f.name,
|
|
23
|
+
type: f.type,
|
|
24
|
+
object_type: f.objectType,
|
|
25
|
+
object_id: f.objectId,
|
|
26
|
+
digest: f.digest,
|
|
27
|
+
})),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=sui_get_dynamic_fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_dynamic_fields.js","sourceRoot":"","sources":["../../src/tools/sui_get_dynamic_fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAS3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAY;IACpD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;QACxC,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,MAAM,IAAI,IAAI;QACtB,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,SAAS;QACT,OAAO;QACP,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;QACtB,aAAa,EAAE,GAAG,CAAC,WAAW;QAC9B,WAAW,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;QACnC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Read any on-chain object's type, owner, content fields and Display.
|
|
4
|
+
* The general primitive every other read tool is a special case of.
|
|
5
|
+
*/
|
|
6
|
+
export async function suiGetObject(raw) {
|
|
7
|
+
const { object_id, network } = raw;
|
|
8
|
+
const client = clientFor(network);
|
|
9
|
+
const res = await client.getObject({
|
|
10
|
+
id: object_id,
|
|
11
|
+
options: {
|
|
12
|
+
showType: true,
|
|
13
|
+
showOwner: true,
|
|
14
|
+
showContent: true,
|
|
15
|
+
showDisplay: true,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
if (res.error) {
|
|
19
|
+
throw new Error(`Object ${object_id} not readable: ${JSON.stringify(res.error)}`);
|
|
20
|
+
}
|
|
21
|
+
const data = res.data;
|
|
22
|
+
const content = data?.content;
|
|
23
|
+
const fields = content && content.dataType === 'moveObject'
|
|
24
|
+
? content.fields
|
|
25
|
+
: null;
|
|
26
|
+
return JSON.stringify({
|
|
27
|
+
object_id,
|
|
28
|
+
network,
|
|
29
|
+
type: data?.type,
|
|
30
|
+
version: data?.version,
|
|
31
|
+
digest: data?.digest,
|
|
32
|
+
owner: data?.owner,
|
|
33
|
+
fields,
|
|
34
|
+
display: data?.display?.data ?? null,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=sui_get_object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_object.js","sourceRoot":"","sources":["../../src/tools/sui_get_object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY;IAC7C,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;QACjC,EAAE,EAAE,SAAS;QACb,OAAO,EAAE;YACP,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,IAAI;SAClB;KACF,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;IAC9B,MAAM,MAAM,GACV,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,YAAY;QAC1C,CAAC,CAAE,OAAO,CAAC,MAAkC;QAC7C,CAAC,CAAC,IAAI,CAAC;IAEX,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,SAAS;QACT,OAAO;QACP,IAAI,EAAE,IAAI,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI,EAAE,OAAO;QACtB,MAAM,EAAE,IAAI,EAAE,MAAM;QACpB,KAAK,EAAE,IAAI,EAAE,KAAK;QAClB,MAAM;QACN,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;KACrC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function suiGetOwnedBadges(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Canonical Suisei badge packages per network. Hardcode the published id
|
|
4
|
+
* here after running scripts/publish-badge.sh so the tool works with no
|
|
5
|
+
* arguments. Until then, callers can set the SUISEI_BADGE_PACKAGE env var
|
|
6
|
+
* or pass `badge_package` explicitly.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_BADGE_PACKAGE = {
|
|
9
|
+
// testnet: '0x…', // paste published package id here
|
|
10
|
+
// mainnet: '0x…',
|
|
11
|
+
};
|
|
12
|
+
export async function suiGetOwnedBadges(raw) {
|
|
13
|
+
const { address, badge_package, network } = raw;
|
|
14
|
+
const pkg = badge_package ??
|
|
15
|
+
process.env.SUISEI_BADGE_PACKAGE ??
|
|
16
|
+
DEFAULT_BADGE_PACKAGE[network];
|
|
17
|
+
if (!pkg) {
|
|
18
|
+
throw new Error(`No badge package for ${network}. Set SUISEI_BADGE_PACKAGE, pass badge_package, or hardcode DEFAULT_BADGE_PACKAGE.`);
|
|
19
|
+
}
|
|
20
|
+
const client = clientFor(network);
|
|
21
|
+
const badgeType = `${pkg}::badge::Badge`;
|
|
22
|
+
const owned = await client.getOwnedObjects({
|
|
23
|
+
owner: address,
|
|
24
|
+
filter: { StructType: badgeType },
|
|
25
|
+
options: { showContent: true, showType: true },
|
|
26
|
+
});
|
|
27
|
+
const badges = (owned.data ?? [])
|
|
28
|
+
.map((o) => {
|
|
29
|
+
const content = o.data?.content;
|
|
30
|
+
const fields = content && content.dataType === 'moveObject'
|
|
31
|
+
? content.fields
|
|
32
|
+
: null;
|
|
33
|
+
return {
|
|
34
|
+
object_id: o.data?.objectId,
|
|
35
|
+
type: o.data?.type,
|
|
36
|
+
quest_id: bytesFieldToString(fields?.quest_id),
|
|
37
|
+
quest_number: fields?.quest_number,
|
|
38
|
+
minted_at_ms: fields?.minted_at_ms,
|
|
39
|
+
};
|
|
40
|
+
})
|
|
41
|
+
.filter((b) => !!b.object_id);
|
|
42
|
+
return JSON.stringify({
|
|
43
|
+
address,
|
|
44
|
+
badge_package: pkg,
|
|
45
|
+
network,
|
|
46
|
+
count: badges.length,
|
|
47
|
+
badges,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** Move byte-vector fields come back as either string or number[]. Normalize. */
|
|
51
|
+
function bytesFieldToString(field) {
|
|
52
|
+
if (typeof field === 'string')
|
|
53
|
+
return field;
|
|
54
|
+
if (Array.isArray(field)) {
|
|
55
|
+
try {
|
|
56
|
+
return new TextDecoder().decode(new Uint8Array(field));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=sui_get_owned_badges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_owned_badges.js","sourceRoot":"","sources":["../../src/tools/sui_get_owned_badges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAQ3D;;;;;GAKG;AACH,MAAM,qBAAqB,GAAqC;AAC9D,sDAAsD;AACtD,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAY;IAClD,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACxD,MAAM,GAAG,GACP,aAAa;QACb,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,oFAAoF,CACpH,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,GAAG,gBAAgB,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;QACzC,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;QACjC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC/C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC;QAChC,MAAM,MAAM,GACV,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,YAAY;YAC1C,CAAC,CAAE,OAAO,CAAC,MAAkC;YAC7C,CAAC,CAAC,IAAI,CAAC;QACX,OAAO;YACL,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ;YAC3B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI;YAClB,QAAQ,EAAE,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC9C,YAAY,EAAE,MAAM,EAAE,YAAY;YAClC,YAAY,EAAE,MAAM,EAAE,YAAY;SACnC,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,aAAa,EAAE,GAAG;QAClB,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AACjF,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,KAAiB,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* List objects owned by an address, optionally filtered to one Move
|
|
4
|
+
* struct type. Paginated: pass the returned `next_cursor` to continue.
|
|
5
|
+
*/
|
|
6
|
+
export async function suiGetOwnedObjects(raw) {
|
|
7
|
+
const { address, struct_type, cursor, limit, network } = raw;
|
|
8
|
+
const client = clientFor(network);
|
|
9
|
+
const res = await client.getOwnedObjects({
|
|
10
|
+
owner: address,
|
|
11
|
+
filter: struct_type ? { StructType: struct_type } : undefined,
|
|
12
|
+
cursor: cursor ?? null,
|
|
13
|
+
limit,
|
|
14
|
+
options: { showType: true },
|
|
15
|
+
});
|
|
16
|
+
const objects = (res.data ?? []).map((o) => ({
|
|
17
|
+
object_id: o.data?.objectId,
|
|
18
|
+
type: o.data?.type,
|
|
19
|
+
version: o.data?.version,
|
|
20
|
+
digest: o.data?.digest,
|
|
21
|
+
}));
|
|
22
|
+
return JSON.stringify({
|
|
23
|
+
address,
|
|
24
|
+
network,
|
|
25
|
+
struct_type: struct_type ?? null,
|
|
26
|
+
count: objects.length,
|
|
27
|
+
has_next_page: res.hasNextPage,
|
|
28
|
+
next_cursor: res.nextCursor ?? null,
|
|
29
|
+
objects,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=sui_get_owned_objects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_owned_objects.js","sourceRoot":"","sources":["../../src/tools/sui_get_owned_objects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAU3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAY;IACnD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACrE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;QACvC,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;QAC7D,MAAM,EAAE,MAAM,IAAI,IAAI;QACtB,KAAK;QACL,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC5B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ;QAC3B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI;QAClB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO;QACxB,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM;KACvB,CAAC,CAAC,CAAC;IAEJ,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,OAAO;QACP,WAAW,EAAE,WAAW,IAAI,IAAI;QAChC,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,aAAa,EAAE,GAAG,CAAC,WAAW;QAC9B,WAAW,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;QACnC,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Current reference gas price (in MIST) for the network. An agent can use
|
|
4
|
+
* it to estimate fees or set a gas price before building a transaction.
|
|
5
|
+
*/
|
|
6
|
+
export async function suiGetReferenceGasPrice(raw) {
|
|
7
|
+
const { network } = raw;
|
|
8
|
+
const client = clientFor(network);
|
|
9
|
+
const price = await client.getReferenceGasPrice();
|
|
10
|
+
return JSON.stringify({
|
|
11
|
+
network,
|
|
12
|
+
reference_gas_price_mist: price.toString(),
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=sui_get_reference_gas_price.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_reference_gas_price.js","sourceRoot":"","sources":["../../src/tools/sui_get_reference_gas_price.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAM3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,GAAY;IACxD,MAAM,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAChC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,wBAAwB,EAAE,KAAK,CAAC,QAAQ,EAAE;KAC3C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List an address's active native stakes, grouped by validator. For each
|
|
3
|
+
* StakedSui the chain returns the principal, the (estimated) rewards
|
|
4
|
+
* accrued so far, and the activation epoch — everything a staking app
|
|
5
|
+
* needs to show "you staked X, you've earned Y". Read-only: no gas, no
|
|
6
|
+
* signing.
|
|
7
|
+
*
|
|
8
|
+
* Pair with sui_get_validators_apy to project forward returns, and
|
|
9
|
+
* sui_unstake (which takes a staked_sui_id from here) to withdraw.
|
|
10
|
+
*/
|
|
11
|
+
export declare function suiGetStakes(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
const toSui = (mist) => Number(BigInt(mist)) / 1e9;
|
|
3
|
+
/**
|
|
4
|
+
* List an address's active native stakes, grouped by validator. For each
|
|
5
|
+
* StakedSui the chain returns the principal, the (estimated) rewards
|
|
6
|
+
* accrued so far, and the activation epoch — everything a staking app
|
|
7
|
+
* needs to show "you staked X, you've earned Y". Read-only: no gas, no
|
|
8
|
+
* signing.
|
|
9
|
+
*
|
|
10
|
+
* Pair with sui_get_validators_apy to project forward returns, and
|
|
11
|
+
* sui_unstake (which takes a staked_sui_id from here) to withdraw.
|
|
12
|
+
*/
|
|
13
|
+
export async function suiGetStakes(raw) {
|
|
14
|
+
const { address, network } = raw;
|
|
15
|
+
const client = clientFor(network);
|
|
16
|
+
const delegated = await client.getStakes({ owner: address });
|
|
17
|
+
let totalPrincipalMist = 0n;
|
|
18
|
+
let totalRewardMist = 0n;
|
|
19
|
+
const validators = delegated.map((d) => {
|
|
20
|
+
const stakes = d.stakes.map((s) => {
|
|
21
|
+
const principal = BigInt(s.principal);
|
|
22
|
+
const reward = BigInt('estimatedReward' in s && s.estimatedReward ? s.estimatedReward : '0');
|
|
23
|
+
totalPrincipalMist += principal;
|
|
24
|
+
totalRewardMist += reward;
|
|
25
|
+
return {
|
|
26
|
+
staked_sui_id: s.stakedSuiId,
|
|
27
|
+
status: s.status,
|
|
28
|
+
stake_active_epoch: s.stakeActiveEpoch,
|
|
29
|
+
stake_request_epoch: s.stakeRequestEpoch,
|
|
30
|
+
principal_mist: s.principal,
|
|
31
|
+
principal_sui: toSui(s.principal),
|
|
32
|
+
estimated_reward_mist: 'estimatedReward' in s && s.estimatedReward ? s.estimatedReward : null,
|
|
33
|
+
estimated_reward_sui: 'estimatedReward' in s && s.estimatedReward ? toSui(s.estimatedReward) : null,
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
validator_address: d.validatorAddress,
|
|
38
|
+
staking_pool: d.stakingPool,
|
|
39
|
+
stakes,
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
return JSON.stringify({
|
|
43
|
+
address,
|
|
44
|
+
network,
|
|
45
|
+
validator_count: validators.length,
|
|
46
|
+
total_principal_mist: totalPrincipalMist.toString(),
|
|
47
|
+
total_principal_sui: toSui(totalPrincipalMist),
|
|
48
|
+
total_estimated_reward_mist: totalRewardMist.toString(),
|
|
49
|
+
total_estimated_reward_sui: toSui(totalRewardMist),
|
|
50
|
+
validators,
|
|
51
|
+
note: 'estimated_reward is only populated for stakes that are Active (rewards begin the epoch after activation). Use staked_sui_id with sui_unstake to withdraw.',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sui_get_stakes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_stakes.js","sourceRoot":"","sources":["../../src/tools/sui_get_stakes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D,MAAM,KAAK,GAAG,CAAC,IAA8B,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;AAE7E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY;IAC7C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAE7D,IAAI,kBAAkB,GAAG,EAAE,CAAC;IAC5B,IAAI,eAAe,GAAG,EAAE,CAAC;IAEzB,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7F,kBAAkB,IAAI,SAAS,CAAC;YAChC,eAAe,IAAI,MAAM,CAAC;YAC1B,OAAO;gBACL,aAAa,EAAE,CAAC,CAAC,WAAW;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,kBAAkB,EAAE,CAAC,CAAC,gBAAgB;gBACtC,mBAAmB,EAAE,CAAC,CAAC,iBAAiB;gBACxC,cAAc,EAAE,CAAC,CAAC,SAAS;gBAC3B,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjC,qBAAqB,EACnB,iBAAiB,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;gBACxE,oBAAoB,EAClB,iBAAiB,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;aAChF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO;YACL,iBAAiB,EAAE,CAAC,CAAC,gBAAgB;YACrC,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,OAAO;QACP,eAAe,EAAE,UAAU,CAAC,MAAM;QAClC,oBAAoB,EAAE,kBAAkB,CAAC,QAAQ,EAAE;QACnD,mBAAmB,EAAE,KAAK,CAAC,kBAAkB,CAAC;QAC9C,2BAA2B,EAAE,eAAe,CAAC,QAAQ,EAAE;QACvD,0BAA0B,EAAE,KAAK,CAAC,eAAe,CAAC;QAClD,UAAU;QACV,IAAI,EACF,2JAA2J;KAC9J,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch a finalized transaction by digest: status, gas, balance changes,
|
|
3
|
+
* and event count. Use to inspect the result of a tx submitted earlier
|
|
4
|
+
* (the same digest sui_execute_signed_tx returns).
|
|
5
|
+
*/
|
|
6
|
+
export declare function suiGetTransaction(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fetch a finalized transaction by digest: status, gas, balance changes,
|
|
4
|
+
* and event count. Use to inspect the result of a tx submitted earlier
|
|
5
|
+
* (the same digest sui_execute_signed_tx returns).
|
|
6
|
+
*/
|
|
7
|
+
export async function suiGetTransaction(raw) {
|
|
8
|
+
const { digest, network } = raw;
|
|
9
|
+
const client = clientFor(network);
|
|
10
|
+
const res = await client.getTransactionBlock({
|
|
11
|
+
digest,
|
|
12
|
+
options: { showEffects: true, showEvents: true, showBalanceChanges: true },
|
|
13
|
+
});
|
|
14
|
+
return JSON.stringify({
|
|
15
|
+
digest: res.digest,
|
|
16
|
+
network,
|
|
17
|
+
status: res.effects?.status.status ?? 'unknown',
|
|
18
|
+
error: res.effects?.status.error ?? null,
|
|
19
|
+
timestamp_ms: res.timestampMs ?? null,
|
|
20
|
+
checkpoint: res.checkpoint ?? null,
|
|
21
|
+
gas_used: res.effects?.gasUsed ?? null,
|
|
22
|
+
balance_changes: res.balanceChanges ?? [],
|
|
23
|
+
events_count: res.events?.length ?? 0,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=sui_get_transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_transaction.js","sourceRoot":"","sources":["../../src/tools/sui_get_transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAY;IAClD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC;QAC3C,MAAM;QACN,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE;KAC3E,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO;QACP,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;QAC/C,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;QACxC,YAAY,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;QACrC,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;QAClC,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI;QACtC,eAAe,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE;QACzC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;KACtC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One validator's full picture, with APY merged: name, address, commission,
|
|
3
|
+
* total stake, voting power, project URL — plus the live APY the chain
|
|
4
|
+
* computes from recent epoch rewards. Fuses sui_get_validators and
|
|
5
|
+
* sui_get_validators_apy into a single read so a staking app doesn't have
|
|
6
|
+
* to join them by hand.
|
|
7
|
+
*/
|
|
8
|
+
export declare function suiGetValidator(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
const toSui = (mist) => Number(BigInt(mist)) / 1e9;
|
|
3
|
+
/**
|
|
4
|
+
* One validator's full picture, with APY merged: name, address, commission,
|
|
5
|
+
* total stake, voting power, project URL — plus the live APY the chain
|
|
6
|
+
* computes from recent epoch rewards. Fuses sui_get_validators and
|
|
7
|
+
* sui_get_validators_apy into a single read so a staking app doesn't have
|
|
8
|
+
* to join them by hand.
|
|
9
|
+
*/
|
|
10
|
+
export async function suiGetValidator(raw) {
|
|
11
|
+
const { validator_address, network } = raw;
|
|
12
|
+
const client = clientFor(network);
|
|
13
|
+
const [state, apys] = await Promise.all([
|
|
14
|
+
client.getLatestSuiSystemState(),
|
|
15
|
+
client.getValidatorsApy(),
|
|
16
|
+
]);
|
|
17
|
+
const v = state.activeValidators.find((x) => x.suiAddress === validator_address);
|
|
18
|
+
if (!v) {
|
|
19
|
+
throw new Error(`Validator ${validator_address} not in the active set on ${network} (epoch ${state.epoch}). Use sui_get_validators to list.`);
|
|
20
|
+
}
|
|
21
|
+
const apyRow = apys.apys.find((a) => a.address === validator_address);
|
|
22
|
+
const apy = apyRow?.apy ?? null;
|
|
23
|
+
return JSON.stringify({
|
|
24
|
+
network,
|
|
25
|
+
epoch: state.epoch,
|
|
26
|
+
name: v.name,
|
|
27
|
+
validator_address: v.suiAddress,
|
|
28
|
+
description: v.description,
|
|
29
|
+
image_url: v.imageUrl,
|
|
30
|
+
project_url: v.projectUrl,
|
|
31
|
+
commission_rate_bps: Number(v.commissionRate),
|
|
32
|
+
commission_percent: Number(v.commissionRate) / 100,
|
|
33
|
+
staking_pool_id: v.stakingPoolId,
|
|
34
|
+
staking_pool_sui_balance_mist: v.stakingPoolSuiBalance,
|
|
35
|
+
staking_pool_sui_balance_sui: toSui(v.stakingPoolSuiBalance),
|
|
36
|
+
next_epoch_stake_mist: v.nextEpochStake,
|
|
37
|
+
voting_power: Number(v.votingPower),
|
|
38
|
+
apy,
|
|
39
|
+
apy_percent: apy !== null ? Number((apy * 100).toFixed(4)) : null,
|
|
40
|
+
note: 'apy is a fraction (0.041 = 4.1%); commission_rate_bps is basis points (10000 = 100%).',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=sui_get_validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_validator.js","sourceRoot":"","sources":["../../src/tools/sui_get_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D,MAAM,KAAK,GAAG,CAAC,IAA8B,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;AAE7E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY;IAChD,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACnD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtC,MAAM,CAAC,uBAAuB,EAAE;QAChC,MAAM,CAAC,gBAAgB,EAAE;KAC1B,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,iBAAiB,CAAC,CAAC;IACjF,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CACb,aAAa,iBAAiB,6BAA6B,OAAO,WAAW,KAAK,CAAC,KAAK,oCAAoC,CAC7H,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC;IAEhC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,iBAAiB,EAAE,CAAC,CAAC,UAAU;QAC/B,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,SAAS,EAAE,CAAC,CAAC,QAAQ;QACrB,WAAW,EAAE,CAAC,CAAC,UAAU;QACzB,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QAC7C,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,GAAG;QAClD,eAAe,EAAE,CAAC,CAAC,aAAa;QAChC,6BAA6B,EAAE,CAAC,CAAC,qBAAqB;QACtD,4BAA4B,EAAE,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC;QAC5D,qBAAqB,EAAE,CAAC,CAAC,cAAc;QACvC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QACnC,GAAG;QACH,WAAW,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACjE,IAAI,EAAE,uFAAuF;KAC9F,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The active validator set plus epoch context, from the Sui system state.
|
|
3
|
+
* Read-only. Gives a staking app the human-readable name, the staking
|
|
4
|
+
* address to pass to sui_stake, the commission rate (validators keep a cut
|
|
5
|
+
* of rewards), and the total stake behind each validator. Combine with
|
|
6
|
+
* sui_get_validators_apy (matched on validator_address) to render a full
|
|
7
|
+
* "pick a validator" table: name + APY + commission + size.
|
|
8
|
+
*/
|
|
9
|
+
export declare function suiGetValidators(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
const toSui = (mist) => Number(BigInt(mist)) / 1e9;
|
|
3
|
+
/**
|
|
4
|
+
* The active validator set plus epoch context, from the Sui system state.
|
|
5
|
+
* Read-only. Gives a staking app the human-readable name, the staking
|
|
6
|
+
* address to pass to sui_stake, the commission rate (validators keep a cut
|
|
7
|
+
* of rewards), and the total stake behind each validator. Combine with
|
|
8
|
+
* sui_get_validators_apy (matched on validator_address) to render a full
|
|
9
|
+
* "pick a validator" table: name + APY + commission + size.
|
|
10
|
+
*/
|
|
11
|
+
export async function suiGetValidators(raw) {
|
|
12
|
+
const { network, limit } = raw;
|
|
13
|
+
const client = clientFor(network);
|
|
14
|
+
const state = await client.getLatestSuiSystemState();
|
|
15
|
+
let validators = state.activeValidators.map((v) => ({
|
|
16
|
+
name: v.name,
|
|
17
|
+
validator_address: v.suiAddress,
|
|
18
|
+
description: v.description,
|
|
19
|
+
image_url: v.imageUrl,
|
|
20
|
+
project_url: v.projectUrl,
|
|
21
|
+
commission_rate_bps: Number(v.commissionRate),
|
|
22
|
+
commission_percent: Number(v.commissionRate) / 100,
|
|
23
|
+
staking_pool_sui_balance_mist: v.stakingPoolSuiBalance,
|
|
24
|
+
staking_pool_sui_balance_sui: toSui(v.stakingPoolSuiBalance),
|
|
25
|
+
next_epoch_stake_mist: v.nextEpochStake,
|
|
26
|
+
voting_power: Number(v.votingPower),
|
|
27
|
+
}));
|
|
28
|
+
// Largest first — a reasonable default for a validator picker.
|
|
29
|
+
validators.sort((a, b) => Number(BigInt(b.staking_pool_sui_balance_mist) - BigInt(a.staking_pool_sui_balance_mist)));
|
|
30
|
+
if (typeof limit === 'number') {
|
|
31
|
+
validators = validators.slice(0, limit);
|
|
32
|
+
}
|
|
33
|
+
return JSON.stringify({
|
|
34
|
+
network,
|
|
35
|
+
epoch: state.epoch,
|
|
36
|
+
protocol_version: state.protocolVersion,
|
|
37
|
+
epoch_start_timestamp_ms: state.epochStartTimestampMs,
|
|
38
|
+
epoch_duration_ms: state.epochDurationMs,
|
|
39
|
+
total_stake_mist: state.totalStake,
|
|
40
|
+
total_stake_sui: toSui(state.totalStake),
|
|
41
|
+
active_validator_count: state.activeValidators.length,
|
|
42
|
+
validators,
|
|
43
|
+
note: 'commission_rate_bps is in basis points (10000 = 100%). validator_address is what sui_stake expects. Match validator_address against sui_get_validators_apy for APY.',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=sui_get_validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_get_validators.js","sourceRoot":"","sources":["../../src/tools/sui_get_validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D,MAAM,KAAK,GAAG,CAAC,IAA8B,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;AAE7E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY;IACjD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAW,CAAC;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,uBAAuB,EAAE,CAAC;IAErD,IAAI,UAAU,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,iBAAiB,EAAE,CAAC,CAAC,UAAU;QAC/B,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,SAAS,EAAE,CAAC,CAAC,QAAQ;QACrB,WAAW,EAAE,CAAC,CAAC,UAAU;QACzB,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QAC7C,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,GAAG;QAClD,6BAA6B,EAAE,CAAC,CAAC,qBAAqB;QACtD,4BAA4B,EAAE,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC;QAC5D,qBAAqB,EAAE,CAAC,CAAC,cAAc;QACvC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;KACpC,CAAC,CAAC,CAAC;IAEJ,+DAA+D;IAC/D,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAC5F,CAAC;IACF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,gBAAgB,EAAE,KAAK,CAAC,eAAe;QACvC,wBAAwB,EAAE,KAAK,CAAC,qBAAqB;QACrD,iBAAiB,EAAE,KAAK,CAAC,eAAe;QACxC,gBAAgB,EAAE,KAAK,CAAC,UAAU;QAClC,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;QACxC,sBAAsB,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM;QACrD,UAAU;QACV,IAAI,EAAE,qKAAqK;KAC5K,CAAC,CAAC;AACL,CAAC"}
|