@usebutr/sui 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -17,7 +17,7 @@ type SuiSignTransactionInput = {
17
17
  chain: string;
18
18
  transaction: {
19
19
  toJSON: () => Promise<string>;
20
- } | string;
20
+ };
21
21
  };
22
22
  type SuiSignTransactionOutput = {
23
23
  bytes: string;
@@ -31,7 +31,7 @@ type SuiSignAndExecuteTransactionInput = {
31
31
  chain: string;
32
32
  transaction: {
33
33
  toJSON: () => Promise<string>;
34
- } | string;
34
+ };
35
35
  };
36
36
  type SuiSignAndExecuteTransactionOutput = {
37
37
  bytes: string;
@@ -45,22 +45,9 @@ type SuiSignAndExecuteTransactionFeature = {
45
45
  //#endregion
46
46
  //#region src/wallet-standard-adapter.d.ts
47
47
  /**
48
- * Adapt a Sui Wallet Standard `Wallet` into a butr `WalletAdapter`.
49
- *
50
- * Returns `null` if the wallet doesn't advertise any Sui chain or doesn't
51
- * expose `standard:connect`. Same posture as `buildSvmAdapter`: gate
52
- * features on what each wallet advertises, return placeholders for
53
- * RPC-backed reads (`getBalance`, `getTransactionReceipt`), forward
54
- * `subscribe` through `standard:events`.
55
- *
56
- * **Known limitations**
57
- *
58
- * - `getBalance` returns a `{ value: 0n, symbol: "SUI" }` placeholder.
59
- * Consumers wrap `@mysten/sui`'s `SuiClient` for real reads.
60
- * - `getTransactionReceipt` returns `"Pending"` for the same reason.
61
- * - `switchChain` is local-state-only (mirrors SVM). Sui Wallet Standard
62
- * has no "tell the wallet to switch network" RPC; the wallet's UI
63
- * controls its global cluster setting.
48
+ * Sui Wallet Standard has no "switch network" RPC, so `switchChain` moves
49
+ * butr's view only and the wallet's own UI owns its cluster. Balance and
50
+ * receipt reads need `@mysten/sui`'s `SuiClient`, which butr doesn't ship.
64
51
  */
65
52
  declare const buildSuiAdapter: (wallet: WalletStandardWallet,
66
53
  /** Optional. Called with a function that pushes a synthetic
@@ -68,20 +55,8 @@ declare const buildSuiAdapter: (wallet: WalletStandardWallet,
68
55
  * layer invokes it on Wallet Standard `unregister`. */
69
56
  registerDisconnector?: (emit: () => void) => void) => WalletAdapter | null;
70
57
  /**
71
- * Subscribe to Sui Wallet Standard announcements.
58
+ * Requires the optional `@wallet-standard/app` peer dep.
72
59
  * Spec: https://docs.sui.io/standards/wallet-standard
73
- *
74
- * Runtime requires the `@wallet-standard/app` package, which is an
75
- * **optional peer dependency** of butr.
76
- *
77
- * Sui wallets share the same `getWallets()` bus as SVM wallets; Phantom
78
- * advertises features for SVM, Sui, and Bitcoin from a single Wallet
79
- * Standard wallet object. `buildSuiAdapter` returns `null` for wallets
80
- * that don't advertise any `sui:*` features, so we cleanly end up with
81
- * one adapter per platform on multi-chain wallets.
82
- *
83
- * The discovery loop (dynamic import, dedupe, register / unregister
84
- * bridge) lives in `@usebutr/wallet-standard-shared`.
85
60
  */
86
61
  declare const discoverSuiAdapters: (onAdapter: (adapter: WalletAdapter) => void) => (() => void);
87
62
  //#endregion
@@ -125,15 +100,9 @@ type WalletStandardCapabilityInput = {
125
100
  };
126
101
  };
127
102
  /**
128
- * Sui Wallet Standard feature → butr capability mapping. The flags that hold
129
- * for every namespace are documented on `buildWalletCapabilities`.
130
- *
131
- * - `sendTransaction = sui:signAndExecuteTransaction present`. The wallet
132
- * broadcasts; consumers receive the digest.
133
- * - `signTransaction = sui:signTransaction present`. Sign-only; consumers
134
- * broadcast with their own RPC client (`@mysten/sui`'s SuiClient).
135
- * - `signMessage = sui:signPersonalMessage present`.
136
- * - `signIn = false`. Sui has no SIWS-equivalent feature in Wallet Standard.
103
+ * `signIn` is false: Sui Wallet Standard has no Sign-In-With-Sui feature.
104
+ * `signAndExecuteTransaction` means the wallet broadcasts, while
105
+ * `signTransaction` is sign-only and leaves the broadcast to the consumer.
137
106
  */
138
107
  declare const resolveSuiCapabilities: (input: WalletStandardCapabilityInput) => WalletCapabilities;
139
108
  //#endregion
@@ -146,10 +115,8 @@ declare const suiDiscoverer: PlatformDiscoverer;
146
115
  //#endregion
147
116
  //#region src/signer-augmentation.d.ts
148
117
  /**
149
- * Augment `@usebutr/core`'s `SignerForPlatform` registry with the Sui
150
- * entry. Sui's `getSigner()` returns the Wallet Standard wallet
151
- * object, which consumers narrow further via its `features` map (e.g.
152
- * `wallet.features["sui:signAndExecuteTransaction"]`).
118
+ * Sui's `getSigner()` hands back the Wallet Standard wallet, which consumers
119
+ * narrow through its `features` map.
153
120
  */
154
121
  declare module "@usebutr/core" {
155
122
  interface SignerForPlatform {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/wallet-standard-types.ts","../src/wallet-standard-adapter.ts","../src/chains.ts","../src/capabilities.ts","../src/discoverer.ts","../src/signer-augmentation.ts"],"mappings":";;;KAaK;EACH,SAAS;EACT,SAAS;;KAGN;EACH;EACA;;KAGG;EACH,sBACE,OAAO,gCACJ,QAAQ;;KAGV;EACH,SAAS;EACT;EACA;IAAe,cAAc;;;KAG1B;EACH;EACA;;KAGG;EACH,kBAAkB,OAAO,4BAA4B,QAAQ;;KAG1D;EACH,SAAS;EACT;EACA;IAAe,cAAc;;;KAG1B;EACH;EACA;EACA;EACA;;KAGG;EACH,4BACE,OAAO,sCACJ,QAAQ;;;;;;;;;;;;;;;;;;;;;;cCHT,kBACJ,QAAQ,sBAIR;;;;AAAA,wBAAwB,8BACvB;;;;;;;;;;;;;;;;;cAsHG,sBAAuB,YAAY,SAAS;;;cC9K5C;;;;;;;;;;;;;;;;;;;;;;;;;;cAiBA,iBAAiB,cAAc;;;KCrBhC;EACH;EACA;IACE;IACA;IACA;IACA;;;;;;;;;;;;;;cAeE,yBAA0B,OAAO,kCAAgC;;;;;;;cChBjE,eAAe;;;;;;;;;;YCET;IACR,KAAK"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/wallet-standard-types.ts","../src/wallet-standard-adapter.ts","../src/chains.ts","../src/capabilities.ts","../src/discoverer.ts","../src/signer-augmentation.ts"],"mappings":";;;KAOK;EACH,SAAS;EACT,SAAS;;KAGN;EACH;EACA;;KAGG;EACH,sBACE,OAAO,gCACJ,QAAQ;;KAGV;EACH,SAAS;EACT;EACA;IAAe,cAAc;;;KAG1B;EACH;EACA;;KAGG;EACH,kBAAkB,OAAO,4BAA4B,QAAQ;;KAG1D;EACH,SAAS;EACT;EACA;IAAe,cAAc;;;KAG1B;EACH;EACA;EACA;EACA;;KAGG;EACH,4BACE,OAAO,sCACJ,QAAQ;;;;;;;;;cCPT,kBACJ,QAAQ,sBAIR;;;;AAAA,wBAAwB,8BACvB;;;;;cAqIG,sBAAuB,YAAY,SAAS;;;cCxL5C;;;;;;;;;;;;;;;;;;;;;;;;;;cAiBA,iBAAiB,cAAc;;;KChBhC;EACH;EACA;IACE;IACA;IACA;IACA;;;;;;;;cASE,yBAA0B,OAAO,kCAAgC;;;;;;;cCVjE,eAAe;;;;;;;;YCAT;IACR,KAAK"}
package/dist/index.js CHANGED
@@ -1,17 +1,11 @@
1
- import { base64ToBytes } from "@usebutr/core";
1
+ import { base64ToBytes, bytesToBase64 } from "@usebutr/core";
2
2
  import { buildWalletCapabilities, createWalletStandardCore, discoverWalletStandard, getFeature, slugify } from "@usebutr/wallet-standard-shared";
3
3
 
4
4
  //#region src/capabilities.ts
5
5
  /**
6
- * Sui Wallet Standard feature → butr capability mapping. The flags that hold
7
- * for every namespace are documented on `buildWalletCapabilities`.
8
- *
9
- * - `sendTransaction = sui:signAndExecuteTransaction present`. The wallet
10
- * broadcasts; consumers receive the digest.
11
- * - `signTransaction = sui:signTransaction present`. Sign-only; consumers
12
- * broadcast with their own RPC client (`@mysten/sui`'s SuiClient).
13
- * - `signMessage = sui:signPersonalMessage present`.
14
- * - `signIn = false`. Sui has no SIWS-equivalent feature in Wallet Standard.
6
+ * `signIn` is false: Sui Wallet Standard has no Sign-In-With-Sui feature.
7
+ * `signAndExecuteTransaction` means the wallet broadcasts, while
8
+ * `signTransaction` is sign-only and leaves the broadcast to the consumer.
15
9
  */
16
10
  const resolveSuiCapabilities = (input) => buildWalletCapabilities({
17
11
  chainCount: input.chainCount,
@@ -27,33 +21,23 @@ const resolveSuiCapabilities = (input) => buildWalletCapabilities({
27
21
  const SUI_PREFIX = "sui:";
28
22
  const SUI_DECIMALS = 9;
29
23
  const SUI_MAINNET = "sui:mainnet";
30
- /** Coerce butr's `unknown` tx into the shape `sui:signAndExecuteTransaction`
31
- * expects (an object with `toJSON()` returning a Promise<string>). When
32
- * consumers pass a base64 string directly, we wrap it in a stub object so
33
- * the feature contract stays satisfied without us depending on
34
- * `@mysten/sui`. */
24
+ /** Coerce butr's `unknown` tx into the shape the Sui Wallet Standard features
25
+ * expect: an object with `toJSON()` returning a Promise<string>. A raw string
26
+ * or BCS byte array is wrapped, because wallets accept only the `toJSON()`
27
+ * form and a bare string reaches them as a shape they cannot consume. */
35
28
  const coerceSuiTransaction = (tx) => {
36
- if (typeof tx === "string") return tx;
29
+ if (typeof tx === "string") return { toJSON: () => Promise.resolve(tx) };
30
+ if (tx instanceof Uint8Array) {
31
+ const encoded = bytesToBase64(tx);
32
+ return { toJSON: () => Promise.resolve(encoded) };
33
+ }
37
34
  if (typeof tx === "object" && tx !== null && "toJSON" in tx && typeof tx.toJSON === "function") return tx;
38
- throw new TypeError("Sui sendTx/signTransaction expects a @mysten/sui Transaction (with toJSON()) or a base64-encoded string");
35
+ throw new TypeError("Sui sendTx/signTransaction expects a @mysten/sui Transaction (with toJSON()), a base64-encoded string, or BCS bytes");
39
36
  };
40
37
  /**
41
- * Adapt a Sui Wallet Standard `Wallet` into a butr `WalletAdapter`.
42
- *
43
- * Returns `null` if the wallet doesn't advertise any Sui chain or doesn't
44
- * expose `standard:connect`. Same posture as `buildSvmAdapter`: gate
45
- * features on what each wallet advertises, return placeholders for
46
- * RPC-backed reads (`getBalance`, `getTransactionReceipt`), forward
47
- * `subscribe` through `standard:events`.
48
- *
49
- * **Known limitations**
50
- *
51
- * - `getBalance` returns a `{ value: 0n, symbol: "SUI" }` placeholder.
52
- * Consumers wrap `@mysten/sui`'s `SuiClient` for real reads.
53
- * - `getTransactionReceipt` returns `"Pending"` for the same reason.
54
- * - `switchChain` is local-state-only (mirrors SVM). Sui Wallet Standard
55
- * has no "tell the wallet to switch network" RPC; the wallet's UI
56
- * controls its global cluster setting.
38
+ * Sui Wallet Standard has no "switch network" RPC, so `switchChain` moves
39
+ * butr's view only and the wallet's own UI owns its cluster. Balance and
40
+ * receipt reads need `@mysten/sui`'s `SuiClient`, which butr doesn't ship.
57
41
  */
58
42
  const buildSuiAdapter = (wallet, registerDisconnector) => {
59
43
  const core = createWalletStandardCore({
@@ -71,13 +55,20 @@ const buildSuiAdapter = (wallet, registerDisconnector) => {
71
55
  const signMessage = getFeature(wallet, "sui:signPersonalMessage");
72
56
  const signAndExecute = getFeature(wallet, "sui:signAndExecuteTransaction");
73
57
  const signTx = getFeature(wallet, "sui:signTransaction");
74
- const executeTx = async (tx, account) => {
58
+ /** Resolve a caller-supplied target into a chain the wallet advertises,
59
+ * accepting either a full CAIP-2 id (`sui:testnet`) or a bare reference. */
60
+ const resolveTargetChain = (targetChainId) => {
61
+ const candidate = targetChainId.startsWith(SUI_PREFIX) ? targetChainId : `${SUI_PREFIX}${targetChainId}`;
62
+ if (!wallet.chains.includes(candidate)) throw new Error(`Wallet ${wallet.name} does not advertise chain "${candidate}". Available: ${wallet.chains.join(", ")}`);
63
+ return candidate;
64
+ };
65
+ const executeTx = async (tx, account, chain) => {
75
66
  if (signAndExecute === void 0) throw new Error(`Wallet ${wallet.name} does not advertise sui:signAndExecuteTransaction`);
76
67
  const wsAccount = core.resolveAccount(account);
77
68
  const transaction = coerceSuiTransaction(tx);
78
69
  return (await signAndExecute.signAndExecuteTransaction({
79
70
  account: wsAccount,
80
- chain: core.currentChainId(),
71
+ chain: chain ?? core.currentChainId(),
81
72
  transaction
82
73
  })).digest;
83
74
  };
@@ -104,9 +95,10 @@ const buildSuiAdapter = (wallet, registerDisconnector) => {
104
95
  await core.connect();
105
96
  },
106
97
  sendTx: (tx, account) => executeTx(tx, account),
107
- sendTxToChain: (tx, _targetChainId, account, cb) => {
108
- cb?.();
109
- return executeTx(tx, account);
98
+ async sendTxToChain(tx, targetChainId, account, cb) {
99
+ const target = resolveTargetChain(targetChainId);
100
+ if (target !== core.currentChainId()) cb?.();
101
+ return await executeTx(tx, account, target);
110
102
  },
111
103
  async signMessage(msg, account) {
112
104
  if (signMessage === void 0) throw new Error(`Wallet ${wallet.name} does not advertise sui:signPersonalMessage`);
@@ -122,29 +114,21 @@ const buildSuiAdapter = (wallet, registerDisconnector) => {
122
114
  ...signTx === void 0 ? {} : { async signTransaction(tx, account) {
123
115
  const wsAccount = core.resolveAccount(account);
124
116
  const transaction = coerceSuiTransaction(tx);
125
- return base64ToBytes((await signTx.signTransaction({
117
+ const output = await signTx.signTransaction({
126
118
  account: wsAccount,
127
119
  chain: core.currentChainId(),
128
120
  transaction
129
- })).bytes);
121
+ });
122
+ return {
123
+ bytes: base64ToBytes(output.bytes),
124
+ signature: base64ToBytes(output.signature)
125
+ };
130
126
  } }
131
127
  };
132
128
  };
133
129
  /**
134
- * Subscribe to Sui Wallet Standard announcements.
130
+ * Requires the optional `@wallet-standard/app` peer dep.
135
131
  * Spec: https://docs.sui.io/standards/wallet-standard
136
- *
137
- * Runtime requires the `@wallet-standard/app` package, which is an
138
- * **optional peer dependency** of butr.
139
- *
140
- * Sui wallets share the same `getWallets()` bus as SVM wallets; Phantom
141
- * advertises features for SVM, Sui, and Bitcoin from a single Wallet
142
- * Standard wallet object. `buildSuiAdapter` returns `null` for wallets
143
- * that don't advertise any `sui:*` features, so we cleanly end up with
144
- * one adapter per platform on multi-chain wallets.
145
- *
146
- * The discovery loop (dynamic import, dedupe, register / unregister
147
- * bridge) lives in `@usebutr/wallet-standard-shared`.
148
132
  */
149
133
  const discoverSuiAdapters = (onAdapter) => discoverWalletStandard(onAdapter, (wallet, registerDisconnector) => buildSuiAdapter(wallet, registerDisconnector));
150
134
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/capabilities.ts","../src/wallet-standard-adapter.ts","../src/chains.ts","../src/discoverer.ts"],"sourcesContent":["import type { WalletCapabilities } from \"@usebutr/core\";\nimport { buildWalletCapabilities } from \"@usebutr/wallet-standard-shared\";\n\ntype WalletStandardCapabilityInput = {\n chainCount: number;\n features: {\n events: boolean;\n signAndExecuteTransaction: boolean;\n signMessage: boolean;\n signTransaction: boolean;\n };\n};\n\n/**\n * Sui Wallet Standard feature → butr capability mapping. The flags that hold\n * for every namespace are documented on `buildWalletCapabilities`.\n *\n * - `sendTransaction = sui:signAndExecuteTransaction present`. The wallet\n * broadcasts; consumers receive the digest.\n * - `signTransaction = sui:signTransaction present`. Sign-only; consumers\n * broadcast with their own RPC client (`@mysten/sui`'s SuiClient).\n * - `signMessage = sui:signPersonalMessage present`.\n * - `signIn = false`. Sui has no SIWS-equivalent feature in Wallet Standard.\n */\nconst resolveSuiCapabilities = (input: WalletStandardCapabilityInput): WalletCapabilities =>\n buildWalletCapabilities({\n chainCount: input.chainCount,\n events: input.features.events,\n sendTransaction: input.features.signAndExecuteTransaction,\n signIn: false,\n signMessage: input.features.signMessage,\n signTransaction: input.features.signTransaction,\n });\n\nexport type { WalletStandardCapabilityInput };\nexport { resolveSuiCapabilities };\n","import type { WalletAdapter } from \"@usebutr/core\";\nimport { base64ToBytes } from \"@usebutr/core\";\nimport {\n createWalletStandardCore,\n discoverWalletStandard,\n getFeature,\n slugify,\n} from \"@usebutr/wallet-standard-shared\";\nimport type { WalletStandardWallet } from \"@usebutr/wallet-standard-shared\";\n\nimport { resolveSuiCapabilities } from \"./capabilities\";\nimport type {\n SuiSignAndExecuteTransactionFeature,\n SuiSignPersonalMessageFeature,\n SuiSignTransactionFeature,\n} from \"./wallet-standard-types\";\n\nconst SUI_PREFIX = \"sui:\";\nconst SUI_DECIMALS = 9;\nconst SUI_MAINNET = \"sui:mainnet\";\n\n/** Coerce butr's `unknown` tx into the shape `sui:signAndExecuteTransaction`\n * expects (an object with `toJSON()` returning a Promise<string>). When\n * consumers pass a base64 string directly, we wrap it in a stub object so\n * the feature contract stays satisfied without us depending on\n * `@mysten/sui`. */\nconst coerceSuiTransaction = (tx: unknown): { toJSON: () => Promise<string> } | string => {\n if (typeof tx === \"string\") {\n return tx;\n }\n if (typeof tx === \"object\" && tx !== null && \"toJSON\" in tx && typeof tx.toJSON === \"function\") {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- validated toJSON() above; @mysten/sui Transaction is otherwise untyped here\n return tx as { toJSON: () => Promise<string> };\n }\n throw new TypeError(\n \"Sui sendTx/signTransaction expects a @mysten/sui Transaction (with toJSON()) or a base64-encoded string\",\n );\n};\n\n/**\n * Adapt a Sui Wallet Standard `Wallet` into a butr `WalletAdapter`.\n *\n * Returns `null` if the wallet doesn't advertise any Sui chain or doesn't\n * expose `standard:connect`. Same posture as `buildSvmAdapter`: gate\n * features on what each wallet advertises, return placeholders for\n * RPC-backed reads (`getBalance`, `getTransactionReceipt`), forward\n * `subscribe` through `standard:events`.\n *\n * **Known limitations**\n *\n * - `getBalance` returns a `{ value: 0n, symbol: \"SUI\" }` placeholder.\n * Consumers wrap `@mysten/sui`'s `SuiClient` for real reads.\n * - `getTransactionReceipt` returns `\"Pending\"` for the same reason.\n * - `switchChain` is local-state-only (mirrors SVM). Sui Wallet Standard\n * has no \"tell the wallet to switch network\" RPC; the wallet's UI\n * controls its global cluster setting.\n */\nconst buildSuiAdapter = (\n wallet: WalletStandardWallet,\n /** Optional. Called with a function that pushes a synthetic\n * `disconnected` event to all current subscribers. The discovery\n * layer invokes it on Wallet Standard `unregister`. */\n registerDisconnector?: (emit: () => void) => void,\n): WalletAdapter | null => {\n const core = createWalletStandardCore({\n chainPrefix: SUI_PREFIX,\n id: slugify(\"sui\", wallet.name),\n label: \"Sui\",\n namespace: \"sui\",\n platform: \"Sui\",\n preferredChainIds: [SUI_MAINNET],\n registerDisconnector,\n trackChainChanges: true,\n wallet,\n });\n if (core === null) {\n return null;\n }\n\n const signMessage = getFeature<SuiSignPersonalMessageFeature>(wallet, \"sui:signPersonalMessage\");\n const signAndExecute = getFeature<SuiSignAndExecuteTransactionFeature>(\n wallet,\n \"sui:signAndExecuteTransaction\",\n );\n const signTx = getFeature<SuiSignTransactionFeature>(wallet, \"sui:signTransaction\");\n\n const executeTx = async (tx: unknown, account?: { walletAddress: string }): Promise<string> => {\n if (signAndExecute === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise sui:signAndExecuteTransaction`);\n }\n const wsAccount = core.resolveAccount(account);\n const transaction = coerceSuiTransaction(tx);\n const output = await signAndExecute.signAndExecuteTransaction({\n account: wsAccount,\n chain: core.currentChainId(),\n transaction,\n });\n return output.digest;\n };\n\n return {\n ...core,\n capabilities: resolveSuiCapabilities({\n chainCount: core.chainCount,\n features: {\n events: core.hasEvents,\n signAndExecuteTransaction: Boolean(signAndExecute),\n signMessage: Boolean(signMessage),\n signTransaction: Boolean(signTx),\n },\n }),\n chainPlatform: \"sui\",\n\n getBalance: () =>\n Promise.resolve({\n decimals: SUI_DECIMALS,\n formatted: \"0\",\n symbol: \"SUI\",\n value: 0n,\n }),\n\n getTransactionReceipt: () => Promise.resolve({ status: \"Pending\" as const }),\n\n async requestAccounts() {\n await core.connect();\n },\n\n sendTx: (tx, account) => executeTx(tx, account),\n\n sendTxToChain: (tx, _targetChainId, account, cb) => {\n cb?.();\n return executeTx(tx, account);\n },\n\n async signMessage(msg, account) {\n if (signMessage === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise sui:signPersonalMessage`);\n }\n const output = await signMessage.signPersonalMessage({\n account: core.resolveAccount(account),\n message: msg,\n });\n return {\n signature: base64ToBytes(output.signature),\n signedMessage: base64ToBytes(output.bytes),\n };\n },\n\n ...(signTx === undefined\n ? {}\n : {\n async signTransaction(tx, account) {\n const wsAccount = core.resolveAccount(account);\n const transaction = coerceSuiTransaction(tx);\n const output = await signTx.signTransaction({\n account: wsAccount,\n chain: core.currentChainId(),\n transaction,\n });\n return base64ToBytes(output.bytes);\n },\n }),\n };\n};\n\n/**\n * Subscribe to Sui Wallet Standard announcements.\n * Spec: https://docs.sui.io/standards/wallet-standard\n *\n * Runtime requires the `@wallet-standard/app` package, which is an\n * **optional peer dependency** of butr.\n *\n * Sui wallets share the same `getWallets()` bus as SVM wallets; Phantom\n * advertises features for SVM, Sui, and Bitcoin from a single Wallet\n * Standard wallet object. `buildSuiAdapter` returns `null` for wallets\n * that don't advertise any `sui:*` features, so we cleanly end up with\n * one adapter per platform on multi-chain wallets.\n *\n * The discovery loop (dynamic import, dedupe, register / unregister\n * bridge) lives in `@usebutr/wallet-standard-shared`.\n */\nconst discoverSuiAdapters = (onAdapter: (adapter: WalletAdapter) => void): (() => void) =>\n discoverWalletStandard(onAdapter, (wallet, registerDisconnector) =>\n buildSuiAdapter(wallet, registerDisconnector),\n );\n\nexport { buildSuiAdapter, discoverSuiAdapters };\n","import type { ChainBase } from \"@usebutr/core\";\n\n// Sui wallets follow the Wallet Standard convention of advertising\n// chains as `sui:mainnet` / `sui:testnet` / `sui:devnet` / `sui:localnet`\n// rather than the strict CAIP-2 form (the genesis-checkpoint hash).\n// Sui Wallet, Suiet, Phantom (Sui), and Surf all exchange these short\n// names; the adapter's `switchChain` rejects anything else.\nconst SUI_CHAINS = {\n devnet: { id: \"sui:devnet\", name: \"Sui Devnet\", namespace: \"sui\", reference: \"devnet\" },\n localnet: {\n id: \"sui:localnet\",\n name: \"Sui Localnet\",\n namespace: \"sui\",\n reference: \"localnet\",\n },\n mainnet: {\n id: \"sui:mainnet\",\n name: \"Sui Mainnet\",\n namespace: \"sui\",\n reference: \"mainnet\",\n },\n testnet: { id: \"sui:testnet\", name: \"Sui Testnet\", namespace: \"sui\", reference: \"testnet\" },\n} as const satisfies Record<string, ChainBase>;\n\nconst SUI_CHAINS_LIST: ReadonlyArray<ChainBase> = Object.values(SUI_CHAINS);\n\nexport { SUI_CHAINS, SUI_CHAINS_LIST };\n","import type { PlatformDiscoverer } from \"@usebutr/core\";\n\nimport { discoverSuiAdapters } from \"./wallet-standard-adapter\";\n\n/**\n * Sui's `PlatformDiscoverer`: Sui Wallet Standard announcements. No\n * legacy fallback; Sui standardised on Wallet Standard from launch.\n */\nconst suiDiscoverer: PlatformDiscoverer = {\n subscribe: discoverSuiAdapters,\n};\n\nexport { suiDiscoverer };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/capabilities.ts","../src/wallet-standard-adapter.ts","../src/chains.ts","../src/discoverer.ts"],"sourcesContent":["import type { WalletCapabilities } from \"@usebutr/core\";\nimport { buildWalletCapabilities } from \"@usebutr/wallet-standard-shared\";\n\ntype WalletStandardCapabilityInput = {\n chainCount: number;\n features: {\n events: boolean;\n signAndExecuteTransaction: boolean;\n signMessage: boolean;\n signTransaction: boolean;\n };\n};\n\n/**\n * `signIn` is false: Sui Wallet Standard has no Sign-In-With-Sui feature.\n * `signAndExecuteTransaction` means the wallet broadcasts, while\n * `signTransaction` is sign-only and leaves the broadcast to the consumer.\n */\nconst resolveSuiCapabilities = (input: WalletStandardCapabilityInput): WalletCapabilities =>\n buildWalletCapabilities({\n chainCount: input.chainCount,\n events: input.features.events,\n sendTransaction: input.features.signAndExecuteTransaction,\n signIn: false,\n signMessage: input.features.signMessage,\n signTransaction: input.features.signTransaction,\n });\n\nexport type { WalletStandardCapabilityInput };\nexport { resolveSuiCapabilities };\n","import type { WalletAdapter } from \"@usebutr/core\";\nimport { base64ToBytes, bytesToBase64 } from \"@usebutr/core\";\nimport {\n createWalletStandardCore,\n discoverWalletStandard,\n getFeature,\n slugify,\n} from \"@usebutr/wallet-standard-shared\";\nimport type { WalletStandardWallet } from \"@usebutr/wallet-standard-shared\";\n\nimport { resolveSuiCapabilities } from \"./capabilities\";\nimport type {\n SuiSignAndExecuteTransactionFeature,\n SuiSignPersonalMessageFeature,\n SuiSignTransactionFeature,\n} from \"./wallet-standard-types\";\n\nconst SUI_PREFIX = \"sui:\";\nconst SUI_DECIMALS = 9;\nconst SUI_MAINNET = \"sui:mainnet\";\n\n/** Coerce butr's `unknown` tx into the shape the Sui Wallet Standard features\n * expect: an object with `toJSON()` returning a Promise<string>. A raw string\n * or BCS byte array is wrapped, because wallets accept only the `toJSON()`\n * form and a bare string reaches them as a shape they cannot consume. */\nconst coerceSuiTransaction = (tx: unknown): { toJSON: () => Promise<string> } => {\n if (typeof tx === \"string\") {\n return { toJSON: () => Promise.resolve(tx) };\n }\n if (tx instanceof Uint8Array) {\n const encoded = bytesToBase64(tx);\n return { toJSON: () => Promise.resolve(encoded) };\n }\n if (typeof tx === \"object\" && tx !== null && \"toJSON\" in tx && typeof tx.toJSON === \"function\") {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- validated toJSON() above; @mysten/sui Transaction is otherwise untyped here\n return tx as { toJSON: () => Promise<string> };\n }\n throw new TypeError(\n \"Sui sendTx/signTransaction expects a @mysten/sui Transaction (with toJSON()), a base64-encoded string, or BCS bytes\",\n );\n};\n\n/**\n * Sui Wallet Standard has no \"switch network\" RPC, so `switchChain` moves\n * butr's view only and the wallet's own UI owns its cluster. Balance and\n * receipt reads need `@mysten/sui`'s `SuiClient`, which butr doesn't ship.\n */\nconst buildSuiAdapter = (\n wallet: WalletStandardWallet,\n /** Optional. Called with a function that pushes a synthetic\n * `disconnected` event to all current subscribers. The discovery\n * layer invokes it on Wallet Standard `unregister`. */\n registerDisconnector?: (emit: () => void) => void,\n): WalletAdapter | null => {\n const core = createWalletStandardCore({\n chainPrefix: SUI_PREFIX,\n id: slugify(\"sui\", wallet.name),\n label: \"Sui\",\n namespace: \"sui\",\n platform: \"Sui\",\n preferredChainIds: [SUI_MAINNET],\n registerDisconnector,\n trackChainChanges: true,\n wallet,\n });\n if (core === null) {\n return null;\n }\n\n const signMessage = getFeature<SuiSignPersonalMessageFeature>(wallet, \"sui:signPersonalMessage\");\n const signAndExecute = getFeature<SuiSignAndExecuteTransactionFeature>(\n wallet,\n \"sui:signAndExecuteTransaction\",\n );\n const signTx = getFeature<SuiSignTransactionFeature>(wallet, \"sui:signTransaction\");\n\n /** Resolve a caller-supplied target into a chain the wallet advertises,\n * accepting either a full CAIP-2 id (`sui:testnet`) or a bare reference. */\n const resolveTargetChain = (targetChainId: string): string => {\n const candidate = targetChainId.startsWith(SUI_PREFIX)\n ? targetChainId\n : `${SUI_PREFIX}${targetChainId}`;\n if (!wallet.chains.includes(candidate)) {\n throw new Error(\n `Wallet ${wallet.name} does not advertise chain \"${candidate}\". Available: ${wallet.chains.join(\", \")}`,\n );\n }\n return candidate;\n };\n\n const executeTx = async (\n tx: unknown,\n account?: { walletAddress: string },\n chain?: string,\n ): Promise<string> => {\n if (signAndExecute === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise sui:signAndExecuteTransaction`);\n }\n const wsAccount = core.resolveAccount(account);\n const transaction = coerceSuiTransaction(tx);\n const output = await signAndExecute.signAndExecuteTransaction({\n account: wsAccount,\n chain: chain ?? core.currentChainId(),\n transaction,\n });\n return output.digest;\n };\n\n return {\n ...core,\n capabilities: resolveSuiCapabilities({\n chainCount: core.chainCount,\n features: {\n events: core.hasEvents,\n signAndExecuteTransaction: Boolean(signAndExecute),\n signMessage: Boolean(signMessage),\n signTransaction: Boolean(signTx),\n },\n }),\n chainPlatform: \"sui\",\n\n getBalance: () =>\n Promise.resolve({\n decimals: SUI_DECIMALS,\n formatted: \"0\",\n symbol: \"SUI\",\n value: 0n,\n }),\n\n getTransactionReceipt: () => Promise.resolve({ status: \"Pending\" as const }),\n\n async requestAccounts() {\n await core.connect();\n },\n\n sendTx: (tx, account) => executeTx(tx, account),\n\n // Async so an unadvertised chain surfaces as a rejection rather than a\n // synchronous throw; the declared return type is a promise either way.\n async sendTxToChain(tx, targetChainId, account, cb) {\n const target = resolveTargetChain(targetChainId);\n if (target !== core.currentChainId()) {\n cb?.();\n }\n const digest = await executeTx(tx, account, target);\n return digest;\n },\n\n async signMessage(msg, account) {\n if (signMessage === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise sui:signPersonalMessage`);\n }\n const output = await signMessage.signPersonalMessage({\n account: core.resolveAccount(account),\n message: msg,\n });\n return {\n signature: base64ToBytes(output.signature),\n signedMessage: base64ToBytes(output.bytes),\n };\n },\n\n ...(signTx === undefined\n ? {}\n : {\n async signTransaction(tx, account) {\n const wsAccount = core.resolveAccount(account);\n const transaction = coerceSuiTransaction(tx);\n const output = await signTx.signTransaction({\n account: wsAccount,\n chain: core.currentChainId(),\n transaction,\n });\n return {\n bytes: base64ToBytes(output.bytes),\n signature: base64ToBytes(output.signature),\n };\n },\n }),\n };\n};\n\n/**\n * Requires the optional `@wallet-standard/app` peer dep.\n * Spec: https://docs.sui.io/standards/wallet-standard\n */\nconst discoverSuiAdapters = (onAdapter: (adapter: WalletAdapter) => void): (() => void) =>\n discoverWalletStandard(onAdapter, (wallet, registerDisconnector) =>\n buildSuiAdapter(wallet, registerDisconnector),\n );\n\nexport { buildSuiAdapter, discoverSuiAdapters };\n","import type { ChainBase } from \"@usebutr/core\";\n\nconst SUI_CHAINS = {\n devnet: { id: \"sui:devnet\", name: \"Sui Devnet\", namespace: \"sui\", reference: \"devnet\" },\n localnet: {\n id: \"sui:localnet\",\n name: \"Sui Localnet\",\n namespace: \"sui\",\n reference: \"localnet\",\n },\n mainnet: {\n id: \"sui:mainnet\",\n name: \"Sui Mainnet\",\n namespace: \"sui\",\n reference: \"mainnet\",\n },\n testnet: { id: \"sui:testnet\", name: \"Sui Testnet\", namespace: \"sui\", reference: \"testnet\" },\n} as const satisfies Record<string, ChainBase>;\n\nconst SUI_CHAINS_LIST: ReadonlyArray<ChainBase> = Object.values(SUI_CHAINS);\n\nexport { SUI_CHAINS, SUI_CHAINS_LIST };\n","import type { PlatformDiscoverer } from \"@usebutr/core\";\n\nimport { discoverSuiAdapters } from \"./wallet-standard-adapter\";\n\n/**\n * Sui's `PlatformDiscoverer`: Sui Wallet Standard announcements. No\n * legacy fallback; Sui standardised on Wallet Standard from launch.\n */\nconst suiDiscoverer: PlatformDiscoverer = {\n subscribe: discoverSuiAdapters,\n};\n\nexport { suiDiscoverer };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usebutr/sui",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Wallet Standard adapter for butr (Sui).",
5
5
  "license": "MIT",
6
6
  "author": "Pedro Filho <pedro@filho.me>",
@@ -25,8 +25,8 @@
25
25
  "access": "public"
26
26
  },
27
27
  "dependencies": {
28
- "@usebutr/core": "1.0.0",
29
- "@usebutr/wallet-standard-shared": "0.4.0"
28
+ "@usebutr/core": "2.0.0",
29
+ "@usebutr/wallet-standard-shared": "0.5.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@wallet-standard/app": "^1.1.1",
@@ -47,7 +47,6 @@
47
47
  "build": "tsdown",
48
48
  "clean": "rm -rf dist",
49
49
  "dev": "tsdown --watch",
50
- "lint": "oxlint src",
51
50
  "test": "vitest run --passWithNoTests",
52
51
  "test:coverage": "vitest run --coverage --passWithNoTests",
53
52
  "typecheck": "tsc -p tsconfig.json --noEmit"