@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,64 @@
|
|
|
1
|
+
import { SuiClient, getFullnodeUrl } from '@mysten/sui/client';
|
|
2
|
+
import { SuiGrpcClient } from '@mysten/sui/grpc';
|
|
3
|
+
/**
|
|
4
|
+
* Transport seam for the Sui Stack.
|
|
5
|
+
*
|
|
6
|
+
* Sui is deprecating public JSON-RPC fullnode endpoints (~mid-2026) in
|
|
7
|
+
* favour of gRPC and GraphQL. This file is the single place transport is
|
|
8
|
+
* chosen, so the rest of the toolkit never imports a client directly.
|
|
9
|
+
*
|
|
10
|
+
* Why JSON-RPC is still the default for `clientFor()`:
|
|
11
|
+
* building a transaction with `tx.build({ client })` needs *transaction
|
|
12
|
+
* resolution* (resolving object refs and gas coins). As of @mysten/sui
|
|
13
|
+
* 1.45.x that is implemented only for the JSON-RPC `SuiClient`. Verified
|
|
14
|
+
* against testnet:
|
|
15
|
+
* - SuiGrpcClient → "Transaction resolution is not supported with
|
|
16
|
+
* the GRPC client"
|
|
17
|
+
* - SuiGraphQLClient → "GraphQL client does not support transaction
|
|
18
|
+
* resolution yet"
|
|
19
|
+
* So every transaction-building tool (move_call, transfer, stake,
|
|
20
|
+
* unstake, mint_badge) must stay on JSON-RPC until the SDK ships build
|
|
21
|
+
* support over gRPC/GraphQL.
|
|
22
|
+
*
|
|
23
|
+
* Migration trigger: once `tx.build({ client: grpcClientFor(net) })`
|
|
24
|
+
* succeeds on a current SDK, switch `clientFor` to return the gRPC client
|
|
25
|
+
* and delete this note. Reads already work over gRPC today via
|
|
26
|
+
* `grpcClientFor()` below — wire individual read tools to it whenever we
|
|
27
|
+
* choose to move them off JSON-RPC ahead of the cutoff.
|
|
28
|
+
*/
|
|
29
|
+
/** gRPC-web fullnode endpoints, by network. */
|
|
30
|
+
const GRPC_URL = {
|
|
31
|
+
testnet: 'https://fullnode.testnet.sui.io:443',
|
|
32
|
+
mainnet: 'https://fullnode.mainnet.sui.io:443',
|
|
33
|
+
devnet: 'https://fullnode.devnet.sui.io:443',
|
|
34
|
+
};
|
|
35
|
+
const jsonRpcCache = new Map();
|
|
36
|
+
const grpcCache = new Map();
|
|
37
|
+
/**
|
|
38
|
+
* The build-capable client every tool uses today. JSON-RPC until the SDK
|
|
39
|
+
* supports transaction resolution over gRPC/GraphQL (see note above).
|
|
40
|
+
*/
|
|
41
|
+
export function clientFor(network) {
|
|
42
|
+
let c = jsonRpcCache.get(network);
|
|
43
|
+
if (!c) {
|
|
44
|
+
c = new SuiClient({ url: getFullnodeUrl(network) });
|
|
45
|
+
jsonRpcCache.set(network, c);
|
|
46
|
+
}
|
|
47
|
+
return c;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* gRPC client — the forward-looking transport. Reads (balances, coins,
|
|
51
|
+
* owned objects, dynamic fields, gas price, getTransaction, dryRun,
|
|
52
|
+
* execute) work today; transaction *building* does not yet. Exposed so
|
|
53
|
+
* read tools can migrate incrementally and so the eventual cutover is a
|
|
54
|
+
* one-line change in `clientFor`.
|
|
55
|
+
*/
|
|
56
|
+
export function grpcClientFor(network) {
|
|
57
|
+
let c = grpcCache.get(network);
|
|
58
|
+
if (!c) {
|
|
59
|
+
c = new SuiGrpcClient({ network, baseUrl: GRPC_URL[network] });
|
|
60
|
+
grpcCache.set(network, c);
|
|
61
|
+
}
|
|
62
|
+
return c;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=sui-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui-client.js","sourceRoot":"","sources":["../src/sui-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,+CAA+C;AAC/C,MAAM,QAAQ,GAA4B;IACxC,OAAO,EAAE,qCAAqC;IAC9C,OAAO,EAAE,qCAAqC;IAC9C,MAAM,EAAE,oCAAoC;CAC7C,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;AACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,SAAS,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/D,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build (do not sign) a tx that funds an agent wallet: split `amount_mist`
|
|
3
|
+
* from the owner's gas coin and send it to the agent address. The owner
|
|
4
|
+
* signs this (a real wallet / connected signer); the agent never touches
|
|
5
|
+
* the owner's key.
|
|
6
|
+
*
|
|
7
|
+
* This is the "allowance" in the Tier-1 agent wallet: the agent's spending
|
|
8
|
+
* power is bounded by whatever the owner funds here. Top up by funding
|
|
9
|
+
* again; cut the agent off with agent_wallet_sweep.
|
|
10
|
+
*/
|
|
11
|
+
export declare function agentWalletFund(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
|
+
import { clientFor } from '../sui-client.js';
|
|
3
|
+
import { buildToB64 } from '../tx.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build (do not sign) a tx that funds an agent wallet: split `amount_mist`
|
|
6
|
+
* from the owner's gas coin and send it to the agent address. The owner
|
|
7
|
+
* signs this (a real wallet / connected signer); the agent never touches
|
|
8
|
+
* the owner's key.
|
|
9
|
+
*
|
|
10
|
+
* This is the "allowance" in the Tier-1 agent wallet: the agent's spending
|
|
11
|
+
* power is bounded by whatever the owner funds here. Top up by funding
|
|
12
|
+
* again; cut the agent off with agent_wallet_sweep.
|
|
13
|
+
*/
|
|
14
|
+
export async function agentWalletFund(raw) {
|
|
15
|
+
const { owner, agent, amount_mist, network } = raw;
|
|
16
|
+
const client = clientFor(network);
|
|
17
|
+
const tx = new Transaction();
|
|
18
|
+
tx.setSender(owner);
|
|
19
|
+
const [coin] = tx.splitCoins(tx.gas, [tx.pure.u64(BigInt(amount_mist))]);
|
|
20
|
+
tx.transferObjects([coin], tx.pure.address(agent));
|
|
21
|
+
const tx_bytes_base64 = await buildToB64(tx, client);
|
|
22
|
+
return JSON.stringify({
|
|
23
|
+
tx_bytes_base64,
|
|
24
|
+
owner,
|
|
25
|
+
agent,
|
|
26
|
+
amount_mist,
|
|
27
|
+
network,
|
|
28
|
+
next_step: 'Owner signs and submits with sui_execute_signed_tx. After it lands, the agent wallet can spend up to its balance.',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=agent_wallet_fund.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent_wallet_fund.js","sourceRoot":"","sources":["../../src/tools/agent_wallet_fund.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY;IAChD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnD,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe;QACf,KAAK;QACL,KAAK;QACL,WAAW;QACX,OAAO;QACP,SAAS,EACP,mHAAmH;KACtH,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read an agent wallet's spendable state: native SUI balance and how many
|
|
3
|
+
* coin objects back it. Read-only. Use before asking the agent to spend,
|
|
4
|
+
* to confirm the allowance is funded and isn't empty.
|
|
5
|
+
*/
|
|
6
|
+
export declare function agentWalletStatus(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Read an agent wallet's spendable state: native SUI balance and how many
|
|
4
|
+
* coin objects back it. Read-only. Use before asking the agent to spend,
|
|
5
|
+
* to confirm the allowance is funded and isn't empty.
|
|
6
|
+
*/
|
|
7
|
+
export async function agentWalletStatus(raw) {
|
|
8
|
+
const { agent, network } = raw;
|
|
9
|
+
const client = clientFor(network);
|
|
10
|
+
const balance = await client.getBalance({ owner: agent });
|
|
11
|
+
const mist = BigInt(balance.totalBalance);
|
|
12
|
+
return JSON.stringify({
|
|
13
|
+
agent,
|
|
14
|
+
network,
|
|
15
|
+
balance_mist: balance.totalBalance,
|
|
16
|
+
balance_sui: Number(mist) / 1e9,
|
|
17
|
+
coin_object_count: balance.coinObjectCount,
|
|
18
|
+
funded: mist > 0n,
|
|
19
|
+
note: 'Fund with agent_wallet_fund (owner-signed); drain with agent_wallet_sweep.',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=agent_wallet_status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent_wallet_status.js","sourceRoot":"","sources":["../../src/tools/agent_wallet_status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAY;IAClD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1C,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,KAAK;QACL,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG;QAC/B,iBAAiB,EAAE,OAAO,CAAC,eAAe;QAC1C,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,IAAI,EAAE,4EAA4E;KACnF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build (do not sign) the agent-wallet kill switch: send the agent's
|
|
3
|
+
* entire native SUI balance back to the owner. Transferring the gas coin
|
|
4
|
+
* moves its leftover (the whole balance minus gas) to the owner, emptying
|
|
5
|
+
* the wallet. Pass `object_ids` to also pull back specific non-SUI objects.
|
|
6
|
+
*
|
|
7
|
+
* The agent signs this with its own key (or the host signs on its behalf).
|
|
8
|
+
* Sweeping is how an owner revokes a Tier-1 allowance wallet: drain it and
|
|
9
|
+
* stop funding it.
|
|
10
|
+
*/
|
|
11
|
+
export declare function agentWalletSweep(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
|
+
import { clientFor } from '../sui-client.js';
|
|
3
|
+
import { buildToB64 } from '../tx.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build (do not sign) the agent-wallet kill switch: send the agent's
|
|
6
|
+
* entire native SUI balance back to the owner. Transferring the gas coin
|
|
7
|
+
* moves its leftover (the whole balance minus gas) to the owner, emptying
|
|
8
|
+
* the wallet. Pass `object_ids` to also pull back specific non-SUI objects.
|
|
9
|
+
*
|
|
10
|
+
* The agent signs this with its own key (or the host signs on its behalf).
|
|
11
|
+
* Sweeping is how an owner revokes a Tier-1 allowance wallet: drain it and
|
|
12
|
+
* stop funding it.
|
|
13
|
+
*/
|
|
14
|
+
export async function agentWalletSweep(raw) {
|
|
15
|
+
const { agent, owner, object_ids, network } = raw;
|
|
16
|
+
const client = clientFor(network);
|
|
17
|
+
const tx = new Transaction();
|
|
18
|
+
tx.setSender(agent);
|
|
19
|
+
// Transferring the gas coin sends its remaining balance (after gas) to
|
|
20
|
+
// the owner — i.e. sweeps all native SUI.
|
|
21
|
+
const toMove = [tx.gas, ...(object_ids ?? []).map((id) => tx.object(id))];
|
|
22
|
+
tx.transferObjects(toMove, tx.pure.address(owner));
|
|
23
|
+
const tx_bytes_base64 = await buildToB64(tx, client);
|
|
24
|
+
return JSON.stringify({
|
|
25
|
+
tx_bytes_base64,
|
|
26
|
+
agent,
|
|
27
|
+
owner,
|
|
28
|
+
object_ids: object_ids ?? [],
|
|
29
|
+
network,
|
|
30
|
+
note: 'Sweeps all native SUI (via the gas coin leftover) plus any object_ids back to the owner.',
|
|
31
|
+
next_step: 'Sign with the agent key and submit with sui_execute_signed_tx.',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=agent_wallet_sweep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent_wallet_sweep.js","sourceRoot":"","sources":["../../src/tools/agent_wallet_sweep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY;IACjD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpB,uEAAuE;IACvE,0CAA0C;IAC1C,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnD,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe;QACf,KAAK;QACL,KAAK;QACL,UAAU,EAAE,UAAU,IAAI,EAAE;QAC5B,OAAO;QACP,IAAI,EAAE,0FAA0F;QAChG,SAAS,EAAE,gEAAgE;KAC5E,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decode unsigned tx bytes (from any builder tool) back into a structured,
|
|
3
|
+
* human-readable summary: sender, gas data, inputs, and a step-by-step
|
|
4
|
+
* list of commands ("split N MIST from gas", "transfer to 0x…",
|
|
5
|
+
* "call pkg::module::function with [args]").
|
|
6
|
+
*
|
|
7
|
+
* The "look before you sign" tool. A wallet shows the user what they're
|
|
8
|
+
* authorising; this lets an agent — or a person reading the agent's
|
|
9
|
+
* output — verify a built tx matches the stated intent. Pairs naturally
|
|
10
|
+
* with sui_dry_run for cost; this one is about *meaning*.
|
|
11
|
+
*
|
|
12
|
+
* Works offline (no RPC). All addresses are kept full-form so the caller
|
|
13
|
+
* can match them against expected values.
|
|
14
|
+
*/
|
|
15
|
+
export declare function suiDecodeTxBytes(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
|
+
import { bcs } from '@mysten/sui/bcs';
|
|
3
|
+
/**
|
|
4
|
+
* Decode unsigned tx bytes (from any builder tool) back into a structured,
|
|
5
|
+
* human-readable summary: sender, gas data, inputs, and a step-by-step
|
|
6
|
+
* list of commands ("split N MIST from gas", "transfer to 0x…",
|
|
7
|
+
* "call pkg::module::function with [args]").
|
|
8
|
+
*
|
|
9
|
+
* The "look before you sign" tool. A wallet shows the user what they're
|
|
10
|
+
* authorising; this lets an agent — or a person reading the agent's
|
|
11
|
+
* output — verify a built tx matches the stated intent. Pairs naturally
|
|
12
|
+
* with sui_dry_run for cost; this one is about *meaning*.
|
|
13
|
+
*
|
|
14
|
+
* Works offline (no RPC). All addresses are kept full-form so the caller
|
|
15
|
+
* can match them against expected values.
|
|
16
|
+
*/
|
|
17
|
+
export async function suiDecodeTxBytes(raw) {
|
|
18
|
+
const { tx_bytes_base64 } = raw;
|
|
19
|
+
const bytes = new Uint8Array(Buffer.from(tx_bytes_base64, 'base64'));
|
|
20
|
+
const tx = Transaction.from(bytes);
|
|
21
|
+
const data = tx.getData();
|
|
22
|
+
const inputs = data.inputs.map((input, i) => describeInput(input, i));
|
|
23
|
+
const commands = data.commands.map((c, i) => {
|
|
24
|
+
const kind = c.$kind;
|
|
25
|
+
return { index: i, kind, summary: describeCommand(c, inputs), raw: c };
|
|
26
|
+
});
|
|
27
|
+
return JSON.stringify({
|
|
28
|
+
sender: data.sender,
|
|
29
|
+
gas_data: {
|
|
30
|
+
budget: data.gasData.budget,
|
|
31
|
+
price: data.gasData.price,
|
|
32
|
+
owner: data.gasData.owner,
|
|
33
|
+
payment_count: data.gasData.payment?.length ?? 0,
|
|
34
|
+
},
|
|
35
|
+
expiration: data.expiration,
|
|
36
|
+
inputs,
|
|
37
|
+
command_count: commands.length,
|
|
38
|
+
commands,
|
|
39
|
+
plain_english: commands.map((c) => `${c.index + 1}. ${c.summary}`).join('\n'),
|
|
40
|
+
note: 'Decoded from BCS offline. Compare against the agent’s stated intent before signing.',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function describeInput(input, i) {
|
|
44
|
+
const kind = input.$kind;
|
|
45
|
+
if (kind === 'Pure') {
|
|
46
|
+
const b64 = input.Pure.bytes;
|
|
47
|
+
const raw = new Uint8Array(Buffer.from(b64, 'base64'));
|
|
48
|
+
const guess = guessPure(raw);
|
|
49
|
+
return { index: i, kind: 'Pure', value: guess.value, pretty: guess.pretty };
|
|
50
|
+
}
|
|
51
|
+
if (kind === 'Object') {
|
|
52
|
+
const inner = input.Object;
|
|
53
|
+
const objKind = inner.$kind;
|
|
54
|
+
const objectId = inner.ImmOrOwnedObject?.objectId ??
|
|
55
|
+
inner.SharedObject?.objectId ??
|
|
56
|
+
inner.Receiving?.objectId ??
|
|
57
|
+
null;
|
|
58
|
+
return {
|
|
59
|
+
index: i,
|
|
60
|
+
kind: `Object/${objKind}`,
|
|
61
|
+
value: objectId,
|
|
62
|
+
pretty: objectId ? `object ${objectId}` : `object (${objKind})`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return { index: i, kind, value: input, pretty: `${kind} (raw)` };
|
|
66
|
+
}
|
|
67
|
+
function guessPure(bytes) {
|
|
68
|
+
// Addresses / object ids are 32 bytes; u64s are 8.
|
|
69
|
+
if (bytes.length === 32) {
|
|
70
|
+
const hex = '0x' + Buffer.from(bytes).toString('hex');
|
|
71
|
+
return { value: hex, pretty: `address ${hex}` };
|
|
72
|
+
}
|
|
73
|
+
if (bytes.length === 8) {
|
|
74
|
+
try {
|
|
75
|
+
const n = bcs.U64.parse(bytes);
|
|
76
|
+
return { value: n.toString(), pretty: `u64 ${n.toString()}` };
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
/* fall through */
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (bytes.length === 1)
|
|
83
|
+
return { value: bytes[0], pretty: `u8 ${bytes[0]}` };
|
|
84
|
+
// Best effort: try utf-8
|
|
85
|
+
const text = Buffer.from(bytes).toString('utf8');
|
|
86
|
+
if (/^[\x20-\x7e]+$/.test(text))
|
|
87
|
+
return { value: text, pretty: `string \"${text}\"` };
|
|
88
|
+
return {
|
|
89
|
+
value: Buffer.from(bytes).toString('hex'),
|
|
90
|
+
pretty: `bytes 0x${Buffer.from(bytes).toString('hex')}`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function describeCommand(cmd, inputs) {
|
|
94
|
+
const kind = cmd.$kind;
|
|
95
|
+
const refStr = (ref) => {
|
|
96
|
+
if (!ref || typeof ref !== 'object')
|
|
97
|
+
return String(ref);
|
|
98
|
+
const k = ref.$kind;
|
|
99
|
+
if (k === 'Input')
|
|
100
|
+
return inputs[ref.Input]?.pretty ?? `input#${ref.Input}`;
|
|
101
|
+
if (k === 'GasCoin')
|
|
102
|
+
return 'gas coin';
|
|
103
|
+
if (k === 'Result')
|
|
104
|
+
return `result#${ref.Result}`;
|
|
105
|
+
if (k === 'NestedResult') {
|
|
106
|
+
const nr = ref.NestedResult;
|
|
107
|
+
return `command#${nr[0]} result[${nr[1]}]`;
|
|
108
|
+
}
|
|
109
|
+
return k;
|
|
110
|
+
};
|
|
111
|
+
if (kind === 'SplitCoins') {
|
|
112
|
+
const c = cmd.SplitCoins;
|
|
113
|
+
return `Split [${c.amounts.map(refStr).join(', ')}] MIST from ${refStr(c.coin)}.`;
|
|
114
|
+
}
|
|
115
|
+
if (kind === 'TransferObjects') {
|
|
116
|
+
const c = cmd.TransferObjects;
|
|
117
|
+
return `Transfer [${c.objects.map(refStr).join(', ')}] to ${refStr(c.address)}.`;
|
|
118
|
+
}
|
|
119
|
+
if (kind === 'MergeCoins') {
|
|
120
|
+
const c = cmd.MergeCoins;
|
|
121
|
+
return `Merge [${c.sources.map(refStr).join(', ')}] into ${refStr(c.destination)}.`;
|
|
122
|
+
}
|
|
123
|
+
if (kind === 'MoveCall') {
|
|
124
|
+
const c = cmd.MoveCall;
|
|
125
|
+
const target = `${c.package}::${c.module}::${c.function}`;
|
|
126
|
+
const types = c.typeArguments?.length ? `<${c.typeArguments.join(', ')}>` : '';
|
|
127
|
+
const args = c.arguments?.map(refStr).join(', ') ?? '';
|
|
128
|
+
return `Call ${target}${types}(${args}).`;
|
|
129
|
+
}
|
|
130
|
+
if (kind === 'MakeMoveVec') {
|
|
131
|
+
const c = cmd.MakeMoveVec;
|
|
132
|
+
return `Make Move vector${c.type ? ` of ${c.type}` : ''} from [${c.elements.map(refStr).join(', ')}].`;
|
|
133
|
+
}
|
|
134
|
+
if (kind === 'Publish')
|
|
135
|
+
return `Publish a new Move package.`;
|
|
136
|
+
if (kind === 'Upgrade')
|
|
137
|
+
return `Upgrade an existing Move package.`;
|
|
138
|
+
return `${kind} (raw)`;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=sui_decode_tx_bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_decode_tx_bytes.js","sourceRoot":"","sources":["../../src/tools/sui_decode_tx_bytes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only DeepBook v3 quote. Calls pool::get_quote_quantity_out (selling
|
|
3
|
+
* base) or get_base_quantity_out (selling quote) via devInspect — no gas,
|
|
4
|
+
* no signing, no funds. Returns the expected output and the DEEP fee
|
|
5
|
+
* required, so an agent can size min_out for sui_deepbook_swap before
|
|
6
|
+
* building the real transaction.
|
|
7
|
+
*
|
|
8
|
+
* All values are raw smallest-units (matching sui_deepbook_swap), so the
|
|
9
|
+
* quote's expected_out can be fed straight into the swap's min_out (minus
|
|
10
|
+
* whatever slippage the agent chooses).
|
|
11
|
+
*/
|
|
12
|
+
export declare function suiDeepbookQuote(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
|
+
import { bcs } from '@mysten/sui/bcs';
|
|
3
|
+
import { clientFor } from '../sui-client.js';
|
|
4
|
+
import { DEEPBOOK_PACKAGE_ID, POOLS } from '../deepbook.js';
|
|
5
|
+
/**
|
|
6
|
+
* Read-only DeepBook v3 quote. Calls pool::get_quote_quantity_out (selling
|
|
7
|
+
* base) or get_base_quantity_out (selling quote) via devInspect — no gas,
|
|
8
|
+
* no signing, no funds. Returns the expected output and the DEEP fee
|
|
9
|
+
* required, so an agent can size min_out for sui_deepbook_swap before
|
|
10
|
+
* building the real transaction.
|
|
11
|
+
*
|
|
12
|
+
* All values are raw smallest-units (matching sui_deepbook_swap), so the
|
|
13
|
+
* quote's expected_out can be fed straight into the swap's min_out (minus
|
|
14
|
+
* whatever slippage the agent chooses).
|
|
15
|
+
*/
|
|
16
|
+
export async function suiDeepbookQuote(raw) {
|
|
17
|
+
const a = raw;
|
|
18
|
+
const network = a.network;
|
|
19
|
+
const pkg = a.deepbook_package ?? DEEPBOOK_PACKAGE_ID[network];
|
|
20
|
+
if (!pkg)
|
|
21
|
+
throw new Error(`No DeepBook package for ${network}; pass deepbook_package.`);
|
|
22
|
+
const known = a.pool ? POOLS[network]?.[a.pool] : undefined;
|
|
23
|
+
const poolId = a.pool_id ?? known?.pool_id;
|
|
24
|
+
const baseType = a.base_type ?? known?.base_type;
|
|
25
|
+
const quoteType = a.quote_type ?? known?.quote_type;
|
|
26
|
+
if (!poolId || !baseType || !quoteType) {
|
|
27
|
+
throw new Error(`Unknown pool. Pass a known "pool" key for ${network} (${Object.keys(POOLS[network] ?? {}).join(', ') || 'none'}) or pass pool_id + base_type + quote_type.`);
|
|
28
|
+
}
|
|
29
|
+
const baseToQuote = a.direction === 'base_to_quote';
|
|
30
|
+
const fn = baseToQuote ? 'get_quote_quantity_out' : 'get_base_quantity_out';
|
|
31
|
+
const tx = new Transaction();
|
|
32
|
+
// devInspect needs a sender; any address works for a read. Use 0x0.
|
|
33
|
+
tx.setSender(a.sender ?? '0x0000000000000000000000000000000000000000000000000000000000000000');
|
|
34
|
+
tx.moveCall({
|
|
35
|
+
target: `${pkg}::pool::${fn}`,
|
|
36
|
+
arguments: [tx.object(poolId), tx.pure.u64(BigInt(a.amount)), tx.object.clock()],
|
|
37
|
+
typeArguments: [baseType, quoteType],
|
|
38
|
+
});
|
|
39
|
+
const client = clientFor(network);
|
|
40
|
+
const res = await client.devInspectTransactionBlock({
|
|
41
|
+
sender: a.sender ?? '0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
42
|
+
transactionBlock: tx,
|
|
43
|
+
});
|
|
44
|
+
const status = res.effects?.status?.status ?? 'unknown';
|
|
45
|
+
if (status !== 'success') {
|
|
46
|
+
throw new Error(`Quote inspect failed: ${res.effects?.status?.error ?? 'unknown error'}`);
|
|
47
|
+
}
|
|
48
|
+
const ret = res.results?.[0]?.returnValues;
|
|
49
|
+
if (!ret || ret.length < 3) {
|
|
50
|
+
throw new Error(`Unexpected quote result shape from ${fn}.`);
|
|
51
|
+
}
|
|
52
|
+
// Each returnValue is [bytes[], type]. Move returns (baseOut, quoteOut, deepRequired) as u64.
|
|
53
|
+
const u64 = (i) => bcs.U64.parse(Uint8Array.from(ret[i][0])).toString();
|
|
54
|
+
const baseOut = u64(0);
|
|
55
|
+
const quoteOut = u64(1);
|
|
56
|
+
const deepRequired = u64(2);
|
|
57
|
+
const expectedOut = baseToQuote ? quoteOut : baseOut;
|
|
58
|
+
return JSON.stringify({
|
|
59
|
+
network,
|
|
60
|
+
pool_id: poolId,
|
|
61
|
+
base_type: baseType,
|
|
62
|
+
quote_type: quoteType,
|
|
63
|
+
direction: a.direction,
|
|
64
|
+
amount_in: a.amount,
|
|
65
|
+
expected_out: expectedOut,
|
|
66
|
+
base_out: baseOut,
|
|
67
|
+
quote_out: quoteOut,
|
|
68
|
+
deep_required: deepRequired,
|
|
69
|
+
next_step: 'Use expected_out (minus your slippage) as min_out, and deep_required as deep_amount, in sui_deepbook_swap.',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=sui_deepbook_quote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_deepbook_quote.js","sourceRoot":"","sources":["../../src/tools/sui_deepbook_quote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build (do not sign) a DeepBook v3 market swap. Mirrors the exact PTB the
|
|
3
|
+
* official @mysten/deepbook-v3 SDK emits — pool::swap_exact_base_for_quote
|
|
4
|
+
* / swap_exact_quote_for_base — but on @mysten/sui v1, so the toolkit
|
|
5
|
+
* stays non-custodial and on its current SDK.
|
|
6
|
+
*
|
|
7
|
+
* Amounts are raw smallest-unit strings (like MIST): the caller handles
|
|
8
|
+
* decimals and picks min_out for slippage. The swap returns three coins
|
|
9
|
+
* (leftover base, output quote, leftover DEEP); we transfer all three back
|
|
10
|
+
* to the sender so nothing is dropped.
|
|
11
|
+
*
|
|
12
|
+
* DeepBook charges fees in DEEP. Whitelisted pools take deep_amount "0";
|
|
13
|
+
* others require the sender to hold DEEP (set deep_amount accordingly).
|
|
14
|
+
*/
|
|
15
|
+
export declare function suiDeepbookSwap(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
|
+
import { coinWithBalance } from '@mysten/sui/transactions';
|
|
3
|
+
import { clientFor } from '../sui-client.js';
|
|
4
|
+
import { buildToB64 } from '../tx.js';
|
|
5
|
+
import { DEEPBOOK_PACKAGE_ID, DEEP_TYPE, POOLS } from '../deepbook.js';
|
|
6
|
+
/**
|
|
7
|
+
* Build (do not sign) a DeepBook v3 market swap. Mirrors the exact PTB the
|
|
8
|
+
* official @mysten/deepbook-v3 SDK emits — pool::swap_exact_base_for_quote
|
|
9
|
+
* / swap_exact_quote_for_base — but on @mysten/sui v1, so the toolkit
|
|
10
|
+
* stays non-custodial and on its current SDK.
|
|
11
|
+
*
|
|
12
|
+
* Amounts are raw smallest-unit strings (like MIST): the caller handles
|
|
13
|
+
* decimals and picks min_out for slippage. The swap returns three coins
|
|
14
|
+
* (leftover base, output quote, leftover DEEP); we transfer all three back
|
|
15
|
+
* to the sender so nothing is dropped.
|
|
16
|
+
*
|
|
17
|
+
* DeepBook charges fees in DEEP. Whitelisted pools take deep_amount "0";
|
|
18
|
+
* others require the sender to hold DEEP (set deep_amount accordingly).
|
|
19
|
+
*/
|
|
20
|
+
export async function suiDeepbookSwap(raw) {
|
|
21
|
+
const a = raw;
|
|
22
|
+
const network = a.network;
|
|
23
|
+
const pkg = a.deepbook_package ?? DEEPBOOK_PACKAGE_ID[network];
|
|
24
|
+
const deepType = a.deep_type ?? DEEP_TYPE[network];
|
|
25
|
+
if (!pkg)
|
|
26
|
+
throw new Error(`No DeepBook package for ${network}; pass deepbook_package.`);
|
|
27
|
+
if (!deepType)
|
|
28
|
+
throw new Error(`No DEEP coin type for ${network}; pass deep_type.`);
|
|
29
|
+
// Resolve pool: explicit ids win, else look up the named pool.
|
|
30
|
+
const known = a.pool ? POOLS[network]?.[a.pool] : undefined;
|
|
31
|
+
const poolId = a.pool_id ?? known?.pool_id;
|
|
32
|
+
const baseType = a.base_type ?? known?.base_type;
|
|
33
|
+
const quoteType = a.quote_type ?? known?.quote_type;
|
|
34
|
+
if (!poolId || !baseType || !quoteType) {
|
|
35
|
+
throw new Error(`Unknown pool. Pass a known "pool" key for ${network} (${Object.keys(POOLS[network] ?? {}).join(', ') || 'none'}) or pass pool_id + base_type + quote_type.`);
|
|
36
|
+
}
|
|
37
|
+
const baseToQuote = a.direction === 'base_to_quote';
|
|
38
|
+
const inputType = baseToQuote ? baseType : quoteType;
|
|
39
|
+
const fn = baseToQuote ? 'swap_exact_base_for_quote' : 'swap_exact_quote_for_base';
|
|
40
|
+
const tx = new Transaction();
|
|
41
|
+
tx.setSender(a.sender);
|
|
42
|
+
const inputCoin = coinWithBalance({ type: inputType, balance: BigInt(a.amount) });
|
|
43
|
+
const deepCoin = coinWithBalance({ type: deepType, balance: BigInt(a.deep_amount) });
|
|
44
|
+
const [baseOut, quoteOut, deepOut] = tx.moveCall({
|
|
45
|
+
target: `${pkg}::pool::${fn}`,
|
|
46
|
+
arguments: [
|
|
47
|
+
tx.object(poolId),
|
|
48
|
+
inputCoin,
|
|
49
|
+
deepCoin,
|
|
50
|
+
tx.pure.u64(BigInt(a.min_out)),
|
|
51
|
+
tx.object.clock(),
|
|
52
|
+
],
|
|
53
|
+
typeArguments: [baseType, quoteType],
|
|
54
|
+
});
|
|
55
|
+
tx.transferObjects([baseOut, quoteOut, deepOut], tx.pure.address(a.sender));
|
|
56
|
+
const client = clientFor(network);
|
|
57
|
+
const tx_bytes_base64 = await buildToB64(tx, client);
|
|
58
|
+
return JSON.stringify({
|
|
59
|
+
tx_bytes_base64,
|
|
60
|
+
target: `${pkg}::pool::${fn}`,
|
|
61
|
+
pool_id: poolId,
|
|
62
|
+
base_type: baseType,
|
|
63
|
+
quote_type: quoteType,
|
|
64
|
+
direction: a.direction,
|
|
65
|
+
amount: a.amount,
|
|
66
|
+
min_out: a.min_out,
|
|
67
|
+
deep_amount: a.deep_amount,
|
|
68
|
+
network,
|
|
69
|
+
next_step: 'Dry-run with sui_dry_run to confirm output and gas, then sign and submit with sui_execute_signed_tx.',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=sui_deepbook_swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_deepbook_swap.js","sourceRoot":"","sources":["../../src/tools/sui_deepbook_swap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simulate a built (unsigned) transaction without spending gas. Returns
|
|
3
|
+
* the execution status, gas cost, and balance/object changes so an agent
|
|
4
|
+
* can verify a transaction before asking the host to sign it.
|
|
5
|
+
*/
|
|
6
|
+
export declare function suiDryRun(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
import { fromB64 } from '../tx.js';
|
|
3
|
+
/**
|
|
4
|
+
* Simulate a built (unsigned) transaction without spending gas. Returns
|
|
5
|
+
* the execution status, gas cost, and balance/object changes so an agent
|
|
6
|
+
* can verify a transaction before asking the host to sign it.
|
|
7
|
+
*/
|
|
8
|
+
export async function suiDryRun(raw) {
|
|
9
|
+
const { tx_bytes_base64, network } = raw;
|
|
10
|
+
const client = clientFor(network);
|
|
11
|
+
const res = await client.dryRunTransactionBlock({
|
|
12
|
+
transactionBlock: fromB64(tx_bytes_base64),
|
|
13
|
+
});
|
|
14
|
+
return JSON.stringify({
|
|
15
|
+
network,
|
|
16
|
+
status: res.effects.status.status,
|
|
17
|
+
error: res.effects.status.error ?? null,
|
|
18
|
+
gas_used: res.effects.gasUsed,
|
|
19
|
+
balance_changes: res.balanceChanges,
|
|
20
|
+
object_changes_count: res.objectChanges?.length ?? 0,
|
|
21
|
+
events_count: res.events?.length ?? 0,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=sui_dry_run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_dry_run.js","sourceRoot":"","sources":["../../src/tools/sui_dry_run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAOnC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAY;IAC1C,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACjD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC;QAC9C,gBAAgB,EAAE,OAAO,CAAC,eAAe,CAAC;KAC3C,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;QACjC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI;QACvC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;QAC7B,eAAe,EAAE,GAAG,CAAC,cAAc;QACnC,oBAAoB,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC;QACpD,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;KACtC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Submit a host-signed transaction. The toolkit never holds keys: the
|
|
3
|
+
* caller signs the bytes from a tx-builder tool elsewhere and passes the
|
|
4
|
+
* signature(s) here. Returns the digest and execution effects.
|
|
5
|
+
*/
|
|
6
|
+
export declare function suiExecuteSignedTx(raw: unknown): Promise<string>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { clientFor } from '../sui-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Submit a host-signed transaction. The toolkit never holds keys: the
|
|
4
|
+
* caller signs the bytes from a tx-builder tool elsewhere and passes the
|
|
5
|
+
* signature(s) here. Returns the digest and execution effects.
|
|
6
|
+
*/
|
|
7
|
+
export async function suiExecuteSignedTx(raw) {
|
|
8
|
+
const { tx_bytes_base64, signatures, network } = raw;
|
|
9
|
+
const client = clientFor(network);
|
|
10
|
+
const res = await client.executeTransactionBlock({
|
|
11
|
+
transactionBlock: tx_bytes_base64,
|
|
12
|
+
signature: signatures,
|
|
13
|
+
options: { showEffects: true, showEvents: true, showBalanceChanges: true },
|
|
14
|
+
});
|
|
15
|
+
return JSON.stringify({
|
|
16
|
+
network,
|
|
17
|
+
digest: res.digest,
|
|
18
|
+
status: res.effects?.status.status ?? 'unknown',
|
|
19
|
+
error: res.effects?.status.error ?? null,
|
|
20
|
+
gas_used: res.effects?.gasUsed ?? null,
|
|
21
|
+
balance_changes: res.balanceChanges ?? [],
|
|
22
|
+
events_count: res.events?.length ?? 0,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=sui_execute_signed_tx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sui_execute_signed_tx.js","sourceRoot":"","sources":["../../src/tools/sui_execute_signed_tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAQ3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAY;IACnD,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC;QAC/C,gBAAgB,EAAE,eAAe;QACjC,SAAS,EAAE,UAAU;QACrB,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,OAAO;QACP,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,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,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"}
|