@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.
Files changed (128) hide show
  1. package/README.md +199 -0
  2. package/dist/coins.d.ts +21 -0
  3. package/dist/coins.js +59 -0
  4. package/dist/coins.js.map +1 -0
  5. package/dist/deepbook.d.ts +20 -0
  6. package/dist/deepbook.js +63 -0
  7. package/dist/deepbook.js.map +1 -0
  8. package/dist/http.d.ts +24 -0
  9. package/dist/http.js +42 -0
  10. package/dist/http.js.map +1 -0
  11. package/dist/index.d.ts +14 -0
  12. package/dist/index.js +19 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/node.d.ts +12 -0
  15. package/dist/node.js +54 -0
  16. package/dist/node.js.map +1 -0
  17. package/dist/serve.d.ts +13 -0
  18. package/dist/serve.js +25 -0
  19. package/dist/serve.js.map +1 -0
  20. package/dist/server.d.ts +20 -0
  21. package/dist/server.js +569 -0
  22. package/dist/server.js.map +1 -0
  23. package/dist/sui-client.d.ts +16 -0
  24. package/dist/sui-client.js +64 -0
  25. package/dist/sui-client.js.map +1 -0
  26. package/dist/tools/agent_wallet_fund.d.ts +11 -0
  27. package/dist/tools/agent_wallet_fund.js +31 -0
  28. package/dist/tools/agent_wallet_fund.js.map +1 -0
  29. package/dist/tools/agent_wallet_status.d.ts +6 -0
  30. package/dist/tools/agent_wallet_status.js +22 -0
  31. package/dist/tools/agent_wallet_status.js.map +1 -0
  32. package/dist/tools/agent_wallet_sweep.d.ts +11 -0
  33. package/dist/tools/agent_wallet_sweep.js +34 -0
  34. package/dist/tools/agent_wallet_sweep.js.map +1 -0
  35. package/dist/tools/sui_decode_tx_bytes.d.ts +15 -0
  36. package/dist/tools/sui_decode_tx_bytes.js +140 -0
  37. package/dist/tools/sui_decode_tx_bytes.js.map +1 -0
  38. package/dist/tools/sui_deepbook_quote.d.ts +12 -0
  39. package/dist/tools/sui_deepbook_quote.js +72 -0
  40. package/dist/tools/sui_deepbook_quote.js.map +1 -0
  41. package/dist/tools/sui_deepbook_swap.d.ts +15 -0
  42. package/dist/tools/sui_deepbook_swap.js +72 -0
  43. package/dist/tools/sui_deepbook_swap.js.map +1 -0
  44. package/dist/tools/sui_dry_run.d.ts +6 -0
  45. package/dist/tools/sui_dry_run.js +24 -0
  46. package/dist/tools/sui_dry_run.js.map +1 -0
  47. package/dist/tools/sui_execute_signed_tx.d.ts +6 -0
  48. package/dist/tools/sui_execute_signed_tx.js +25 -0
  49. package/dist/tools/sui_execute_signed_tx.js.map +1 -0
  50. package/dist/tools/sui_get_all_balances.d.ts +5 -0
  51. package/dist/tools/sui_get_all_balances.js +21 -0
  52. package/dist/tools/sui_get_all_balances.js.map +1 -0
  53. package/dist/tools/sui_get_balance.d.ts +1 -0
  54. package/dist/tools/sui_get_balance.js +17 -0
  55. package/dist/tools/sui_get_balance.js.map +1 -0
  56. package/dist/tools/sui_get_coin_metadata.d.ts +10 -0
  57. package/dist/tools/sui_get_coin_metadata.js +38 -0
  58. package/dist/tools/sui_get_coin_metadata.js.map +1 -0
  59. package/dist/tools/sui_get_coins.d.ts +6 -0
  60. package/dist/tools/sui_get_coins.js +31 -0
  61. package/dist/tools/sui_get_coins.js.map +1 -0
  62. package/dist/tools/sui_get_dynamic_fields.d.ts +6 -0
  63. package/dist/tools/sui_get_dynamic_fields.js +30 -0
  64. package/dist/tools/sui_get_dynamic_fields.js.map +1 -0
  65. package/dist/tools/sui_get_object.d.ts +5 -0
  66. package/dist/tools/sui_get_object.js +37 -0
  67. package/dist/tools/sui_get_object.js.map +1 -0
  68. package/dist/tools/sui_get_owned_badges.d.ts +1 -0
  69. package/dist/tools/sui_get_owned_badges.js +64 -0
  70. package/dist/tools/sui_get_owned_badges.js.map +1 -0
  71. package/dist/tools/sui_get_owned_objects.d.ts +5 -0
  72. package/dist/tools/sui_get_owned_objects.js +32 -0
  73. package/dist/tools/sui_get_owned_objects.js.map +1 -0
  74. package/dist/tools/sui_get_reference_gas_price.d.ts +5 -0
  75. package/dist/tools/sui_get_reference_gas_price.js +15 -0
  76. package/dist/tools/sui_get_reference_gas_price.js.map +1 -0
  77. package/dist/tools/sui_get_stakes.d.ts +11 -0
  78. package/dist/tools/sui_get_stakes.js +54 -0
  79. package/dist/tools/sui_get_stakes.js.map +1 -0
  80. package/dist/tools/sui_get_transaction.d.ts +6 -0
  81. package/dist/tools/sui_get_transaction.js +26 -0
  82. package/dist/tools/sui_get_transaction.js.map +1 -0
  83. package/dist/tools/sui_get_validator.d.ts +8 -0
  84. package/dist/tools/sui_get_validator.js +43 -0
  85. package/dist/tools/sui_get_validator.js.map +1 -0
  86. package/dist/tools/sui_get_validators.d.ts +9 -0
  87. package/dist/tools/sui_get_validators.js +46 -0
  88. package/dist/tools/sui_get_validators.js.map +1 -0
  89. package/dist/tools/sui_get_validators_apy.d.ts +10 -0
  90. package/dist/tools/sui_get_validators_apy.js +37 -0
  91. package/dist/tools/sui_get_validators_apy.js.map +1 -0
  92. package/dist/tools/sui_mint_badge.d.ts +7 -0
  93. package/dist/tools/sui_mint_badge.js +35 -0
  94. package/dist/tools/sui_mint_badge.js.map +1 -0
  95. package/dist/tools/sui_move_call.d.ts +18 -0
  96. package/dist/tools/sui_move_call.js +88 -0
  97. package/dist/tools/sui_move_call.js.map +1 -0
  98. package/dist/tools/sui_pay_many.d.ts +10 -0
  99. package/dist/tools/sui_pay_many.js +40 -0
  100. package/dist/tools/sui_pay_many.js.map +1 -0
  101. package/dist/tools/sui_query_events.d.ts +12 -0
  102. package/dist/tools/sui_query_events.js +59 -0
  103. package/dist/tools/sui_query_events.js.map +1 -0
  104. package/dist/tools/sui_resolve_address.d.ts +6 -0
  105. package/dist/tools/sui_resolve_address.js +22 -0
  106. package/dist/tools/sui_resolve_address.js.map +1 -0
  107. package/dist/tools/sui_resolve_coin.d.ts +9 -0
  108. package/dist/tools/sui_resolve_coin.js +26 -0
  109. package/dist/tools/sui_resolve_coin.js.map +1 -0
  110. package/dist/tools/sui_stake.d.ts +6 -0
  111. package/dist/tools/sui_stake.js +29 -0
  112. package/dist/tools/sui_stake.js.map +1 -0
  113. package/dist/tools/sui_transfer.d.ts +5 -0
  114. package/dist/tools/sui_transfer.js +34 -0
  115. package/dist/tools/sui_transfer.js.map +1 -0
  116. package/dist/tools/sui_unstake.d.ts +6 -0
  117. package/dist/tools/sui_unstake.js +27 -0
  118. package/dist/tools/sui_unstake.js.map +1 -0
  119. package/dist/tools/walrus_fetch.d.ts +1 -0
  120. package/dist/tools/walrus_fetch.js +18 -0
  121. package/dist/tools/walrus_fetch.js.map +1 -0
  122. package/dist/tools/walrus_publish.d.ts +1 -0
  123. package/dist/tools/walrus_publish.js +42 -0
  124. package/dist/tools/walrus_publish.js.map +1 -0
  125. package/dist/tx.d.ts +12 -0
  126. package/dist/tx.js +18 -0
  127. package/dist/tx.js.map +1 -0
  128. package/package.json +63 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Current APY for every active validator, as the network computes it from
