@hub3js/sui 0.0.0-experimental-29a36fc0-20260720

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.
@@ -0,0 +1,8 @@
1
+ import type { SuiActions } from './types.js';
2
+ import type { CanEagerConnect } from '@hub3js/core';
3
+ interface CanEagerConnectParams {
4
+ name: string;
5
+ }
6
+ export declare function canEagerConnect(params: CanEagerConnectParams): CanEagerConnect<SuiActions>;
7
+ export {};
8
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AACD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,qBAAqB,GAC5B,eAAe,CAAC,UAAU,CAAC,CAgB7B"}
@@ -0,0 +1,14 @@
1
+ import type { ChangeAccountSubscriberParams, ProviderAPI, SuiActions } from './types.js';
2
+ import type { WalletAccount } from '@mysten/wallet-standard';
3
+ import { ActionBuilder } from '@hub3js/core';
4
+ import { ChangeAccountSubscriberBuilder } from '@hub3js/std/hooks';
5
+ interface ConnectParams {
6
+ name: string;
7
+ }
8
+ export declare const connect: (params: ConnectParams) => ActionBuilder<SuiActions, "connect">;
9
+ export declare const canEagerConnect: () => ActionBuilder<SuiActions, "canEagerConnect">;
10
+ export declare const changeAccountSubscriber: (params: ChangeAccountSubscriberParams) => ChangeAccountSubscriberBuilder<{
11
+ accounts: readonly WalletAccount[];
12
+ }, ProviderAPI, SuiActions>;
13
+ export {};
14
+ //# sourceMappingURL=builders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,WAAW,EACX,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAYnE,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,OAAO,WAAY,aAAa,yCAsBX,CAAC;AAEnC,eAAO,MAAM,eAAe,oDACyC,CAAC;AAGtE,eAAO,MAAM,uBAAuB,WAC1B,6BAA6B;cAGvB,SAAS,aAAa,EAAE;2BAmBD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const CAIP_NAMESPACE = "sui";
2
+ export declare const CAIP_SUI_CHAIN_ID = "sui";
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,QAAQ,CAAC;AACpC,eAAO,MAAM,iBAAiB,QAAQ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ChangeAccountSubscriberParams, SuiActions } from './types.js';
2
+ import type { Subscriber, SubscriberCleanUp } from '@hub3js/core';
3
+ export declare function changeAccountSubscriber(params: ChangeAccountSubscriberParams): [Subscriber<SuiActions>, SubscriberCleanUp<SuiActions>];
4
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAIlE,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,6BAA6B,GACpC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAEzD"}
package/dist/mod.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export type { ProviderAPI, SuiActions } from './types.js';
2
+ export * as actions from './actions.js';
3
+ export * as builders from './builders.js';
4
+ export * as hooks from './hooks.js';
5
+ export { getInstanceOrThrow, getInstance } from './utils.js';
6
+ export { CAIP_NAMESPACE, CAIP_SUI_CHAIN_ID } from './constants.js';
7
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/mod.js ADDED
@@ -0,0 +1,2 @@
1
+ var u=Object.defineProperty;var r=(e,t)=>u(e,"name",{value:t,configurable:!0});var i=(e,t)=>{for(var n in t)u(e,n,{get:t[n],enumerable:!0})};var m={};i(m,{canEagerConnect:()=>S});function S(e){return async()=>{let t=o(e.name);try{return!!(await t.features["standard:connect"].connect({silent:!0})).accounts.length}catch{return!1}}}r(S,"canEagerConnect");var s={};i(s,{canEagerConnect:()=>w,changeAccountSubscriber:()=>x,connect:()=>_});import{ActionBuilder as f}from"@hub3js/core";import{ChangeAccountSubscriberBuilder as b}from"@hub3js/std/hooks";import{connectAndUpdateStateForSingleNetwork as h,intoConnecting as P,intoConnectionFinished as y}from"@hub3js/std/operators";import{AccountId as E}from"caip";var a="sui",c="sui";import{getWallets as C,SUI_MAINNET_CHAIN as I}from"@mysten/wallet-standard";import{AccountId as g}from"caip";function d(e){return C().get().find(n=>n.name===e&&n.chains.includes(I))}r(d,"getInstance");function o(e){let t=d(e);if(!t)throw new Error("We couldn't find the Sui instance on your wallet. It may be fixed by refreshing the page.");return t}r(o,"getInstanceOrThrow");function p(e){return e.map(t=>g.format({address:t.address,chainId:{namespace:"sui",reference:"sui"}}))}r(p,"formatAccountsToCAIP");var _=r(e=>new f("connect").action(async function(){return(await o(e.name).features["standard:connect"].connect()).accounts.map(A=>E.format({address:A.address,chainId:{namespace:"sui",reference:"sui"}}))}).and(h).before(P).after(y),"connect"),w=r(()=>new f("canEagerConnect"),"canEagerConnect"),x=r(e=>new b().getInstance(()=>o(e.name)).onSwitchAccount((t,n)=>{t.payload.accounts?.length||(n.action("disconnect"),t.preventDefault())}).format(async(t,n)=>p(n.accounts)).addEventListener((t,n)=>t.features["standard:events"].on("change",n)).removeEventListener((t,n)=>{}),"changeAccountSubscriber");var l={};i(l,{changeAccountSubscriber:()=>N});function N(e){return s.changeAccountSubscriber({name:e.name}).build()}r(N,"changeAccountSubscriber");export{a as CAIP_NAMESPACE,c as CAIP_SUI_CHAIN_ID,m as actions,s as builders,d as getInstance,o as getInstanceOrThrow,l as hooks};
2
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/actions.ts", "../src/builders.ts", "../src/constants.ts", "../src/utils.ts", "../src/hooks.ts"],
4
+ "sourcesContent": ["import type { SuiActions } from './types.js';\nimport type { CanEagerConnect } from '@hub3js/core';\n\nimport { getInstanceOrThrow } from './mod.js';\n\ninterface CanEagerConnectParams {\n name: string;\n}\nexport function canEagerConnect(\n params: CanEagerConnectParams,\n): CanEagerConnect<SuiActions> {\n return async () => {\n const wallet = getInstanceOrThrow(params.name);\n\n try {\n const connectResult = await wallet.features['standard:connect'].connect({\n silent: true,\n });\n if (connectResult.accounts.length) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n };\n}\n", "import type {\n ChangeAccountSubscriberParams,\n ProviderAPI,\n SuiActions,\n} from './types.js';\nimport type { CaipAccount } from '@hub3js/std/types';\nimport type { WalletAccount } from '@mysten/wallet-standard';\n\nimport { ActionBuilder } from '@hub3js/core';\nimport { ChangeAccountSubscriberBuilder } from '@hub3js/std/hooks';\nimport {\n connectAndUpdateStateForSingleNetwork,\n intoConnecting,\n intoConnectionFinished,\n} from '@hub3js/std/operators';\nimport { AccountId } from 'caip';\n\nimport { CAIP_NAMESPACE, CAIP_SUI_CHAIN_ID } from './constants.js';\nimport { formatAccountsToCAIP, getInstanceOrThrow } from './utils.js';\n\n// Actions\ninterface ConnectParams {\n name: string;\n}\n\nexport const connect = (params: ConnectParams) =>\n new ActionBuilder<SuiActions, 'connect'>('connect')\n .action(async function () {\n const wallet = getInstanceOrThrow(params.name);\n const features = wallet.features;\n\n const result = await features['standard:connect'].connect();\n\n const accounts = result.accounts.map((account) => {\n return AccountId.format({\n address: account.address,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: CAIP_SUI_CHAIN_ID,\n },\n }) as CaipAccount;\n });\n\n return accounts;\n })\n .and(connectAndUpdateStateForSingleNetwork)\n .before(intoConnecting)\n .after(intoConnectionFinished);\n\nexport const canEagerConnect = () =>\n new ActionBuilder<SuiActions, 'canEagerConnect'>('canEagerConnect');\n\n// Hooks\nexport const changeAccountSubscriber = (\n params: ChangeAccountSubscriberParams,\n) =>\n new ChangeAccountSubscriberBuilder<\n { accounts: readonly WalletAccount[] },\n ProviderAPI,\n SuiActions\n >()\n .getInstance(() => getInstanceOrThrow(params.name))\n /*\n * In some wallets, when a user switches to an account not yet connected to the dApp, it returns null.\n * A null value indicates no access to the account, requiring a disconnect and user reconnection.\n */\n .onSwitchAccount((event, context) => {\n if (!event.payload.accounts?.length) {\n context.action('disconnect');\n event.preventDefault();\n }\n })\n .format(async (_, event) => formatAccountsToCAIP(event.accounts))\n .addEventListener((instance, callback) =>\n instance.features['standard:events'].on('change', callback),\n )\n .removeEventListener((_, __) => {});\n", "/*\n * TODO: I couldn't found sui in caip\n * @see https://namespaces.chainagnostic.org/\n */\n\n// if the value neeeds to be change make sure you will update mapCaipNamespaceToLegacyNetworkName as well\nexport const CAIP_NAMESPACE = 'sui';\nexport const CAIP_SUI_CHAIN_ID = 'sui';\n", "import type {\n StandardConnectFeature,\n StandardEventsFeature,\n SuiFeatures,\n WalletWithFeatures,\n} from '@mysten/wallet-standard';\n\nimport { getWallets, SUI_MAINNET_CHAIN } from '@mysten/wallet-standard';\nimport { AccountId } from 'caip';\n\nimport { CAIP_NAMESPACE, CAIP_SUI_CHAIN_ID } from './constants.js';\n\n// TODO: StandardFetures doesn't work, so we should add each feature separately\ntype SuiWalletStandard = WalletWithFeatures<\n StandardConnectFeature & StandardEventsFeature & SuiFeatures\n>;\n\n/**\n * @param name each wallet has a name in WalletStandard. you should pass that value\n */\nexport function getInstance(name: string): SuiWalletStandard | undefined {\n const wallet = getWallets()\n .get()\n .find(\n (wallet) =>\n wallet.name === name && wallet.chains.includes(SUI_MAINNET_CHAIN),\n );\n\n return wallet as SuiWalletStandard;\n}\n\n/**\n * @param name each wallet has a name in WalletStandard. you should pass that value\n */\nexport function getInstanceOrThrow(name: string): SuiWalletStandard {\n const wallet = getInstance(name);\n\n if (!wallet) {\n throw new Error(\n \"We couldn't find the Sui instance on your wallet. It may be fixed by refreshing the page.\",\n );\n }\n\n return wallet;\n}\nexport function formatAccountsToCAIP(accounts: readonly { address: string }[]) {\n return accounts.map((account) => {\n return AccountId.format({\n address: account.address,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: CAIP_SUI_CHAIN_ID,\n },\n });\n });\n}\n", "import type { ChangeAccountSubscriberParams, SuiActions } from './types.js';\nimport type { Subscriber, SubscriberCleanUp } from '@hub3js/core';\n\nimport { builders } from './mod.js';\n\nexport function changeAccountSubscriber(\n params: ChangeAccountSubscriberParams,\n): [Subscriber<SuiActions>, SubscriberCleanUp<SuiActions>] {\n return builders.changeAccountSubscriber({ name: params.name }).build();\n}\n"],
5
+ "mappings": "6IAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAQO,SAASC,EACdC,EAC6B,CAC7B,MAAO,UAAY,CACjB,IAAMC,EAASC,EAAmBF,EAAO,IAAI,EAE7C,GAAI,CAIF,MAAI,GAHkB,MAAMC,EAAO,SAAS,kBAAkB,EAAE,QAAQ,CACtE,OAAQ,EACV,CAAC,GACiB,SAAS,MAI7B,MAAQ,CACN,MAAO,EACT,CACF,CACF,CAlBgBE,EAAAJ,EAAA,mBCRhB,IAAAK,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,4BAAAC,EAAA,YAAAC,IAQA,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,kCAAAC,MAAsC,oBAC/C,OACE,yCAAAC,EACA,kBAAAC,EACA,0BAAAC,MACK,wBACP,OAAS,aAAAC,MAAiB,OCTnB,IAAMC,EAAiB,MACjBC,EAAoB,MCAjC,OAAS,cAAAC,EAAY,qBAAAC,MAAyB,0BAC9C,OAAS,aAAAC,MAAiB,OAYnB,SAASC,EAAYC,EAA6C,CAQvE,OAPeC,EAAW,EACvB,IAAI,EACJ,KACEC,GACCA,EAAO,OAASF,GAAQE,EAAO,OAAO,SAASC,CAAiB,CACpE,CAGJ,CATgBC,EAAAL,EAAA,eAcT,SAASM,EAAmBL,EAAiC,CAClE,IAAME,EAASH,EAAYC,CAAI,EAE/B,GAAI,CAACE,EACH,MAAM,IAAI,MACR,2FACF,EAGF,OAAOA,CACT,CAVgBE,EAAAC,EAAA,sBAWT,SAASC,EAAqBC,EAA0C,CAC7E,OAAOA,EAAS,IAAKC,GACZC,EAAU,OAAO,CACtB,QAASD,EAAQ,QACjB,QAAS,CACP,UAAW,MACX,UAAW,KACb,CACF,CAAC,CACF,CACH,CAVgBJ,EAAAE,EAAA,wBFpBT,IAAMI,EAAUC,EAACC,GACtB,IAAIC,EAAqC,SAAS,EAC/C,OAAO,gBAAkB,CAgBxB,OAZe,MAHAC,EAAmBF,EAAO,IAAI,EACrB,SAEM,kBAAkB,EAAE,QAAQ,GAElC,SAAS,IAAKG,GAC7BC,EAAU,OAAO,CACtB,QAASD,EAAQ,QACjB,QAAS,CACP,UAAW,MACX,UAAW,KACb,CACF,CAAC,CACF,CAGH,CAAC,EACA,IAAIE,CAAqC,EACzC,OAAOC,CAAc,EACrB,MAAMC,CAAsB,EAtBV,WAwBVC,EAAkBT,EAAA,IAC7B,IAAIE,EAA6C,iBAAiB,EADrC,mBAIlBQ,EAA0BV,EACrCC,GAEA,IAAIU,EAIF,EACC,YAAY,IAAMR,EAAmBF,EAAO,IAAI,CAAC,EAKjD,gBAAgB,CAACW,EAAOC,IAAY,CAC9BD,EAAM,QAAQ,UAAU,SAC3BC,EAAQ,OAAO,YAAY,EAC3BD,EAAM,eAAe,EAEzB,CAAC,EACA,OAAO,MAAOE,EAAGF,IAAUG,EAAqBH,EAAM,QAAQ,CAAC,EAC/D,iBAAiB,CAACI,EAAUC,IAC3BD,EAAS,SAAS,iBAAiB,EAAE,GAAG,SAAUC,CAAQ,CAC5D,EACC,oBAAoB,CAACH,EAAGI,IAAO,CAAC,CAAC,EAvBC,2BGrDvC,IAAAC,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAKO,SAASC,EACdC,EACyD,CACzD,OAAOC,EAAS,wBAAwB,CAAE,KAAMD,EAAO,IAAK,CAAC,EAAE,MAAM,CACvE,CAJgBE,EAAAH,EAAA",
6
+ "names": ["actions_exports", "__export", "canEagerConnect", "canEagerConnect", "params", "wallet", "getInstanceOrThrow", "__name", "builders_exports", "__export", "canEagerConnect", "changeAccountSubscriber", "connect", "ActionBuilder", "ChangeAccountSubscriberBuilder", "connectAndUpdateStateForSingleNetwork", "intoConnecting", "intoConnectionFinished", "AccountId", "CAIP_NAMESPACE", "CAIP_SUI_CHAIN_ID", "getWallets", "SUI_MAINNET_CHAIN", "AccountId", "getInstance", "name", "getWallets", "wallet", "SUI_MAINNET_CHAIN", "__name", "getInstanceOrThrow", "formatAccountsToCAIP", "accounts", "account", "AccountId", "connect", "__name", "params", "ActionBuilder", "getInstanceOrThrow", "account", "AccountId", "connectAndUpdateStateForSingleNetwork", "intoConnecting", "intoConnectionFinished", "canEagerConnect", "changeAccountSubscriber", "ChangeAccountSubscriberBuilder", "event", "context", "_", "formatAccountsToCAIP", "instance", "callback", "__", "hooks_exports", "__export", "changeAccountSubscriber", "changeAccountSubscriber", "params", "builders_exports", "__name"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import type { Accounts, AutoImplementedActionsByRecommended, CommonActions } from '@hub3js/std/types';
2
+ import type { StandardConnectFeature, StandardEventsFeature, SuiFeatures, WalletWithFeatures } from '@mysten/wallet-standard';
3
+ export interface SuiActions extends AutoImplementedActionsByRecommended, CommonActions {
4
+ connect: () => Promise<Accounts>;
5
+ canEagerConnect: () => Promise<boolean>;
6
+ }
7
+ export type ProviderAPI = WalletWithFeatures<StandardConnectFeature & StandardEventsFeature & SuiFeatures>;
8
+ export interface ChangeAccountSubscriberParams {
9
+ name: string;
10
+ }
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,mCAAmC,EACnC,aAAa,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,UACf,SAAQ,mCAAmC,EAAE,aAAa;IAC1D,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,MAAM,WAAW,GAAG,kBAAkB,CAC1C,sBAAsB,GAAG,qBAAqB,GAAG,WAAW,CAC7D,CAAC;AAEF,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,15 @@
1
+ import type { StandardConnectFeature, StandardEventsFeature, SuiFeatures, WalletWithFeatures } from '@mysten/wallet-standard';
2
+ type SuiWalletStandard = WalletWithFeatures<StandardConnectFeature & StandardEventsFeature & SuiFeatures>;
3
+ /**
4
+ * @param name each wallet has a name in WalletStandard. you should pass that value
5
+ */
6
+ export declare function getInstance(name: string): SuiWalletStandard | undefined;
7
+ /**
8
+ * @param name each wallet has a name in WalletStandard. you should pass that value
9
+ */
10
+ export declare function getInstanceOrThrow(name: string): SuiWalletStandard;
11
+ export declare function formatAccountsToCAIP(accounts: readonly {
12
+ address: string;
13
+ }[]): string[];
14
+ export {};
15
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAQjC,KAAK,iBAAiB,GAAG,kBAAkB,CACzC,sBAAsB,GAAG,qBAAqB,GAAG,WAAW,CAC7D,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CASvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAUlE;AACD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,YAU5E"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@hub3js/sui",
3
+ "version": "0.0.0-experimental-29a36fc0-20260720",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "source": "./src/mod.ts",
7
+ "main": "./dist/mod.js",
8
+ "typings": "./dist/mod.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/mod.d.ts",
12
+ "default": "./dist/mod.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "src"
18
+ ],
19
+ "scripts": {
20
+ "build": "yarn run rangutopia library build",
21
+ "ts-check": "tsc --declaration --emitDeclarationOnly -p tsconfig.json",
22
+ "clean": "rimraf dist",
23
+ "format": "prettier --write '{.,src}/**/*.{ts,tsx}'",
24
+ "lint": "eslint \"**/*.{ts,tsx}\"",
25
+ "test": "vitest",
26
+ "coverage": "vitest run --coverage"
27
+ },
28
+ "peerDependencies": {
29
+ "@hub3js/core": "^0.0.0-experimental-29a36fc0-20260720"
30
+ },
31
+ "devDependencies": {
32
+ "@hub3js/core": "^0.0.0-experimental-29a36fc0-20260720",
33
+ "@types/node": "^25.6.0"
34
+ },
35
+ "dependencies": {
36
+ "@hub3js/std": "^0.0.0-experimental-29a36fc0-20260720",
37
+ "@mysten/wallet-standard": "^0.13.26",
38
+ "caip": "^1.1.1",
39
+ "rango-types": "^0.5.0"
40
+ },
41
+ "publishConfig": {
42
+ "access": "public"
43
+ }
44
+ }
package/readme.md ADDED
@@ -0,0 +1,3 @@
1
+ # @hub3js/sui
2
+
3
+ Package for handling Sui wallets supported by Rango
package/src/actions.ts ADDED
@@ -0,0 +1,27 @@
1
+ import type { SuiActions } from './types.js';
2
+ import type { CanEagerConnect } from '@hub3js/core';
3
+
4
+ import { getInstanceOrThrow } from './mod.js';
5
+
6
+ interface CanEagerConnectParams {
7
+ name: string;
8
+ }
9
+ export function canEagerConnect(
10
+ params: CanEagerConnectParams,
11
+ ): CanEagerConnect<SuiActions> {
12
+ return async () => {
13
+ const wallet = getInstanceOrThrow(params.name);
14
+
15
+ try {
16
+ const connectResult = await wallet.features['standard:connect'].connect({
17
+ silent: true,
18
+ });
19
+ if (connectResult.accounts.length) {
20
+ return true;
21
+ }
22
+ return false;
23
+ } catch {
24
+ return false;
25
+ }
26
+ };
27
+ }
@@ -0,0 +1,77 @@
1
+ import type {
2
+ ChangeAccountSubscriberParams,
3
+ ProviderAPI,
4
+ SuiActions,
5
+ } from './types.js';
6
+ import type { CaipAccount } from '@hub3js/std/types';
7
+ import type { WalletAccount } from '@mysten/wallet-standard';
8
+
9
+ import { ActionBuilder } from '@hub3js/core';
10
+ import { ChangeAccountSubscriberBuilder } from '@hub3js/std/hooks';
11
+ import {
12
+ connectAndUpdateStateForSingleNetwork,
13
+ intoConnecting,
14
+ intoConnectionFinished,
15
+ } from '@hub3js/std/operators';
16
+ import { AccountId } from 'caip';
17
+
18
+ import { CAIP_NAMESPACE, CAIP_SUI_CHAIN_ID } from './constants.js';
19
+ import { formatAccountsToCAIP, getInstanceOrThrow } from './utils.js';
20
+
21
+ // Actions
22
+ interface ConnectParams {
23
+ name: string;
24
+ }
25
+
26
+ export const connect = (params: ConnectParams) =>
27
+ new ActionBuilder<SuiActions, 'connect'>('connect')
28
+ .action(async function () {
29
+ const wallet = getInstanceOrThrow(params.name);
30
+ const features = wallet.features;
31
+
32
+ const result = await features['standard:connect'].connect();
33
+
34
+ const accounts = result.accounts.map((account) => {
35
+ return AccountId.format({
36
+ address: account.address,
37
+ chainId: {
38
+ namespace: CAIP_NAMESPACE,
39
+ reference: CAIP_SUI_CHAIN_ID,
40
+ },
41
+ }) as CaipAccount;
42
+ });
43
+
44
+ return accounts;
45
+ })
46
+ .and(connectAndUpdateStateForSingleNetwork)
47
+ .before(intoConnecting)
48
+ .after(intoConnectionFinished);
49
+
50
+ export const canEagerConnect = () =>
51
+ new ActionBuilder<SuiActions, 'canEagerConnect'>('canEagerConnect');
52
+
53
+ // Hooks
54
+ export const changeAccountSubscriber = (
55
+ params: ChangeAccountSubscriberParams,
56
+ ) =>
57
+ new ChangeAccountSubscriberBuilder<
58
+ { accounts: readonly WalletAccount[] },
59
+ ProviderAPI,
60
+ SuiActions
61
+ >()
62
+ .getInstance(() => getInstanceOrThrow(params.name))
63
+ /*
64
+ * In some wallets, when a user switches to an account not yet connected to the dApp, it returns null.
65
+ * A null value indicates no access to the account, requiring a disconnect and user reconnection.
66
+ */
67
+ .onSwitchAccount((event, context) => {
68
+ if (!event.payload.accounts?.length) {
69
+ context.action('disconnect');
70
+ event.preventDefault();
71
+ }
72
+ })
73
+ .format(async (_, event) => formatAccountsToCAIP(event.accounts))
74
+ .addEventListener((instance, callback) =>
75
+ instance.features['standard:events'].on('change', callback),
76
+ )
77
+ .removeEventListener((_, __) => {});
@@ -0,0 +1,8 @@
1
+ /*
2
+ * TODO: I couldn't found sui in caip
3
+ * @see https://namespaces.chainagnostic.org/
4
+ */
5
+
6
+ // if the value neeeds to be change make sure you will update mapCaipNamespaceToLegacyNetworkName as well
7
+ export const CAIP_NAMESPACE = 'sui';
8
+ export const CAIP_SUI_CHAIN_ID = 'sui';
package/src/hooks.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { ChangeAccountSubscriberParams, SuiActions } from './types.js';
2
+ import type { Subscriber, SubscriberCleanUp } from '@hub3js/core';
3
+
4
+ import { builders } from './mod.js';
5
+
6
+ export function changeAccountSubscriber(
7
+ params: ChangeAccountSubscriberParams,
8
+ ): [Subscriber<SuiActions>, SubscriberCleanUp<SuiActions>] {
9
+ return builders.changeAccountSubscriber({ name: params.name }).build();
10
+ }
package/src/mod.ts ADDED
@@ -0,0 +1,8 @@
1
+ export type { ProviderAPI, SuiActions } from './types.js';
2
+
3
+ export * as actions from './actions.js';
4
+ export * as builders from './builders.js';
5
+ export * as hooks from './hooks.js';
6
+ export { getInstanceOrThrow, getInstance } from './utils.js';
7
+
8
+ export { CAIP_NAMESPACE, CAIP_SUI_CHAIN_ID } from './constants.js';
package/src/types.ts ADDED
@@ -0,0 +1,25 @@
1
+ import type {
2
+ Accounts,
3
+ AutoImplementedActionsByRecommended,
4
+ CommonActions,
5
+ } from '@hub3js/std/types';
6
+ import type {
7
+ StandardConnectFeature,
8
+ StandardEventsFeature,
9
+ SuiFeatures,
10
+ WalletWithFeatures,
11
+ } from '@mysten/wallet-standard';
12
+
13
+ export interface SuiActions
14
+ extends AutoImplementedActionsByRecommended, CommonActions {
15
+ connect: () => Promise<Accounts>;
16
+ canEagerConnect: () => Promise<boolean>;
17
+ }
18
+
19
+ export type ProviderAPI = WalletWithFeatures<
20
+ StandardConnectFeature & StandardEventsFeature & SuiFeatures
21
+ >;
22
+
23
+ export interface ChangeAccountSubscriberParams {
24
+ name: string;
25
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,56 @@
1
+ import type {
2
+ StandardConnectFeature,
3
+ StandardEventsFeature,
4
+ SuiFeatures,
5
+ WalletWithFeatures,
6
+ } from '@mysten/wallet-standard';
7
+
8
+ import { getWallets, SUI_MAINNET_CHAIN } from '@mysten/wallet-standard';
9
+ import { AccountId } from 'caip';
10
+
11
+ import { CAIP_NAMESPACE, CAIP_SUI_CHAIN_ID } from './constants.js';
12
+
13
+ // TODO: StandardFetures doesn't work, so we should add each feature separately
14
+ type SuiWalletStandard = WalletWithFeatures<
15
+ StandardConnectFeature & StandardEventsFeature & SuiFeatures
16
+ >;
17
+
18
+ /**
19
+ * @param name each wallet has a name in WalletStandard. you should pass that value
20
+ */
21
+ export function getInstance(name: string): SuiWalletStandard | undefined {
22
+ const wallet = getWallets()
23
+ .get()
24
+ .find(
25
+ (wallet) =>
26
+ wallet.name === name && wallet.chains.includes(SUI_MAINNET_CHAIN),
27
+ );
28
+
29
+ return wallet as SuiWalletStandard;
30
+ }
31
+
32
+ /**
33
+ * @param name each wallet has a name in WalletStandard. you should pass that value
34
+ */
35
+ export function getInstanceOrThrow(name: string): SuiWalletStandard {
36
+ const wallet = getInstance(name);
37
+
38
+ if (!wallet) {
39
+ throw new Error(
40
+ "We couldn't find the Sui instance on your wallet. It may be fixed by refreshing the page.",
41
+ );
42
+ }
43
+
44
+ return wallet;
45
+ }
46
+ export function formatAccountsToCAIP(accounts: readonly { address: string }[]) {
47
+ return accounts.map((account) => {
48
+ return AccountId.format({
49
+ address: account.address,
50
+ chainId: {
51
+ namespace: CAIP_NAMESPACE,
52
+ reference: CAIP_SUI_CHAIN_ID,
53
+ },
54
+ });
55
+ });
56
+ }