3
+ * recent epoch rewards. Read-only. This is the APR/APY feed a staking app
4
+ * shows to help a user pick a validator before sui_stake.
5
+ *
6
+ * Returns apy as a fraction (0.041 = 4.1%) plus apy_percent for display.
7
+ * Pass `validator` to get a single one, `sort` to rank highest-first, and
8
+ * `limit` to cap the list.
9
+ */
10
+ export declare function suiGetValidatorsApy(raw: unknown): Promise<string>;
@@ -0,0 +1,37 @@
1
+ import { clientFor } from '../sui-client.js';
2
+ /**
3
+ * Current APY for every active validator, as the network computes it from
4
+ * recent epoch rewards. Read-only. This is the APR/APY feed a staking app
5
+ * shows to help a user pick a validator before sui_stake.
6
+ *
7
+ * Returns apy as a fraction (0.041 = 4.1%) plus apy_percent for display.
8
+ * Pass `validator` to get a single one, `sort` to rank highest-first, and
9
+ * `limit` to cap the list.
10
+ */
11
+ export async function suiGetValidatorsApy(raw) {
12
+ const { network, validator, limit, sort } = raw;
13
+ const client = clientFor(network);
14
+ const { epoch, apys } = await client.getValidatorsApy();
15
+ let rows = apys.map((a) => ({
16
+ validator_address: a.address,
17
+ apy: a.apy,
18
+ apy_percent: Number((a.apy * 100).toFixed(4)),
19
+ }));
20
+ if (validator) {
21
+ rows = rows.filter((r) => r.validator_address === validator);
22
+ }
23
+ if (sort) {
24
+ rows.sort((x, y) => y.apy - x.apy);
25
+ }
26
+ if (typeof limit === 'number') {
27
+ rows = rows.slice(0, limit);
28
+ }
29
+ return JSON.stringify({
30
+ network,
31
+ epoch,
32
+ validator_count: rows.length,
33
+ validators: rows,
34
+ note: 'apy is a fraction (0.041 = 4.1%). Newly-onboarded validators may report apy 0 until they have reward history.',
35
+ });
36
+ }
37
+ //# sourceMappingURL=sui_get_validators_apy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_get_validators_apy.js","sourceRoot":"","sources":["../../src/tools/sui_get_validators_apy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAS3D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAY;IACpD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAW,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAExD,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,iBAAiB,EAAE,CAAC,CAAC,OAAO;QAC5B,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KAC9C,CAAC,CAAC,CAAC;IAEJ,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,KAAK;QACL,eAAe,EAAE,IAAI,CAAC,MAAM;QAC5B,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE,+GAA+G;KACtH,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Build (do not execute) a PTB that calls the canonical Suisei badge
3
+ * mint entry. Returns base64 transaction bytes that the caller can
4
+ * hand to a signer. Why "build, not execute": MCP tools should not
5
+ * spend the user's gas without an explicit signing step.
6
+ */
7
+ export declare function suiMintBadge(raw: unknown): Promise<string>;
@@ -0,0 +1,35 @@
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 execute) a PTB that calls the canonical Suisei badge
6
+ * mint entry. Returns base64 transaction bytes that the caller can
7
+ * hand to a signer. Why "build, not execute": MCP tools should not
8
+ * spend the user's gas without an explicit signing step.
9
+ */
10
+ export async function suiMintBadge(raw) {
11
+ const { recipient, quest_id, quest_number, badge_package, network } = raw;
12
+ const client = clientFor(network);
13
+ const tx = new Transaction();
14
+ tx.moveCall({
15
+ target: `${badge_package}::badge::mint`,
16
+ arguments: [
17
+ tx.pure.address(recipient),
18
+ tx.pure.vector('u8', Array.from(new TextEncoder().encode(quest_id))),
19
+ tx.pure.u8(quest_number),
20
+ tx.object('0x6'),
21
+ ],
22
+ });
23
+ tx.setSender(recipient);
24
+ const tx_bytes_base64 = await buildToB64(tx, client);
25
+ return JSON.stringify({
26
+ tx_bytes_base64,
27
+ target: `${badge_package}::badge::mint`,
28
+ recipient,
29
+ quest_id,
30
+ quest_number,
31
+ network,
32
+ next_step: 'Dry-run with sui_dry_run, then sign and submit with sui_execute_signed_tx.',
33
+ });
34
+ }
35
+ //# sourceMappingURL=sui_mint_badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_mint_badge.js","sourceRoot":"","sources":["../../src/tools/sui_mint_badge.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;AAUtC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY;IAC7C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAClF,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,EAAE,CAAC,QAAQ,CAAC;QACV,MAAM,EAAE,GAAG,aAAa,eAAe;QACvC,SAAS,EAAE;YACT,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAC1B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;YACxB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;SACjB;KACF,CAAC,CAAC;IACH,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAExB,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe;QACf,MAAM,EAAE,GAAG,aAAa,eAAe;QACvC,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,OAAO;QACP,SAAS,EACP,4EAA4E;KAC/E,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Build (do not sign) a transaction that calls ANY Move entry function.
3
+ * This is the universal write primitive — the generic form of every
4
+ * purpose-built mint/transfer tool.
5
+ *
6
+ * Each argument is a string in one of these forms:
7
+ * - `object:<id>` an owned/shared object by id
8
+ * - `pure:address:<0x..>`
9
+ * - `pure:id:<0x..>`
10
+ * - `pure:bool:<true|false>`
11
+ * - `pure:string:<text>`
12
+ * - `pure:u8|u16|u32|u64|u128|u256:<number>`
13
+ *
14
+ * Vector and nested-struct arguments are intentionally out of scope for
15
+ * the generic tool — write a dedicated tool for those so the schema
16
+ * stays unambiguous for the calling agent.
17
+ */
18
+ export declare function suiMoveCall(raw: unknown): Promise<string>;
@@ -0,0 +1,88 @@
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 transaction that calls ANY Move entry function.
6
+ * This is the universal write primitive — the generic form of every
7
+ * purpose-built mint/transfer tool.
8
+ *
9
+ * Each argument is a string in one of these forms:
10
+ * - `object:<id>` an owned/shared object by id
11
+ * - `pure:address:<0x..>`
12
+ * - `pure:id:<0x..>`
13
+ * - `pure:bool:<true|false>`
14
+ * - `pure:string:<text>`
15
+ * - `pure:u8|u16|u32|u64|u128|u256:<number>`
16
+ *
17
+ * Vector and nested-struct arguments are intentionally out of scope for
18
+ * the generic tool — write a dedicated tool for those so the schema
19
+ * stays unambiguous for the calling agent.
20
+ */
21
+ export async function suiMoveCall(raw) {
22
+ const { target, type_arguments, arguments: args, sender, network } = raw;
23
+ if (!/^0x[0-9a-fA-F]+::[A-Za-z_][\w]*::[A-Za-z_][\w]*$/.test(target)) {
24
+ throw new Error(`Bad target "${target}": expected "0xpkg::module::function".`);
25
+ }
26
+ const client = clientFor(network);
27
+ const tx = new Transaction();
28
+ tx.moveCall({
29
+ target,
30
+ typeArguments: type_arguments,
31
+ arguments: args.map((a) => applyMoveArg(tx, a)),
32
+ });
33
+ tx.setSender(sender);
34
+ const tx_bytes_base64 = await buildToB64(tx, client);
35
+ return JSON.stringify({
36
+ tx_bytes_base64,
37
+ target,
38
+ type_arguments,
39
+ sender,
40
+ network,
41
+ next_step: 'Dry-run with sui_dry_run, then sign and submit with sui_execute_signed_tx.',
42
+ });
43
+ }
44
+ function applyMoveArg(tx, arg) {
45
+ const firstColon = arg.indexOf(':');
46
+ if (firstColon === -1) {
47
+ throw new Error(`Bad argument "${arg}": expected "object:<id>" or "pure:<type>:<value>".`);
48
+ }
49
+ const kind = arg.slice(0, firstColon);
50
+ if (kind === 'object') {
51
+ return tx.object(arg.slice(firstColon + 1));
52
+ }
53
+ if (kind === 'pure') {
54
+ const rest = arg.slice(firstColon + 1);
55
+ const sep = rest.indexOf(':');
56
+ if (sep === -1) {
57
+ throw new Error(`Bad pure argument "${arg}": expected "pure:<type>:<value>".`);
58
+ }
59
+ const type = rest.slice(0, sep);
60
+ const value = rest.slice(sep + 1);
61
+ switch (type) {
62
+ case 'address':
63
+ return tx.pure.address(value);
64
+ case 'id':
65
+ return tx.pure.id(value);
66
+ case 'bool':
67
+ return tx.pure.bool(value === 'true');
68
+ case 'string':
69
+ return tx.pure.string(value);
70
+ case 'u8':
71
+ return tx.pure.u8(Number(value));
72
+ case 'u16':
73
+ return tx.pure.u16(Number(value));
74
+ case 'u32':
75
+ return tx.pure.u32(Number(value));
76
+ case 'u64':
77
+ return tx.pure.u64(BigInt(value));
78
+ case 'u128':
79
+ return tx.pure.u128(BigInt(value));
80
+ case 'u256':
81
+ return tx.pure.u256(BigInt(value));
82
+ default:
83
+ throw new Error(`Unsupported pure type "${type}" in "${arg}".`);
84
+ }
85
+ }
86
+ throw new Error(`Unknown argument kind "${kind}" in "${arg}".`);
87
+ }
88
+ //# sourceMappingURL=sui_move_call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_move_call.js","sourceRoot":"","sources":["../../src/tools/sui_move_call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Build (do not sign) a many-to-many SUI payout in a single PTB: split N
3
+ * coins out of gas and send each to its matching recipient. Powers
4
+ * airdrops, payroll, batch refunds, splitter contracts.
5
+ *
6
+ * recipients and amounts_mist must be the same length and same order:
7
+ * amounts_mist[i] goes to recipients[i]. Amounts are MIST strings to avoid
8
+ * precision loss.
9
+ */
10
+ export declare function suiPayMany(raw: unknown): Promise<string>;
@@ -0,0 +1,40 @@
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 many-to-many SUI payout in a single PTB: split N
6
+ * coins out of gas and send each to its matching recipient. Powers
7
+ * airdrops, payroll, batch refunds, splitter contracts.
8
+ *
9
+ * recipients and amounts_mist must be the same length and same order:
10
+ * amounts_mist[i] goes to recipients[i]. Amounts are MIST strings to avoid
11
+ * precision loss.
12
+ */
13
+ export async function suiPayMany(raw) {
14
+ const { sender, network, recipients, amounts_mist } = raw;
15
+ if (recipients.length === 0)
16
+ throw new Error('recipients is empty.');
17
+ if (recipients.length !== amounts_mist.length) {
18
+ throw new Error(`recipients (${recipients.length}) and amounts_mist (${amounts_mist.length}) must be the same length.`);
19
+ }
20
+ const tx = new Transaction();
21
+ tx.setSender(sender);
22
+ const splits = tx.splitCoins(tx.gas, amounts_mist.map((a) => tx.pure.u64(BigInt(a))));
23
+ // splitCoins returns an array of TransactionResult handles, one per amount.
24
+ recipients.forEach((r, i) => {
25
+ tx.transferObjects([splits[i]], tx.pure.address(r));
26
+ });
27
+ const client = clientFor(network);
28
+ const tx_bytes_base64 = await buildToB64(tx, client);
29
+ const total = amounts_mist.reduce((acc, x) => acc + BigInt(x), 0n).toString();
30
+ return JSON.stringify({
31
+ tx_bytes_base64,
32
+ sender,
33
+ network,
34
+ payout_count: recipients.length,
35
+ total_mist: total,
36
+ total_sui: Number(BigInt(total)) / 1e9,
37
+ next_step: 'Dry-run with sui_dry_run, sign, and submit with sui_execute_signed_tx. All N payouts settle atomically — they all land or none do.',
38
+ });
39
+ }
40
+ //# sourceMappingURL=sui_pay_many.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_pay_many.js","sourceRoot":"","sources":["../../src/tools/sui_pay_many.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;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAY;IAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,GAAW,CAAC;IAClE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACrE,IAAI,UAAU,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,eAAe,UAAU,CAAC,MAAM,uBAAuB,YAAY,CAAC,MAAM,4BAA4B,CACvG,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAErB,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAC1B,EAAE,CAAC,GAAG,EACN,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAChD,CAAC;IACF,4EAA4E;IAC5E,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,EAAE,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9E,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe;QACf,MAAM;QACN,OAAO;QACP,YAAY,EAAE,UAAU,CAAC,MAAM;QAC/B,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG;QACtC,SAAS,EACP,oIAAoI;KACvI,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Query historical events. Powers reactive agents: react to swaps on a
3
+ * pool, badge mints, NFT transfers — anything that emits a Move event.
4
+ * Filter by full event_type, by Move module (package + module — both
5
+ * required together), by sender, or by transaction. Paginated; pass back
6
+ * next_cursor_* to continue.
7
+ *
8
+ * Sui's event index requires at least one filter; an unfiltered scan
9
+ * would return the whole chain. Package-only filtering is not supported
10
+ * by the fullnode — pair package with module.
11
+ */
12
+ export declare function suiQueryEvents(raw: unknown): Promise<string>;
@@ -0,0 +1,59 @@
1
+ import { clientFor } from '../sui-client.js';
2
+ /**
3
+ * Query historical events. Powers reactive agents: react to swaps on a
4
+ * pool, badge mints, NFT transfers — anything that emits a Move event.
5
+ * Filter by full event_type, by Move module (package + module — both
6
+ * required together), by sender, or by transaction. Paginated; pass back
7
+ * next_cursor_* to continue.
8
+ *
9
+ * Sui's event index requires at least one filter; an unfiltered scan
10
+ * would return the whole chain. Package-only filtering is not supported
11
+ * by the fullnode — pair package with module.
12
+ */
13
+ export async function suiQueryEvents(raw) {
14
+ const a = raw;
15
+ const client = clientFor(a.network);
16
+ // Build the EventFilter discriminated union the SDK expects.
17
+ let query;
18
+ if (a.event_type)
19
+ query = { MoveEventType: a.event_type };
20
+ else if (a.module && a.package)
21
+ query = { MoveModule: { package: a.package, module: a.module } };
22
+ else if (a.sender)
23
+ query = { Sender: a.sender };
24
+ else if (a.transaction)
25
+ query = { Transaction: a.transaction };
26
+ else if (a.package && !a.module) {
27
+ throw new Error('package alone is not a supported event filter. Pass module too (MoveModule = package + module), or use event_type / sender / transaction.');
28
+ }
29
+ else {
30
+ throw new Error('Pass at least one filter: event_type, package+module, sender, or transaction.');
31
+ }
32
+ const cursor = a.cursor_tx_digest && a.cursor_event_seq
33
+ ? { txDigest: a.cursor_tx_digest, eventSeq: a.cursor_event_seq }
34
+ : null;
35
+ const res = await client.queryEvents({
36
+ query: query,
37
+ cursor,
38
+ limit: a.limit,
39
+ order: a.descending === false ? 'ascending' : 'descending',
40
+ });
41
+ return JSON.stringify({
42
+ network: a.network,
43
+ count: res.data.length,
44
+ has_next_page: res.hasNextPage,
45
+ next_cursor_tx_digest: res.nextCursor?.txDigest ?? null,
46
+ next_cursor_event_seq: res.nextCursor?.eventSeq ?? null,
47
+ events: res.data.map((e) => ({
48
+ tx_digest: e.id.txDigest,
49
+ event_seq: e.id.eventSeq,
50
+ type: e.type,
51
+ package: e.packageId,
52
+ module: e.transactionModule,
53
+ sender: e.sender,
54
+ timestamp_ms: e.timestampMs,
55
+ parsed_json: e.parsedJson,
56
+ })),
57
+ });
58
+ }
59
+ //# sourceMappingURL=sui_query_events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_query_events.js","sourceRoot":"","sources":["../../src/tools/sui_query_events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAgB3D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAY;IAC/C,MAAM,CAAC,GAAG,GAAW,CAAC;IACtB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEpC,6DAA6D;IAC7D,IAAI,KAA8B,CAAC;IACnC,IAAI,CAAC,CAAC,UAAU;QAAE,KAAK,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;SACrD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO;QAAE,KAAK,GAAG,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;SAC5F,IAAI,CAAC,CAAC,MAAM;QAAE,KAAK,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;SAC3C,IAAI,CAAC,CAAC,WAAW;QAAE,KAAK,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;SAC1D,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,2IAA2I,CAC5I,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GACV,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,gBAAgB;QACtC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC,gBAAgB,EAAE;QAChE,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;QACnC,KAAK,EAAE,KAA0D;QACjE,MAAM;QACN,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;KAC3D,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;QACtB,aAAa,EAAE,GAAG,CAAC,WAAW;QAC9B,qBAAqB,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,IAAI,IAAI;QACvD,qBAAqB,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,IAAI,IAAI;QACvD,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ;YACxB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,SAAS;YACpB,MAAM,EAAE,CAAC,CAAC,iBAAiB;YAC3B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,WAAW,EAAE,CAAC,CAAC,UAAU;SAC1B,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * If the input is a 0x address, return it canonicalized. Otherwise
3
+ * treat it as a SuiNS name and resolve. Reasoning: tools should never
4
+ * fail just because the user gave the input it expected anyway.
5
+ */
6
+ export declare function suiResolveAddress(raw: unknown): Promise<string>;
@@ -0,0 +1,22 @@
1
+ import { clientFor } from '../sui-client.js';
2
+ /**
3
+ * If the input is a 0x address, return it canonicalized. Otherwise
4
+ * treat it as a SuiNS name and resolve. Reasoning: tools should never
5
+ * fail just because the user gave the input it expected anyway.
6
+ */
7
+ export async function suiResolveAddress(raw) {
8
+ const { name_or_address, network } = raw;
9
+ if (/^0x[0-9a-fA-F]+$/.test(name_or_address)) {
10
+ return JSON.stringify({
11
+ address: name_or_address.toLowerCase(),
12
+ source: 'literal',
13
+ });
14
+ }
15
+ const client = clientFor(network);
16
+ const result = await client.resolveNameServiceAddress({ name: name_or_address });
17
+ if (!result) {
18
+ throw new Error(`SuiNS name not found: ${name_or_address}`);
19
+ }
20
+ return JSON.stringify({ address: result, source: 'suins', name: name_or_address });
21
+ }
22
+ //# sourceMappingURL=sui_resolve_address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_resolve_address.js","sourceRoot":"","sources":["../../src/tools/sui_resolve_address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAO3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAY;IAClD,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACjD,IAAI,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,eAAe,CAAC,WAAW,EAAE;YACtC,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,eAAe,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;AACrF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Resolve a coin symbol (e.g. "USDC", "DEEP", "SUI") to its fully-qualified
3
+ * coin type on the chosen network. Without a symbol, lists every known
4
+ * symbol — useful when the agent isn't sure what's available.
5
+ *
6
+ * This is the coin-side mirror of sui_resolve_address: stops the agent
7
+ * from hallucinating coin types ("oh USDC must be 0x2::usdc::USDC right?").
8
+ */
9
+ export declare function suiResolveCoin(raw: unknown): Promise<string>;
@@ -0,0 +1,26 @@
1
+ import { COINS, findCoin, knownSymbols } from '../coins.js';
2
+ /**
3
+ * Resolve a coin symbol (e.g. "USDC", "DEEP", "SUI") to its fully-qualified
4
+ * coin type on the chosen network. Without a symbol, lists every known
5
+ * symbol — useful when the agent isn't sure what's available.
6
+ *
7
+ * This is the coin-side mirror of sui_resolve_address: stops the agent
8
+ * from hallucinating coin types ("oh USDC must be 0x2::usdc::USDC right?").
9
+ */
10
+ export async function suiResolveCoin(raw) {
11
+ const { network, symbol } = raw;
12
+ if (!symbol) {
13
+ const table = COINS[network] ?? {};
14
+ return JSON.stringify({
15
+ network,
16
+ known_symbols: knownSymbols(network),
17
+ coins: Object.values(table),
18
+ });
19
+ }
20
+ const info = findCoin(network, symbol);
21
+ if (!info) {
22
+ throw new Error(`Unknown symbol "${symbol}" on ${network}. Known: ${knownSymbols(network).join(', ') || 'none'}. Pass the full coin_type to any tool to use a coin not in the registry.`);
23
+ }
24
+ return JSON.stringify({ network, ...info });
25
+ }
26
+ //# sourceMappingURL=sui_resolve_coin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_resolve_coin.js","sourceRoot":"","sources":["../../src/tools/sui_resolve_coin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO5D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAY;IAC/C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAW,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO;YACP,aAAa,EAAE,YAAY,CAAC,OAAO,CAAC;YACpC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,mBAAmB,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,0EAA0E,CACzK,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Build (do not sign) a native staking transaction: split `amount_mist`
3
+ * from gas and delegate it to `validator` via 0x3::sui_system. The host
4
+ * signs and submits; the resulting StakedSui object lands in the sender.
5
+ */
6
+ export declare function suiStake(raw: unknown): Promise<string>;
@@ -0,0 +1,29 @@
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 native staking transaction: split `amount_mist`
6
+ * from gas and delegate it to `validator` via 0x3::sui_system. The host
7
+ * signs and submits; the resulting StakedSui object lands in the sender.
8
+ */
9
+ export async function suiStake(raw) {
10
+ const { sender, amount_mist, validator, network } = raw;
11
+ const client = clientFor(network);
12
+ const tx = new Transaction();
13
+ tx.setSender(sender);
14
+ const [stakeCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(BigInt(amount_mist))]);
15
+ tx.moveCall({
16
+ target: '0x3::sui_system::request_add_stake',
17
+ arguments: [tx.object('0x5'), stakeCoin, tx.pure.address(validator)],
18
+ });
19
+ const tx_bytes_base64 = await buildToB64(tx, client);
20
+ return JSON.stringify({
21
+ tx_bytes_base64,
22
+ sender,
23
+ amount_mist,
24
+ validator,
25
+ network,
26
+ next_step: 'Sign and submit with sui_execute_signed_tx.',
27
+ });
28
+ }
29
+ //# sourceMappingURL=sui_stake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_stake.js","sourceRoot":"","sources":["../../src/tools/sui_stake.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;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAY;IACzC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAChE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,CAAC,SAAS,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;IAC9E,EAAE,CAAC,QAAQ,CAAC;QACV,MAAM,EAAE,oCAAoC;QAC5C,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;KACrE,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe;QACf,MAAM;QACN,WAAW;QACX,SAAS;QACT,OAAO;QACP,SAAS,EAAE,6CAA6C;KACzD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Build (do not sign) a transfer. Provide `amount_mist` to send SUI
3
+ * (split from the gas coin) and/or `object_ids` to send whole objects.
4
+ */
5
+ export declare function suiTransfer(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) a transfer. Provide `amount_mist` to send SUI
6
+ * (split from the gas coin) and/or `object_ids` to send whole objects.
7
+ */
8
+ export async function suiTransfer(raw) {
9
+ const { sender, recipient, amount_mist, object_ids, network } = raw;
10
+ if (!amount_mist && !(object_ids && object_ids.length > 0)) {
11
+ throw new Error('Nothing to transfer: provide amount_mist and/or object_ids.');
12
+ }
13
+ const client = clientFor(network);
14
+ const tx = new Transaction();
15
+ tx.setSender(sender);
16
+ if (amount_mist) {
17
+ const [coin] = tx.splitCoins(tx.gas, [tx.pure.u64(BigInt(amount_mist))]);
18
+ tx.transferObjects([coin], tx.pure.address(recipient));
19
+ }
20
+ if (object_ids && object_ids.length > 0) {
21
+ tx.transferObjects(object_ids.map((id) => tx.object(id)), tx.pure.address(recipient));
22
+ }
23
+ const tx_bytes_base64 = await buildToB64(tx, client);
24
+ return JSON.stringify({
25
+ tx_bytes_base64,
26
+ sender,
27
+ recipient,
28
+ amount_mist: amount_mist ?? null,
29
+ object_ids: object_ids ?? [],
30
+ network,
31
+ next_step: 'Sign and submit with sui_execute_signed_tx.',
32
+ });
33
+ }
34
+ //# sourceMappingURL=sui_transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_transfer.js","sourceRoot":"","sources":["../../src/tools/sui_transfer.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;AAUtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAY;IAC5C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IAC5E,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAErB,IAAI,WAAW,EAAE,CAAC;QAChB,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;QACzE,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,EAAE,CAAC,eAAe,CAChB,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EACrC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAC3B,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe;QACf,MAAM;QACN,SAAS;QACT,WAAW,EAAE,WAAW,IAAI,IAAI;QAChC,UAAU,EAAE,UAAU,IAAI,EAAE;QAC5B,OAAO;QACP,SAAS,EAAE,6CAA6C;KACzD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Build (do not sign) a withdraw-stake transaction for a StakedSui
3
+ * object. Returns principal plus earned rewards to the sender when the
4
+ * host signs and submits.
5
+ */
6
+ export declare function suiUnstake(raw: unknown): Promise<string>;
@@ -0,0 +1,27 @@
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 withdraw-stake transaction for a StakedSui
6
+ * object. Returns principal plus earned rewards to the sender when the
7
+ * host signs and submits.
8
+ */
9
+ export async function suiUnstake(raw) {
10
+ const { sender, staked_sui_id, network } = raw;
11
+ const client = clientFor(network);
12
+ const tx = new Transaction();
13
+ tx.setSender(sender);
14
+ tx.moveCall({
15
+ target: '0x3::sui_system::request_withdraw_stake',
16
+ arguments: [tx.object('0x5'), tx.object(staked_sui_id)],
17
+ });
18
+ const tx_bytes_base64 = await buildToB64(tx, client);
19
+ return JSON.stringify({
20
+ tx_bytes_base64,
21
+ sender,
22
+ staked_sui_id,
23
+ network,
24
+ next_step: 'Sign and submit with sui_execute_signed_tx.',
25
+ });
26
+ }
27
+ //# sourceMappingURL=sui_unstake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sui_unstake.js","sourceRoot":"","sources":["../../src/tools/sui_unstake.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;AAQtC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAY;IAC3C,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,GAAW,CAAC;IACvD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrB,EAAE,CAAC,QAAQ,CAAC;QACV,MAAM,EAAE,yCAAyC;QACjD,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;KACxD,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe;QACf,MAAM;QACN,aAAa;QACb,OAAO;QACP,SAAS,EAAE,6CAA6C;KACzD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function walrusFetch(raw: unknown): Promise<string>;
@@ -0,0 +1,18 @@
1
+ const DEFAULT_AGGREGATOR = 'https://aggregator.walrus-testnet.walrus.space';
2
+ export async function walrusFetch(raw) {
3
+ const { blob_id, as, aggregator_url } = raw;
4
+ const url = `${aggregator_url ?? DEFAULT_AGGREGATOR}/v1/blobs/${blob_id}`;
5
+ const res = await fetch(url);
6
+ if (!res.ok) {
7
+ throw new Error(`Walrus aggregator returned ${res.status} for ${blob_id}`);
8
+ }
9
+ const buf = Buffer.from(await res.arrayBuffer());
10
+ const content = as === 'base64' ? buf.toString('base64') : buf.toString('utf8');
11
+ return JSON.stringify({
12
+ blob_id,
13
+ encoding: as,
14
+ size_bytes: buf.length,
15
+ content,
16
+ });
17
+ }
18
+ //# sourceMappingURL=walrus_fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walrus_fetch.js","sourceRoot":"","sources":["../../src/tools/walrus_fetch.ts"],"names":[],"mappings":"AAMA,MAAM,kBAAkB,GAAG,gDAAgD,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAY;IAC5C,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,GAAW,CAAC;IACpD,MAAM,GAAG,GAAG,GAAG,cAAc,IAAI,kBAAkB,aAAa,OAAO,EAAE,CAAC;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,QAAQ,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,MAAM,OAAO,GACX,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAElE,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO;QACP,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,GAAG,CAAC,MAAM;QACtB,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function walrusPublish(raw: unknown): Promise<string>;
@@ -0,0 +1,42 @@
1
+ const DEFAULT_PUBLISHER = 'https://publisher.walrus-testnet.walrus.space';
2
+ export async function walrusPublish(raw) {
3
+ const { content, encoding, epochs, publisher_url } = raw;
4
+ const body = encoding === 'base64'
5
+ ? Buffer.from(content, 'base64')
6
+ : Buffer.from(content, 'utf8');
7
+ const url = `${publisher_url ?? DEFAULT_PUBLISHER}/v1/blobs?epochs=${epochs}`;
8
+ // Buffer is a Uint8Array subclass, which fetch accepts as a body.
9
+ const res = await fetch(url, {
10
+ method: 'PUT',
11
+ body: new Uint8Array(body),
12
+ });
13
+ if (!res.ok) {
14
+ throw new Error(`Walrus publisher returned ${res.status}: ${await res.text()}`);
15
+ }
16
+ const data = (await res.json());
17
+ // Walrus returns one of: { newlyCreated: { blobObject: {...} } } or
18
+ // { alreadyCertified: { blobId, ... } }. Normalize.
19
+ let blobId;
20
+ let kind = 'unknown';
21
+ const newly = data.newlyCreated;
22
+ const already = data.alreadyCertified;
23
+ if (newly?.blobObject?.blobId) {
24
+ blobId = newly.blobObject.blobId;
25
+ kind = 'newly_created';
26
+ }
27
+ else if (already?.blobId) {
28
+ blobId = already.blobId;
29
+ kind = 'already_certified';
30
+ }
31
+ if (!blobId) {
32
+ throw new Error(`Walrus response missing blobId: ${JSON.stringify(data)}`);
33
+ }
34
+ return JSON.stringify({
35
+ blob_id: blobId,
36
+ status: kind,
37
+ epochs,
38
+ publisher: publisher_url ?? DEFAULT_PUBLISHER,
39
+ size_bytes: body.length,
40
+ });
41
+ }
42
+ //# sourceMappingURL=walrus_publish.js.map