@joai/warps-adapter-sui 1.2.0 → 1.3.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.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as _mysten_sui_client from '@mysten/sui/client';
2
2
  import { SuiClient } from '@mysten/sui/client';
3
- import { WarpClientConfig, WarpChainInfo, WarpChainAsset, ChainAdapterFactory, AdapterWarpAbiBuilder, WarpAbiContents, WarpAdapterGenericTransaction, WarpCacheConfig, AdapterWarpBrandBuilder, WarpBrand, WarpBuilder, AdapterWarpBuilder, Warp, AdapterWarpDataLoader, WarpChainAccount, WarpChainAction, WarpDataLoaderOptions, AdapterWarpExecutor, WarpExecutable, WarpActionExecutionResult, AdapterWarpExplorer, AdapterWarpOutput, WarpActionIndex, WarpAdapterGenericRemoteTransaction, ResolvedInput, WarpExecutionOutput, AdapterWarpSerializer, WarpSerializer, WarpActionInputType, WarpNativeValue, AdapterWarpWallet, WarpWalletDetails, WarpWalletProvider } from '@joai/warps';
3
+ import { WarpClientConfig, WarpChainInfo, WarpChainAsset, ChainAdapterFactory, AdapterWarpAbiBuilder, WarpAbiContents, WarpAdapterGenericTransaction, WarpCacheConfig, AdapterWarpBrandBuilder, WarpBrand, WarpBuilder, AdapterWarpBuilder, Warp, AdapterWarpDataLoader, WarpChainAccount, WarpDataLoaderOptions, WarpChainAction, AdapterWarpExecutor, WarpExecutable, WarpActionExecutionResult, AdapterWarpExplorer, AdapterWarpOutput, WarpActionIndex, WarpAdapterGenericRemoteTransaction, ResolvedInput, WarpExecutionOutput, AdapterWarpSerializer, WarpSerializer, WarpActionInputType, WarpNativeValue, AdapterWarpWallet, WarpWalletDetails, WarpWalletProvider } from '@joai/warps';
4
4
  import { Transaction } from '@mysten/sui/transactions';
5
5
 
6
6
  declare const WarpSuiConstants: {
@@ -87,6 +87,7 @@ declare class WarpSuiDataLoader implements AdapterWarpDataLoader {
87
87
  getAccount(address: string): Promise<WarpChainAccount>;
88
88
  getAccountAssets(address: string): Promise<WarpChainAsset[]>;
89
89
  getAsset(identifier: string): Promise<WarpChainAsset | null>;
90
+ getAccountNfts(address: string, options?: WarpDataLoaderOptions): Promise<WarpChainAsset[]>;
90
91
  getAction(identifier: string, awaitCompleted?: boolean): Promise<WarpChainAction | null>;
91
92
  getAccountActions(address: string, options?: WarpDataLoaderOptions): Promise<WarpChainAction[]>;
92
93
  }
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as _mysten_sui_client from '@mysten/sui/client';
2
2
  import { SuiClient } from '@mysten/sui/client';
3
- import { WarpClientConfig, WarpChainInfo, WarpChainAsset, ChainAdapterFactory, AdapterWarpAbiBuilder, WarpAbiContents, WarpAdapterGenericTransaction, WarpCacheConfig, AdapterWarpBrandBuilder, WarpBrand, WarpBuilder, AdapterWarpBuilder, Warp, AdapterWarpDataLoader, WarpChainAccount, WarpChainAction, WarpDataLoaderOptions, AdapterWarpExecutor, WarpExecutable, WarpActionExecutionResult, AdapterWarpExplorer, AdapterWarpOutput, WarpActionIndex, WarpAdapterGenericRemoteTransaction, ResolvedInput, WarpExecutionOutput, AdapterWarpSerializer, WarpSerializer, WarpActionInputType, WarpNativeValue, AdapterWarpWallet, WarpWalletDetails, WarpWalletProvider } from '@joai/warps';
3
+ import { WarpClientConfig, WarpChainInfo, WarpChainAsset, ChainAdapterFactory, AdapterWarpAbiBuilder, WarpAbiContents, WarpAdapterGenericTransaction, WarpCacheConfig, AdapterWarpBrandBuilder, WarpBrand, WarpBuilder, AdapterWarpBuilder, Warp, AdapterWarpDataLoader, WarpChainAccount, WarpDataLoaderOptions, WarpChainAction, AdapterWarpExecutor, WarpExecutable, WarpActionExecutionResult, AdapterWarpExplorer, AdapterWarpOutput, WarpActionIndex, WarpAdapterGenericRemoteTransaction, ResolvedInput, WarpExecutionOutput, AdapterWarpSerializer, WarpSerializer, WarpActionInputType, WarpNativeValue, AdapterWarpWallet, WarpWalletDetails, WarpWalletProvider } from '@joai/warps';
4
4
  import { Transaction } from '@mysten/sui/transactions';
5
5
 
6
6
  declare const WarpSuiConstants: {
@@ -87,6 +87,7 @@ declare class WarpSuiDataLoader implements AdapterWarpDataLoader {
87
87
  getAccount(address: string): Promise<WarpChainAccount>;
88
88
  getAccountAssets(address: string): Promise<WarpChainAsset[]>;
89
89
  getAsset(identifier: string): Promise<WarpChainAsset | null>;
90
+ getAccountNfts(address: string, options?: WarpDataLoaderOptions): Promise<WarpChainAsset[]>;
90
91
  getAction(identifier: string, awaitCompleted?: boolean): Promise<WarpChainAction | null>;
91
92
  getAccountActions(address: string, options?: WarpDataLoaderOptions): Promise<WarpChainAction[]>;
92
93
  }
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var de=Object.create;var z=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var ge=Object.getOwnPropertyNames;var me=Object.getPrototypeOf,fe=Object.prototype.hasOwnProperty;var ye=(o,e)=>{for(var r in e)z(o,r,{get:e[r],enumerable:!0})},G=(o,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ge(e))!fe.call(o,i)&&i!==r&&z(o,i,{get:()=>e[i],enumerable:!(t=he(e,i))||t.enumerable});return o};var We=(o,e,r)=>(r=o!=null?de(me(o)):{},G(e||!o||!o.__esModule?z(r,"default",{value:o,enumerable:!0}):r,o)),ve=o=>G(z({},"__esModule",{value:!0}),o);var Se={};ye(Se,{ExplorerUrls:()=>W,KnownTokens:()=>te,NativeTokenSui:()=>F,SuiAdapter:()=>be,SuiExplorers:()=>_,SuiExplorersConfig:()=>R,WarpSuiAbiBuilder:()=>C,WarpSuiBrandBuilder:()=>K,WarpSuiBuilder:()=>B,WarpSuiConstants:()=>we,WarpSuiContractLoader:()=>H,WarpSuiDataLoader:()=>k,WarpSuiExecutor:()=>N,WarpSuiExplorer:()=>D,WarpSuiOutput:()=>b,WarpSuiSerializer:()=>y,WarpSuiWallet:()=>$,findKnownTokenById:()=>M,getConfiguredSuiClient:()=>j});module.exports=ve(Se);var we={Sui:{Identifier:"SUI",DisplayName:"Sui",Decimals:9}},_=(a=>(a.SuiVision="suivision",a.SuiVisionTestnet="suivision_testnet",a.SuiVisionDevnet="suivision_devnet",a.SuiScan="suiscan",a.SuiScanTestnet="suiscan_testnet",a.SuiScanDevnet="suiscan_devnet",a))(_||{}),R={sui:{mainnet:["suivision","suiscan"],testnet:["suivision_testnet","suiscan_testnet"],devnet:["suivision_devnet","suiscan_devnet"]}},W={suivision:"https://suivision.xyz",suivision_testnet:"https://testnet.suivision.xyz",suivision_devnet:"https://devnet.suivision.xyz",suiscan:"https://suiscan.xyz",suiscan_testnet:"https://testnet.suiscan.xyz",suiscan_devnet:"https://devnet.suiscan.xyz"};var Q=require("@mysten/sui/client"),L=require("@joai/warps"),j=(o,e)=>{let r=(0,L.getProviderConfig)(o,e.name,o.env,e.defaultApiUrl);return new Q.SuiClient({url:r.url})};var U=require("@joai/warps");var J=require("@mysten/sui/client"),q=require("@joai/warps"),C=class{constructor(e,r){this.config=e;this.chain=r;let t=(0,q.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new J.SuiClient({url:t.url})}async createInscriptionTransaction(e){throw new Error("WarpSuiAbiBuilder: createInscriptionTransaction not implemented")}async createFromRaw(e){return JSON.parse(e)}async createFromTransaction(e){return this.createFromRaw(e.data||"{}")}async createFromTransactionHash(e,r){try{let t=await this.client.getTransactionBlock({digest:e});return t?this.createFromTransaction(t):null}catch{return null}}async getModuleAbi(e,r){return this.client.getNormalizedMoveModule({package:e,module:r})}async getFunctionAbi(e,r,t){return this.client.getNormalizedMoveFunction({package:e,module:r,function:t})}};var X=require("@mysten/sui/client"),Y=require("@mysten/sui/transactions"),Z=require("@joai/warps"),K=class{constructor(e,r){this.config=e;this.chain=r;let t=(0,Z.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new X.SuiClient({url:t.url})}createInscriptionTransaction(e){return new Y.Transaction}async createFromRaw(e){return JSON.parse(e)}async createFromTransaction(e,r){return this.createFromRaw(e.data||"{}")}async createFromTransactionHash(e,r){try{let t=await this.client.getTransactionBlock({digest:e});return t?this.createFromTransaction(t,!1):null}catch{return null}}};var ee=require("@mysten/sui/client"),P=require("@joai/warps"),B=class extends P.WarpBuilder{constructor(r,t){super(r);this.config=r;this.chain=t;this.cache=new P.WarpCache(r.env,r.cache);let i=(0,P.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new ee.SuiClient({url:i.url})}async createInscriptionTransaction(r){throw new Error("WarpSuiBuilder: on-chain inscription is not supported for Sui")}async createFromTransaction(r){return this.createFromRaw(r)}async createFromTransactionHash(r,t){return null}};var ie=require("@mysten/sui/client"),v=require("@joai/warps");var re=require("@joai/warps"),f=re.WarpChainName.Sui,te=[{chain:f,identifier:"0x2::sui::SUI",name:"Sui",symbol:"SUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/26375/small/sui-logo.png"},{chain:f,identifier:"0xa198f3be41cda8c07c3bf1c4e0bb88b8e9827b7c063f36b1e6c3d6da1c4e8753::usdc::USDC",name:"USD Coin",symbol:"USDC",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"},{chain:f,identifier:"0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48ace0cdd97::usdt::USDT",name:"Tether USD",symbol:"USDT",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/325/small/Tether.png"},{chain:f,identifier:"0xaf8cd5edc19c4512f4259f0bee101a7c94d8a5c0e7c90c7a7c8c8c8c8c8c8c8c8::wbtc::WBTC",name:"Wrapped Bitcoin",symbol:"WBTC",decimals:8,logoUrl:"https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png"},{chain:f,identifier:"0xb8a6a9b7c7a6f4a3e2d1c0b9a8f7e6d5c4b3a2b1c0d9e8f7a6b5c4d3e2f1a0b::weth::WETH",name:"Wrapped Ether",symbol:"WETH",decimals:8,logoUrl:"https://assets.coingecko.com/coins/images/2518/small/weth.png"},{chain:f,identifier:"0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a15e0e9::ocean::OCEAN",name:"Ocean Protocol",symbol:"OCEAN",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/3687/small/ocean-protocol-logo.png"},{chain:f,identifier:"0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c35569693fd50fb8b7::deep::DEEP",name:"DeepBook",symbol:"DEEP",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/30169/small/deepbook.png"},{chain:f,identifier:"0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47ba3::hasui::HASUI",name:"Haedal Staked SUI",symbol:"HASUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/30027/small/haSUI.png"},{chain:f,identifier:"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e935::usdc::USDC",name:"USD Coin (Wormhole)",symbol:"USDC",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"}],M=o=>te.find(e=>e.identifier===o)||null;var k=class{constructor(e,r){this.config=e;this.chain=r;let t=(0,v.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new ie.SuiClient({url:t.url}),this.cache=new v.WarpCache(e.env,e.cache)}async getAccount(e){let r=await this.client.getBalance({owner:e,coinType:"0x2::sui::SUI"});return{chain:this.chain.name,address:e,balance:BigInt(r.totalBalance)}}async getAccountAssets(e){let r=await this.client.getAllBalances({owner:e});console.log("WarpSuiDataLoader.getAccountAssets",r);let t=r.find(a=>a.coinType==="0x2::sui::SUI"),i=r.filter(a=>a.coinType!=="0x2::sui::SUI"&&BigInt(a.totalBalance)>0n),n=[];if(t&&BigInt(t.totalBalance)>0n&&n.push({...this.chain.nativeToken,amount:BigInt(t.totalBalance)}),i.length>0){let a=await Promise.all(i.map(s=>this.getAsset(s.coinType)));n.push(...a.filter(s=>s!==null).map(s=>({...s,amount:BigInt(i.find(c=>c.coinType===s.identifier)?.totalBalance||0)})))}return n}async getAsset(e){let r=v.WarpCacheKey.Asset(this.config.env,this.chain.name,e),t=await this.cache.get(r);if(t)return t;let i=M(e);if(i)return{chain:this.chain.name,identifier:e,name:i.name,symbol:i.symbol,amount:0n,decimals:i.decimals,logoUrl:i.logoUrl};try{let n=await this.client.getCoinMetadata({coinType:e}),a={chain:this.chain.name,identifier:e,name:n?.name||e.split("::").pop()||e,symbol:n?.symbol||e.split("::").pop()||e,amount:0n,decimals:n?.decimals||9,logoUrl:n?.iconUrl||""};return await this.cache.set(r,a,v.CacheTtl.OneHour),a}catch{return null}}async getAction(e,r=!1){return null}async getAccountActions(e,r){return[]}};var oe=require("@mysten/sui/client"),V=require("@mysten/sui/transactions"),d=require("@joai/warps");var se=require("@mysten/sui/client"),p=require("@joai/warps");var ne=require("@mysten/sui/transactions"),ae=require("@joai/warps"),y=class{constructor(){this.coreSerializer=new ae.WarpSerializer}typedToString(e){if(e==null)return"option:null";if(typeof e=="string")return`string:${e}`;if(typeof e=="boolean")return`bool:${e}`;if(typeof e=="number")return`uint64:${e.toString()}`;if(typeof e=="bigint")return`uint64:${e.toString()}`;if(e&&typeof e=="object"&&e.address)return`address:${e.address}`;if(Array.isArray(e)){if(e.length===0)return"vector:u8:";let r=this.typeToString(typeof e[0]),t=e.map(i=>this.typedToString(i).split(":")[1]);return`vector:${r}:${t.join(",")}`}if(e&&typeof e=="object"&&e.type&&e.value&&e.type==="option")return e.value===null||e.value===void 0?"option:null":`option:${this.typedToString(e.value)}`;throw new Error(`WarpSuiSerializer (typedToString): Unsupported input type: ${typeof e}`)}typedToNative(e){let r=this.typedToString(e);return this.coreSerializer.stringToNative(r)}nativeToTyped(e,r){let t=this.coreSerializer.nativeToString(e,r);return this.stringToTyped(t)}stringToTyped(e,r){let t=r||new ne.Transaction,[i,n]=e.split(/:(.*)/,2);if(i==="object")return t.object(n);if(i==="string")return t.pure.string(n);if(i==="bool")return t.pure.bool(n==="true");if(i==="u8")return t.pure.u8(Number(n));if(i==="u16")return t.pure.u16(Number(n));if(i==="u32")return t.pure.u32(Number(n));if(i==="u64"||i==="uint64")return t.pure.u64(BigInt(n));if(i==="u128")return t.pure.u128(BigInt(n));if(i==="u256")return t.pure.u256(BigInt(n));if(i==="address")return t.pure.address(n);throw new Error(`WarpSuiSerializer (stringToTyped): Unsupported type: ${i}`)}typeToString(e){if(e==="string")return"string";if(e==="bool")return"bool";if(e==="u8")return"u8";if(e==="u16")return"u16";if(e==="u32")return"u32";if(e==="u64"||e==="bigint"||e==="number")return"u64";if(e==="u128")return"u128";if(e==="u256")return"u256";if(e==="address")return"address";if(e==="vector")return"vector";if(e==="option")return"option";throw new Error(`WarpSuiSerializer (typeToString): Unsupported input type: ${e}`)}nativeToType(e){throw new Error("Not implemented")}};var b=class{constructor(e,r){this.config=e;this.chain=r;this.serializer=new y;let t=(0,p.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new se.SuiClient({url:t.url})}async getActionExecution(e,r,t){let i=await this.extractContractOutput(e,r,t,[]),n=(0,p.getNextInfo)(this.config,[],e,r,i.output),a=(0,p.applyOutputToMessages)(e,i.output,this.config);return{status:t.effects?.status?.status==="success"?"success":"error",warp:e,action:r,user:(0,p.getWarpWalletAddressFromConfig)(this.config,this.chain.name),txHash:t.digest,tx:t,next:n,values:i.values,output:i.output,messages:a,destination:null,resolvedInputs:[]}}async extractContractOutput(e,r,t,i){let n=[],a=[],s={};if(!e.output)return{values:{string:n,native:a,mapped:{}},output:s};for(let[c,u]of Object.entries(e.output)){if(u.startsWith(p.WarpConstants.Transform.Prefix))continue;if(u.startsWith("input.")){s[c]=u;continue}let g=(0,p.parseOutputOutIndex)(u);if(g!==null&&g!==r){s[c]=null;continue}if(u.startsWith("out.")){let m=t.returnValues?t.returnValues[c]:null;s[c]=m,n.push(String(m)),a.push(m)}else s[c]=u}return{values:{string:n,native:a,mapped:{}},output:await(0,p.evaluateOutputCommon)(e,s,a,r,i,this.serializer.coreSerializer,this.config)}}async extractQueryOutput(e,r,t,i){let n=r.map(u=>String(u)),a=r,s={string:n,native:a,mapped:{}},c={};if(!e.output)return{values:s,output:c};for(let[u,g]of Object.entries(e.output)){if(g.startsWith(p.WarpConstants.Transform.Prefix))continue;let m=(0,p.parseOutputOutIndex)(g);if(m!==null&&m!==t){c[u]=null;continue}if(g.startsWith("out.")||g==="out")if(Array.isArray(r)&&r.length>0&&typeof r[0]=="object"&&r[0]!==null){let ue=g.replace(/^out\./,"");c[u]=r[0][ue]}else c[u]=r[0];else c[u]=g}return{values:s,output:await(0,p.evaluateOutputCommon)(e,c,a,t,i,this.serializer.coreSerializer,this.config)}}};var N=class{constructor(e,r){this.config=e;this.chain=r;this.serializer=new y,this.output=new b(this.config,this.chain);let t=(0,d.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new oe.SuiClient({url:t.url}),this.userWallet=(0,d.getWarpWalletAddressFromConfig)(this.config,this.chain.name)}async createTransaction(e){let r=(0,d.getWarpActionByIndex)(e.warp,e.action);if(r.type==="transfer")return this.createTransferTransaction(e);if(r.type==="contract")return this.createContractCallTransaction(e);throw r.type==="query"?new Error("WarpSuiExecutor: Invalid action type for createTransaction; Use executeQuery instead"):r.type==="collect"?new Error("WarpSuiExecutor: Invalid action type for createTransaction; Use executeCollect instead"):new Error(`WarpSuiExecutor: Invalid action type (${r.type})`)}async createTransferTransaction(e){if(!this.userWallet)throw new Error("WarpSuiExecutor: createTransfer - user address not set");if(!e.destination)throw new Error("WarpSuiExecutor: Invalid destination address");if(e.value<0)throw new Error(`WarpSuiExecutor: Transfer value cannot be negative: ${e.value}`);let r=new V.Transaction,t=[];if(e.value>0){let i=await this.handleCoinTransfer(r,"0x2::sui::SUI",e.value);t.push(i)}for(let i of e.transfers){let n=await this.handleCoinTransfer(r,i.identifier,i.amount);t.push(n)}return t.length>0&&r.transferObjects(t,r.pure.address(e.destination)),r}async createContractCallTransaction(e){if(!this.userWallet)throw new Error("WarpSuiExecutor: createContractCall - user address not set");if(!e.destination)throw new Error("WarpSuiExecutor: Invalid contract address");if(e.value<0)throw new Error(`WarpSuiExecutor: Contract call value cannot be negative: ${e.value}`);let r=(0,d.getWarpActionByIndex)(e.warp,e.action);if(!r.func)throw new Error("WarpSuiExecutor: createContractCall - function not set");let t=new V.Transaction;t.setSender(this.userWallet);let i=[];e.value>0&&i.push(await this.handleCoinTransfer(t,"0x2::sui::SUI",e.value));for(let c of e.transfers)i.push(await this.handleCoinTransfer(t,c.identifier,c.amount));let{target:n,typeArguments:a}=this.parseMoveCallTarget(r),s=e.args.map(c=>this.serializer.stringToTyped(c,t));return n==="0x2::transfer::public_transfer"?i.push(...await this.buildPublicTransferArgs(t,e,s)):i.push(...s),t.moveCall({target:n,arguments:i,typeArguments:a}),t.setGasBudget(1e8),t}async executeQuery(e){if(!e.destination)throw new Error("WarpSuiExecutor: executeQuery - destination not set");let r=(0,d.getWarpActionByIndex)(e.warp,e.action);if(r.type!=="query")throw new Error(`WarpSuiExecutor: Invalid action type for executeQuery: ${r.type}`);let t=await this.client.getObject({id:e.destination,options:{showContent:!0}}),i=[t],{values:n,output:a}=await this.output.extractQueryOutput(e.warp,i,e.action,e.resolvedInputs),s=(0,d.getNextInfo)(this.config,[],e.warp,e.action,a),u=e.resolvedInputs.find(m=>m.input.position==="receiver"||m.input.position==="destination")?.value||e.destination,g=(0,d.extractResolvedInputValues)(e.resolvedInputs);return{status:"success",warp:e.warp,action:e.action,user:this.userWallet,txHash:null,tx:null,next:s,values:n,output:{...a,_DATA:t},resolvedInputs:g,messages:(0,d.applyOutputToMessages)(e.warp,a,this.config),destination:u}}async signMessage(e,r){throw new Error("Not implemented")}parseMoveCallTarget(e){if(!e.func)throw new Error("WarpSuiExecutor: Function not set");let r=`${e.address}::${e.func}`,t=e.typeArguments;if(!t&&e.func.includes("<")&&e.func.includes(">")){let i=e.func.match(/<([^>]+)>/);i&&(t=[i[1]],r=`${e.address}::${e.func.replace(/<[^>]+>/,"")}`)}return{target:r,typeArguments:t}}async buildPublicTransferArgs(e,r,t){let i=r.resolvedInputs.find(s=>String(s.input.position)==="arg:0")?.value||r.args[0],n=r.resolvedInputs.find(s=>String(s.input.position)==="arg:1")?.value||r.resolvedInputs.find(s=>s.input.type==="address"&&String(s.input.position)!=="arg:0")?.value||r.args[1],a=this.extractObjectId(i);if(!a)return t;try{if(!(await this.client.getObject({id:a,options:{showType:!0,showContent:!0}})).data?.type?.startsWith("0x2::coin::Coin<"))return t;let c=n?this.serializer.stringToTyped(n.includes(":")?n:`address:${n}`,e):t[1]||e.pure.address(this.userWallet);return[e.object(a),c]}catch{return t}}extractObjectId(e){if(!e||typeof e!="string")return null;let r=e.startsWith("object:")?e.substring(7):e;return r.startsWith("0x")?r:null}async handleCoinTransfer(e,r,t){if(r==="0x2::sui::SUI")try{return e.splitCoins(e.gas,[t.toString()])[0]}catch{}return this.createCoinTransferFromObjects(e,r,t)}async createCoinTransferFromObjects(e,r,t){let i=await this.getCoinObjectsForTransfer(r,t);if(i.length===0)throw new Error(`No coin objects found for ${r}`);let n=e.object(i[0].coinObjectId);return i.length>1&&e.mergeCoins(n,i.slice(1).map(a=>e.object(a.coinObjectId))),e.splitCoins(n,[t.toString()])[0]}async getCoinObjectsForTransfer(e,r){if(!this.userWallet)throw new Error("User wallet not set");let{data:t}=await this.client.getCoins({owner:this.userWallet,coinType:e}),i=t.map(s=>({coinObjectId:s.coinObjectId,balance:s.balance})).sort((s,c)=>BigInt(c.balance)>BigInt(s.balance)?1:-1),n=BigInt(0),a=[];for(let s of i)if(a.push(s),n+=BigInt(s.balance),n>=r)return a;throw new Error(`Insufficient ${e} balance. Required: ${r}, Available: ${n}`)}};var D=class{constructor(e,r){this.config=e;this.chain=r}getExplorers(){let e=R[this.chain.name];if(!e)return["suivision"];let r=e[this.config.env];return r||["suivision"]}getPrimaryExplorer(){return this.getExplorers()[0]}getExplorerUrlByName(e){let r=this.config.preferences?.explorers?.[this.chain.name];if(r&&!e){let n=W[r];if(n)return n}if(e){let n=W[e];if(n)return n}let t=this.getPrimaryExplorer();return W[t]||W[t]}getAccountUrl(e,r){return`${this.getExplorerUrlByName(r)}/account/${e}`}getTransactionUrl(e,r){return`${this.getExplorerUrlByName(r)}/txblock/${e}`}getBlockUrl(e,r){return`${this.getExplorerUrlByName(r)}/block/${e}`}getAssetUrl(e,r){return`${this.getExplorerUrlByName(r)}/coin/${e}`}getContractUrl(e,r){return`${this.getExplorerUrlByName(r)}/object/${e}`}getAllExplorers(){return this.getExplorers()}getExplorerByName(e){return this.getExplorers().find(t=>t.toLowerCase()===e.toLowerCase())}getAccountUrls(e){let r=this.getAllExplorers(),t={};return r.forEach(i=>{let n=W[i];n&&(t[i]=`${n}/account/${e}`)}),t}getTransactionUrls(e){let r=this.getAllExplorers(),t={};return r.forEach(i=>{let n=W[i];n&&(t[i]=`${n}/txblock/${e}`)}),t}};var pe=require("@joai/warps");var O=require("@mysten/sui/keypairs/ed25519"),ce=We(require("@scure/bip39"),1),le=require("@scure/bip39/wordlists/english.js"),l=require("@joai/warps"),S=class S{constructor(e,r){this.config=e;this.chain=r;this.keypair=null}async getAddress(){return(0,l.getWarpWalletAddressFromConfig)(this.config,this.chain.name)}async getPublicKey(){try{let r=this.getKeypair().getPublicKey();return Buffer.from(r.toRawBytes()).toString("hex")}catch{return null}}async signTransaction(e){if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return e;let r=this.getKeypair(),t=new TextEncoder().encode(JSON.stringify(e)),i=await r.signPersonalMessage(t);return{...e,signature:i.signature}}async signMessage(e){let r=this.getKeypair(),t=new TextEncoder().encode(e);return(await r.signPersonalMessage(t)).signature}getKeypairInstance(){return this.getKeypair()}async importFromMnemonic(e){let r=(0,l.normalizeAndValidateMnemonic)(e),i=O.Ed25519Keypair.deriveKeypair(r).getPublicKey().toSuiAddress(),n={provider:S.PROVIDER_NAME,address:i,privateKey:null,mnemonic:r};return(0,l.setWarpWalletInConfig)(this.config,this.chain.name,n),n}async importFromPrivateKey(e){let r=Buffer.from(e,"hex"),t;if(r.length===70)t=new Uint8Array(r.subarray(1,33));else if(r.length===32)t=new Uint8Array(r);else throw new Error(`Unsupported private key length: ${r.length} bytes`);let n=O.Ed25519Keypair.fromSecretKey(t).getPublicKey().toSuiAddress(),a={provider:S.PROVIDER_NAME,address:n,privateKey:e,mnemonic:null};return(0,l.setWarpWalletInConfig)(this.config,this.chain.name,a),a}async export(){let e=this.getKeypair(),r=(0,l.getWarpWalletMnemonicFromConfig)(this.config,this.chain.name),t=(0,l.getWarpWalletPrivateKeyFromConfig)(this.config,this.chain.name);return{provider:S.PROVIDER_NAME,address:e.getPublicKey().toSuiAddress(),privateKey:t||null,mnemonic:r||null}}async generate(){let e=ce.generateMnemonic(le.wordlist,256),r=(0,l.normalizeMnemonic)(e);(0,l.validateMnemonicLength)(r);let i=O.Ed25519Keypair.deriveKeypair(r).getPublicKey().toSuiAddress();return{provider:S.PROVIDER_NAME,address:i,privateKey:null,mnemonic:r}}async delete(e){(0,l.removeWarpWalletFromConfig)(this.config,this.chain.name)}getKeypair(){if(this.keypair)return this.keypair;let e=(0,l.getWarpWalletMnemonicFromConfig)(this.config,this.chain.name);if(!e)throw new Error("No mnemonic provided");return this.keypair=O.Ed25519Keypair.deriveKeypair(e.trim()),this.keypair}};S.PROVIDER_NAME="mnemonic";var T=S;var w=require("@joai/warps"),A=class{constructor(e,r){this.config=e;this.chain=r}async getAddress(){return(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name)}async getPublicKey(){return null}async signTransaction(e){let r=await this.getAddress();throw new Error(`Wallet can not be used for signing: ${r}`)}async signMessage(e){let r=await this.getAddress();throw new Error(`Wallet can not be used for signing: ${r}`)}async importFromMnemonic(e){let r=(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${r}`)}async importFromPrivateKey(e){let r=(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${r}`)}async export(){let e=(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${e}`)}async generate(){let e=(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${e}`)}async delete(e){(0,w.removeWarpWalletFromConfig)(this.config,this.chain.name)}};var I=require("@mysten/sui/keypairs/ed25519"),h=require("@joai/warps"),E=class E{constructor(e,r){this.config=e;this.chain=r;this.keypair=null}async getAddress(){return(0,h.getWarpWalletAddressFromConfig)(this.config,this.chain.name)}async getPublicKey(){try{let r=this.getKeypair().getPublicKey();return Buffer.from(r.toRawBytes()).toString("hex")}catch{return null}}async signTransaction(e){if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return e;let r=this.getKeypair(),t=new TextEncoder().encode(JSON.stringify(e)),i=await r.signPersonalMessage(t);return{...e,signature:i.signature}}async signMessage(e){let r=this.getKeypair(),t=new TextEncoder().encode(e);return(await r.signPersonalMessage(t)).signature}getKeypairInstance(){return this.getKeypair()}async importFromMnemonic(e){let r=I.Ed25519Keypair.deriveKeypair(e.trim()),t=r.getPublicKey().toSuiAddress(),i=Buffer.from(r.getSecretKey()).toString("hex"),n={provider:E.PROVIDER_NAME,address:t,privateKey:i,mnemonic:e};return(0,h.setWarpWalletInConfig)(this.config,this.chain.name,n),n}async importFromPrivateKey(e){let r=Buffer.from(e,"hex"),t;if(r.length===70)t=new Uint8Array(r.subarray(1,33));else if(r.length===32)t=new Uint8Array(r);else throw new Error(`Unsupported private key length: ${r.length} bytes`);let n=I.Ed25519Keypair.fromSecretKey(t).getPublicKey().toSuiAddress(),a={provider:E.PROVIDER_NAME,address:n,privateKey:e,mnemonic:null};return(0,h.setWarpWalletInConfig)(this.config,this.chain.name,a),a}async export(){let e=this.getKeypair(),r=(0,h.getWarpWalletPrivateKeyFromConfig)(this.config,this.chain.name),t=(0,h.getWarpWalletMnemonicFromConfig)(this.config,this.chain.name);return{provider:E.PROVIDER_NAME,address:e.getPublicKey().toSuiAddress(),privateKey:r||null,mnemonic:t||null}}async generate(){let e=I.Ed25519Keypair.generate(),r=e.getPublicKey().toSuiAddress(),t=Buffer.from(e.getSecretKey()).toString("hex");return{provider:E.PROVIDER_NAME,address:r,privateKey:t,mnemonic:null}}async delete(e){(0,h.removeWarpWalletFromConfig)(this.config,this.chain.name)}getKeypair(){if(this.keypair)return this.keypair;let e=(0,h.getWarpWalletPrivateKeyFromConfig)(this.config,this.chain.name);if(!e)throw new Error("Wallet not initialized - no private key provided");try{let r=Buffer.from(e,"hex");if(r.length===70){let t=new Uint8Array(r.subarray(1,33));return this.keypair=I.Ed25519Keypair.fromSecretKey(t),this.keypair}else{if(r.length===32)return this.keypair=I.Ed25519Keypair.fromSecretKey(new Uint8Array(r)),this.keypair;throw new Error(`Unsupported private key length: ${r.length} bytes`)}}catch(r){throw r}}};E.PROVIDER_NAME="privateKey";var x=E;var $=class{constructor(e,r){this.config=e;this.chain=r;this.cachedAddress=null;this.cachedPublicKey=null;this.client=j(e,r),this.walletProvider=this.createProvider(),this.isInitializedPromise=new Promise(t=>{this.isInitializedResolve=t}),this.initializeCache()}async waitUntilInitialized(){await this.isInitializedPromise}async signTransaction(e){if(await this.waitUntilInitialized(),!e||typeof e!="object")throw new Error("Invalid transaction object");if(!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof A)throw new Error(`Wallet (${this.chain.name}) is read-only`);return(this.walletProvider instanceof x||this.walletProvider instanceof T)&&e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function"?e:await this.walletProvider.signTransaction(e)}async signMessage(e){if(await this.waitUntilInitialized(),!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof A)throw new Error(`Wallet (${this.chain.name}) is read-only`);return await this.walletProvider.signMessage(e)}async signTransactions(e){return await this.waitUntilInitialized(),e}async sendTransaction(e){if(await this.waitUntilInitialized(),!e||typeof e!="object")throw new Error("Invalid transaction object");if(e.transactionHash)return e.transactionHash;if(e&&typeof e=="object"&&"bytes"in e&&"signature"in e)return(await this.client.executeTransactionBlock({transactionBlock:e.bytes,signature:Array.isArray(e.signature)?e.signature:[e.signature],options:{showEffects:!0,showEvents:!0}})).digest;if(!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof x||this.walletProvider instanceof T){let r=this.walletProvider.getKeypairInstance();if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return(await this.client.signAndExecuteTransaction({transaction:e,signer:r,options:{showEffects:!0,showEvents:!0}})).digest;throw new Error(`Transaction must be a Transaction object or have bytes and signature. Got: ${typeof e}, has sign: ${e&&typeof e=="object"&&"sign"in e}, has bytes: ${e&&typeof e=="object"&&"bytes"in e}, has signature: ${e&&typeof e=="object"&&"signature"in e}`)}throw new Error("Remote wallet provider must return signed payload (bytes + signature) or transactionHash for Sui transactions")}async sendTransactions(e){return await this.waitUntilInitialized(),Promise.all(e.map(async r=>this.sendTransaction(r)))}async importFromMnemonic(e){return await this.waitUntilInitialized(),await this.createProviderForOperation("mnemonic").importFromMnemonic(e)}async importFromPrivateKey(e){return await this.waitUntilInitialized(),await this.createProviderForOperation("privateKey").importFromPrivateKey(e)}async export(e){return await this.waitUntilInitialized(),await this.createProviderForOperation(e).export()}async generate(e){return await this.waitUntilInitialized(),await this.createProviderForOperation(e).generate()}async delete(e,r){await this.waitUntilInitialized(),await this.createProviderForOperation(e).delete(r)}getAddress(){return this.cachedAddress}getPublicKey(){return this.cachedPublicKey}createProvider(){let e=this.config.user?.wallets?.[this.chain.name];return e?typeof e=="string"?new A(this.config,this.chain):e.provider?this.createProviderForOperation(e.provider):new A(this.config,this.chain):null}async initializeCache(){let e=await(0,pe.initializeWalletCache)(this.walletProvider);this.cachedAddress=e.address,this.cachedPublicKey=e.publicKey,this.isInitializedResolve()}createProviderForOperation(e){let t=this.config.walletProviders?.[this.chain.name]?.[e];if(t){let i=t(this.config,this.chain);if(!i)throw new Error(`Custom wallet provider factory returned null for ${e}`);return i}if(e==="privateKey")return new x(this.config,this.chain);if(e==="mnemonic")return new T(this.config,this.chain);throw new Error(`Unsupported wallet provider for ${this.chain.name}: ${e}`)}};var F={chain:U.WarpChainName.Sui,identifier:"0x2::sui::SUI",name:"SUI",symbol:"SUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/26375/standard/sui-ocean-square.png?1727791290"};function Ce(o,e){return(r,t)=>{if(!t)throw new Error(`${o} adapter requires a fallback adapter`);let i=e[r.env];if(!i)throw new Error(`SuiAdapter: chain info not found for chain ${o}`);return{chainInfo:i,builder:()=>new B(r,i),executor:new N(r,i),output:new b(r,i),serializer:new y,registry:t.registry,explorer:new D(r,i),abiBuilder:()=>new C(r,i),brandBuilder:()=>new K(r,i),dataLoader:new k(r,i),wallet:new $(r,i)}}}var be=Ce(U.WarpChainName.Sui,{mainnet:{name:U.WarpChainName.Sui,displayName:"Sui",chainId:"1",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.mainnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:F},testnet:{name:U.WarpChainName.Sui,displayName:"Sui Testnet",chainId:"testnet",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.testnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:F},devnet:{name:U.WarpChainName.Sui,displayName:"Sui Devnet",chainId:"devnet",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.devnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:F}});var H=class{constructor(e,r){this.abi=new C(e,r)}async loadModuleAbi(e,r){return this.abi.getModuleAbi(e,r)}async loadFunctionAbi(e,r,t){return this.abi.getFunctionAbi(e,r,t)}};0&&(module.exports={ExplorerUrls,KnownTokens,NativeTokenSui,SuiAdapter,SuiExplorers,SuiExplorersConfig,WarpSuiAbiBuilder,WarpSuiBrandBuilder,WarpSuiBuilder,WarpSuiConstants,WarpSuiContractLoader,WarpSuiDataLoader,WarpSuiExecutor,WarpSuiExplorer,WarpSuiOutput,WarpSuiSerializer,WarpSuiWallet,findKnownTokenById,getConfiguredSuiClient});
1
+ "use strict";var me=Object.create;var F=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var We=Object.getPrototypeOf,ve=Object.prototype.hasOwnProperty;var we=(o,e)=>{for(var t in e)F(o,t,{get:e[t],enumerable:!0})},Q=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ye(e))!ve.call(o,i)&&i!==t&&F(o,i,{get:()=>e[i],enumerable:!(r=fe(e,i))||r.enumerable});return o};var Ce=(o,e,t)=>(t=o!=null?me(We(o)):{},Q(e||!o||!o.__esModule?F(t,"default",{value:o,enumerable:!0}):t,o)),be=o=>Q(F({},"__esModule",{value:!0}),o);var Ee={};we(Ee,{ExplorerUrls:()=>W,KnownTokens:()=>ne,NativeTokenSui:()=>j,SuiAdapter:()=>Pe,SuiExplorers:()=>L,SuiExplorersConfig:()=>R,WarpSuiAbiBuilder:()=>C,WarpSuiBrandBuilder:()=>K,WarpSuiBuilder:()=>B,WarpSuiConstants:()=>Ae,WarpSuiContractLoader:()=>_,WarpSuiDataLoader:()=>k,WarpSuiExecutor:()=>N,WarpSuiExplorer:()=>D,WarpSuiOutput:()=>b,WarpSuiSerializer:()=>y,WarpSuiWallet:()=>z,findKnownTokenById:()=>V,getConfiguredSuiClient:()=>M});module.exports=be(Ee);var Ae={Sui:{Identifier:"SUI",DisplayName:"Sui",Decimals:9}},L=(a=>(a.SuiVision="suivision",a.SuiVisionTestnet="suivision_testnet",a.SuiVisionDevnet="suivision_devnet",a.SuiScan="suiscan",a.SuiScanTestnet="suiscan_testnet",a.SuiScanDevnet="suiscan_devnet",a))(L||{}),R={sui:{mainnet:["suivision","suiscan"],testnet:["suivision_testnet","suiscan_testnet"],devnet:["suivision_devnet","suiscan_devnet"]}},W={suivision:"https://suivision.xyz",suivision_testnet:"https://testnet.suivision.xyz",suivision_devnet:"https://devnet.suivision.xyz",suiscan:"https://suiscan.xyz",suiscan_testnet:"https://testnet.suiscan.xyz",suiscan_devnet:"https://devnet.suiscan.xyz"};var J=require("@mysten/sui/client"),q=require("@joai/warps"),M=(o,e)=>{let t=(0,q.getProviderConfig)(o,e.name,o.env,e.defaultApiUrl);return new J.SuiClient({url:t.url})};var U=require("@joai/warps");var X=require("@mysten/sui/client"),Y=require("@joai/warps"),C=class{constructor(e,t){this.config=e;this.chain=t;let r=(0,Y.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new X.SuiClient({url:r.url})}async createInscriptionTransaction(e){throw new Error("WarpSuiAbiBuilder: createInscriptionTransaction not implemented")}async createFromRaw(e){return JSON.parse(e)}async createFromTransaction(e){return this.createFromRaw(e.data||"{}")}async createFromTransactionHash(e,t){try{let r=await this.client.getTransactionBlock({digest:e});return r?this.createFromTransaction(r):null}catch{return null}}async getModuleAbi(e,t){return this.client.getNormalizedMoveModule({package:e,module:t})}async getFunctionAbi(e,t,r){return this.client.getNormalizedMoveFunction({package:e,module:t,function:r})}};var Z=require("@mysten/sui/client"),ee=require("@mysten/sui/transactions"),te=require("@joai/warps"),K=class{constructor(e,t){this.config=e;this.chain=t;let r=(0,te.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new Z.SuiClient({url:r.url})}createInscriptionTransaction(e){return new ee.Transaction}async createFromRaw(e){return JSON.parse(e)}async createFromTransaction(e,t){return this.createFromRaw(e.data||"{}")}async createFromTransactionHash(e,t){try{let r=await this.client.getTransactionBlock({digest:e});return r?this.createFromTransaction(r,!1):null}catch{return null}}};var re=require("@mysten/sui/client"),E=require("@joai/warps"),B=class extends E.WarpBuilder{constructor(t,r){super(t);this.config=t;this.chain=r;this.cache=new E.WarpCache(t.env,t.cache);let i=(0,E.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new re.SuiClient({url:i.url})}async createInscriptionTransaction(t){throw new Error("WarpSuiBuilder: on-chain inscription is not supported for Sui")}async createFromTransaction(t){return this.createFromRaw(t)}async createFromTransactionHash(t,r){return null}};var ae=require("@mysten/sui/client"),v=require("@joai/warps");var ie=require("@joai/warps"),f=ie.WarpChainName.Sui,ne=[{chain:f,identifier:"0x2::sui::SUI",name:"Sui",symbol:"SUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/26375/small/sui-logo.png"},{chain:f,identifier:"0xa198f3be41cda8c07c3bf1c4e0bb88b8e9827b7c063f36b1e6c3d6da1c4e8753::usdc::USDC",name:"USD Coin",symbol:"USDC",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"},{chain:f,identifier:"0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48ace0cdd97::usdt::USDT",name:"Tether USD",symbol:"USDT",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/325/small/Tether.png"},{chain:f,identifier:"0xaf8cd5edc19c4512f4259f0bee101a7c94d8a5c0e7c90c7a7c8c8c8c8c8c8c8c8::wbtc::WBTC",name:"Wrapped Bitcoin",symbol:"WBTC",decimals:8,logoUrl:"https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png"},{chain:f,identifier:"0xb8a6a9b7c7a6f4a3e2d1c0b9a8f7e6d5c4b3a2b1c0d9e8f7a6b5c4d3e2f1a0b::weth::WETH",name:"Wrapped Ether",symbol:"WETH",decimals:8,logoUrl:"https://assets.coingecko.com/coins/images/2518/small/weth.png"},{chain:f,identifier:"0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a15e0e9::ocean::OCEAN",name:"Ocean Protocol",symbol:"OCEAN",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/3687/small/ocean-protocol-logo.png"},{chain:f,identifier:"0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c35569693fd50fb8b7::deep::DEEP",name:"DeepBook",symbol:"DEEP",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/30169/small/deepbook.png"},{chain:f,identifier:"0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47ba3::hasui::HASUI",name:"Haedal Staked SUI",symbol:"HASUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/30027/small/haSUI.png"},{chain:f,identifier:"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e935::usdc::USDC",name:"USD Coin (Wormhole)",symbol:"USDC",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"}],V=o=>ne.find(e=>e.identifier===o)||null;var k=class{constructor(e,t){this.config=e;this.chain=t;let r=(0,v.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new ae.SuiClient({url:r.url}),this.cache=new v.WarpCache(e.env,e.cache)}async getAccount(e){let t=await this.client.getBalance({owner:e,coinType:"0x2::sui::SUI"});return{chain:this.chain.name,address:e,balance:BigInt(t.totalBalance)}}async getAccountAssets(e){let t=await this.client.getAllBalances({owner:e});console.log("WarpSuiDataLoader.getAccountAssets",t);let r=t.find(a=>a.coinType==="0x2::sui::SUI"),i=t.filter(a=>a.coinType!=="0x2::sui::SUI"&&BigInt(a.totalBalance)>0n),n=[];if(r&&BigInt(r.totalBalance)>0n&&n.push({...this.chain.nativeToken,amount:BigInt(r.totalBalance)}),i.length>0){let a=await Promise.all(i.map(s=>this.getAsset(s.coinType)));n.push(...a.filter(s=>s!==null).map(s=>({...s,amount:BigInt(i.find(c=>c.coinType===s.identifier)?.totalBalance||0)})))}return n}async getAsset(e){let t=v.WarpCacheKey.Asset(this.config.env,this.chain.name,e),r=await this.cache.get(t);if(r)return r;let i=V(e);if(i)return{chain:this.chain.name,identifier:e,name:i.name,symbol:i.symbol,amount:0n,decimals:i.decimals,logoUrl:i.logoUrl};try{let n=await this.client.getCoinMetadata({coinType:e}),a={chain:this.chain.name,identifier:e,name:n?.name||e.split("::").pop()||e,symbol:n?.symbol||e.split("::").pop()||e,amount:0n,decimals:n?.decimals||9,logoUrl:n?.iconUrl||""};return await this.cache.set(t,a,v.CacheTtl.OneHour),a}catch{return null}}async getAccountNfts(e,t){try{let r=t?.size||25,i=t?.page||0,n;for(let c=0;c<i;c++){let l=await this.client.getOwnedObjects({owner:e,options:{showContent:!1,showDisplay:!1},limit:r,cursor:n});if(n=l.nextCursor,!l.hasNextPage)return[]}let a=await this.client.getOwnedObjects({owner:e,options:{showContent:!0,showDisplay:!0},limit:r,cursor:n}),s=[];for(let c of a.data){let l=c.data?.content,d=c.data?.display?.data,h=l?.type||"";if(h.startsWith("0x2::coin::Coin"))continue;let $=c.data?.objectId||"",he=d?.name||h.split("::").pop()||$.slice(0,8),ge=h.includes("::")?h.split("::").slice(0,2).join("::"):void 0,G=d?.image_url;s.push({chain:this.chain.name,identifier:$,name:he,symbol:"",amount:1n,decimals:0,type:"nft",nft:{collection:ge,mediaUrl:G,thumbnailUrl:G}})}return s}catch{return[]}}async getAction(e,t=!1){return null}async getAccountActions(e,t){return[]}};var le=require("@mysten/sui/client"),H=require("@mysten/sui/transactions"),g=require("@joai/warps");var ce=require("@mysten/sui/client"),u=require("@joai/warps");var se=require("@mysten/sui/transactions"),oe=require("@joai/warps"),y=class{constructor(){this.coreSerializer=new oe.WarpSerializer}typedToString(e){if(e==null)return"option:null";if(typeof e=="string")return`string:${e}`;if(typeof e=="boolean")return`bool:${e}`;if(typeof e=="number")return`uint64:${e.toString()}`;if(typeof e=="bigint")return`uint64:${e.toString()}`;if(e&&typeof e=="object"&&e.address)return`address:${e.address}`;if(Array.isArray(e)){if(e.length===0)return"vector:u8:";let t=this.typeToString(typeof e[0]),r=e.map(i=>this.typedToString(i).split(":")[1]);return`vector:${t}:${r.join(",")}`}if(e&&typeof e=="object"&&e.type&&e.value&&e.type==="option")return e.value===null||e.value===void 0?"option:null":`option:${this.typedToString(e.value)}`;throw new Error(`WarpSuiSerializer (typedToString): Unsupported input type: ${typeof e}`)}typedToNative(e){let t=this.typedToString(e);return this.coreSerializer.stringToNative(t)}nativeToTyped(e,t){let r=this.coreSerializer.nativeToString(e,t);return this.stringToTyped(r)}stringToTyped(e,t){let r=t||new se.Transaction,[i,n]=e.split(/:(.*)/,2);if(i==="object")return r.object(n);if(i==="string")return r.pure.string(n);if(i==="bool")return r.pure.bool(n==="true");if(i==="u8")return r.pure.u8(Number(n));if(i==="u16")return r.pure.u16(Number(n));if(i==="u32")return r.pure.u32(Number(n));if(i==="u64"||i==="uint64")return r.pure.u64(BigInt(n));if(i==="u128")return r.pure.u128(BigInt(n));if(i==="u256")return r.pure.u256(BigInt(n));if(i==="address")return r.pure.address(n);throw new Error(`WarpSuiSerializer (stringToTyped): Unsupported type: ${i}`)}typeToString(e){if(e==="string")return"string";if(e==="bool")return"bool";if(e==="u8")return"u8";if(e==="u16")return"u16";if(e==="u32")return"u32";if(e==="u64"||e==="bigint"||e==="number")return"u64";if(e==="u128")return"u128";if(e==="u256")return"u256";if(e==="address")return"address";if(e==="vector")return"vector";if(e==="option")return"option";throw new Error(`WarpSuiSerializer (typeToString): Unsupported input type: ${e}`)}nativeToType(e){throw new Error("Not implemented")}};var b=class{constructor(e,t){this.config=e;this.chain=t;this.serializer=new y;let r=(0,u.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new ce.SuiClient({url:r.url})}async getActionExecution(e,t,r){let i=await this.extractContractOutput(e,t,r,[]),n=(0,u.getNextInfo)(this.config,[],e,t,i.output),a=(0,u.applyOutputToMessages)(e,i.output,this.config);return{status:r.effects?.status?.status==="success"?"success":"error",warp:e,action:t,user:(0,u.getWarpWalletAddressFromConfig)(this.config,this.chain.name),txHash:r.digest,tx:r,next:n,values:i.values,output:i.output,messages:a,destination:null,resolvedInputs:[]}}async extractContractOutput(e,t,r,i){let n=[],a=[],s={};if(!e.output)return{values:{string:n,native:a,mapped:{}},output:s};for(let[c,l]of Object.entries(e.output)){if(l.startsWith(u.WarpConstants.Transform.Prefix))continue;if(l.startsWith("input.")){s[c]=l;continue}let d=(0,u.parseOutputOutIndex)(l);if(d!==null&&d!==t){s[c]=null;continue}if(l.startsWith("out.")){let h=r.returnValues?r.returnValues[c]:null;s[c]=h,n.push(String(h)),a.push(h)}else s[c]=l}return{values:{string:n,native:a,mapped:{}},output:await(0,u.evaluateOutputCommon)(e,s,a,t,i,this.serializer.coreSerializer,this.config)}}async extractQueryOutput(e,t,r,i){let n=t.map(l=>String(l)),a=t,s={string:n,native:a,mapped:{}},c={};if(!e.output)return{values:s,output:c};for(let[l,d]of Object.entries(e.output)){if(d.startsWith(u.WarpConstants.Transform.Prefix))continue;let h=(0,u.parseOutputOutIndex)(d);if(h!==null&&h!==r){c[l]=null;continue}if(d.startsWith("out.")||d==="out")if(Array.isArray(t)&&t.length>0&&typeof t[0]=="object"&&t[0]!==null){let $=d.replace(/^out\./,"");c[l]=t[0][$]}else c[l]=t[0];else c[l]=d}return{values:s,output:await(0,u.evaluateOutputCommon)(e,c,a,r,i,this.serializer.coreSerializer,this.config)}}};var N=class{constructor(e,t){this.config=e;this.chain=t;this.serializer=new y,this.output=new b(this.config,this.chain);let r=(0,g.getProviderConfig)(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new le.SuiClient({url:r.url}),this.userWallet=(0,g.getWarpWalletAddressFromConfig)(this.config,this.chain.name)}async createTransaction(e){let t=(0,g.getWarpActionByIndex)(e.warp,e.action);if(t.type==="transfer")return this.createTransferTransaction(e);if(t.type==="contract")return this.createContractCallTransaction(e);throw t.type==="query"?new Error("WarpSuiExecutor: Invalid action type for createTransaction; Use executeQuery instead"):t.type==="collect"?new Error("WarpSuiExecutor: Invalid action type for createTransaction; Use executeCollect instead"):new Error(`WarpSuiExecutor: Invalid action type (${t.type})`)}async createTransferTransaction(e){if(!this.userWallet)throw new Error("WarpSuiExecutor: createTransfer - user address not set");if(!e.destination)throw new Error("WarpSuiExecutor: Invalid destination address");if(e.value<0)throw new Error(`WarpSuiExecutor: Transfer value cannot be negative: ${e.value}`);let t=new H.Transaction,r=[];if(e.value>0){let i=await this.handleCoinTransfer(t,"0x2::sui::SUI",e.value);r.push(i)}for(let i of e.transfers){let n=await this.handleCoinTransfer(t,i.identifier,i.amount);r.push(n)}return r.length>0&&t.transferObjects(r,t.pure.address(e.destination)),t}async createContractCallTransaction(e){if(!this.userWallet)throw new Error("WarpSuiExecutor: createContractCall - user address not set");if(!e.destination)throw new Error("WarpSuiExecutor: Invalid contract address");if(e.value<0)throw new Error(`WarpSuiExecutor: Contract call value cannot be negative: ${e.value}`);let t=(0,g.getWarpActionByIndex)(e.warp,e.action);if(!t.func)throw new Error("WarpSuiExecutor: createContractCall - function not set");let r=new H.Transaction;r.setSender(this.userWallet);let i=[];e.value>0&&i.push(await this.handleCoinTransfer(r,"0x2::sui::SUI",e.value));for(let c of e.transfers)i.push(await this.handleCoinTransfer(r,c.identifier,c.amount));let{target:n,typeArguments:a}=this.parseMoveCallTarget(t),s=e.args.map(c=>this.serializer.stringToTyped(c,r));return n==="0x2::transfer::public_transfer"?i.push(...await this.buildPublicTransferArgs(r,e,s)):i.push(...s),r.moveCall({target:n,arguments:i,typeArguments:a}),r.setGasBudget(1e8),r}async executeQuery(e){if(!e.destination)throw new Error("WarpSuiExecutor: executeQuery - destination not set");let t=(0,g.getWarpActionByIndex)(e.warp,e.action);if(t.type!=="query")throw new Error(`WarpSuiExecutor: Invalid action type for executeQuery: ${t.type}`);let r=await this.client.getObject({id:e.destination,options:{showContent:!0}}),i=[r],{values:n,output:a}=await this.output.extractQueryOutput(e.warp,i,e.action,e.resolvedInputs),s=(0,g.getNextInfo)(this.config,[],e.warp,e.action,a),l=e.resolvedInputs.find(h=>h.input.position==="receiver"||h.input.position==="destination")?.value||e.destination,d=(0,g.extractResolvedInputValues)(e.resolvedInputs);return{status:"success",warp:e.warp,action:e.action,user:this.userWallet,txHash:null,tx:null,next:s,values:n,output:{...a,_DATA:r},resolvedInputs:d,messages:(0,g.applyOutputToMessages)(e.warp,a,this.config),destination:l}}async signMessage(e,t){throw new Error("Not implemented")}parseMoveCallTarget(e){if(!e.func)throw new Error("WarpSuiExecutor: Function not set");let t=`${e.address}::${e.func}`,r=e.typeArguments;if(!r&&e.func.includes("<")&&e.func.includes(">")){let i=e.func.match(/<([^>]+)>/);i&&(r=[i[1]],t=`${e.address}::${e.func.replace(/<[^>]+>/,"")}`)}return{target:t,typeArguments:r}}async buildPublicTransferArgs(e,t,r){let i=t.resolvedInputs.find(s=>String(s.input.position)==="arg:0")?.value||t.args[0],n=t.resolvedInputs.find(s=>String(s.input.position)==="arg:1")?.value||t.resolvedInputs.find(s=>s.input.type==="address"&&String(s.input.position)!=="arg:0")?.value||t.args[1],a=this.extractObjectId(i);if(!a)return r;try{if(!(await this.client.getObject({id:a,options:{showType:!0,showContent:!0}})).data?.type?.startsWith("0x2::coin::Coin<"))return r;let c=n?this.serializer.stringToTyped(n.includes(":")?n:`address:${n}`,e):r[1]||e.pure.address(this.userWallet);return[e.object(a),c]}catch{return r}}extractObjectId(e){if(!e||typeof e!="string")return null;let t=e.startsWith("object:")?e.substring(7):e;return t.startsWith("0x")?t:null}async handleCoinTransfer(e,t,r){if(t==="0x2::sui::SUI")try{return e.splitCoins(e.gas,[r.toString()])[0]}catch{}return this.createCoinTransferFromObjects(e,t,r)}async createCoinTransferFromObjects(e,t,r){let i=await this.getCoinObjectsForTransfer(t,r);if(i.length===0)throw new Error(`No coin objects found for ${t}`);let n=e.object(i[0].coinObjectId);return i.length>1&&e.mergeCoins(n,i.slice(1).map(a=>e.object(a.coinObjectId))),e.splitCoins(n,[r.toString()])[0]}async getCoinObjectsForTransfer(e,t){if(!this.userWallet)throw new Error("User wallet not set");let{data:r}=await this.client.getCoins({owner:this.userWallet,coinType:e}),i=r.map(s=>({coinObjectId:s.coinObjectId,balance:s.balance})).sort((s,c)=>BigInt(c.balance)>BigInt(s.balance)?1:-1),n=BigInt(0),a=[];for(let s of i)if(a.push(s),n+=BigInt(s.balance),n>=t)return a;throw new Error(`Insufficient ${e} balance. Required: ${t}, Available: ${n}`)}};var D=class{constructor(e,t){this.config=e;this.chain=t}getExplorers(){let e=R[this.chain.name];if(!e)return["suivision"];let t=e[this.config.env];return t||["suivision"]}getPrimaryExplorer(){return this.getExplorers()[0]}getExplorerUrlByName(e){let t=this.config.preferences?.explorers?.[this.chain.name];if(t&&!e){let n=W[t];if(n)return n}if(e){let n=W[e];if(n)return n}let r=this.getPrimaryExplorer();return W[r]||W[r]}getAccountUrl(e,t){return`${this.getExplorerUrlByName(t)}/account/${e}`}getTransactionUrl(e,t){return`${this.getExplorerUrlByName(t)}/txblock/${e}`}getBlockUrl(e,t){return`${this.getExplorerUrlByName(t)}/block/${e}`}getAssetUrl(e,t){return`${this.getExplorerUrlByName(t)}/coin/${e}`}getContractUrl(e,t){return`${this.getExplorerUrlByName(t)}/object/${e}`}getAllExplorers(){return this.getExplorers()}getExplorerByName(e){return this.getExplorers().find(r=>r.toLowerCase()===e.toLowerCase())}getAccountUrls(e){let t=this.getAllExplorers(),r={};return t.forEach(i=>{let n=W[i];n&&(r[i]=`${n}/account/${e}`)}),r}getTransactionUrls(e){let t=this.getAllExplorers(),r={};return t.forEach(i=>{let n=W[i];n&&(r[i]=`${n}/txblock/${e}`)}),r}};var de=require("@joai/warps");var O=require("@mysten/sui/keypairs/ed25519"),pe=Ce(require("@scure/bip39"),1),ue=require("@scure/bip39/wordlists/english.js"),p=require("@joai/warps"),A=class A{constructor(e,t){this.config=e;this.chain=t;this.keypair=null}async getAddress(){return(0,p.getWarpWalletAddressFromConfig)(this.config,this.chain.name)}async getPublicKey(){try{let t=this.getKeypair().getPublicKey();return Buffer.from(t.toRawBytes()).toString("hex")}catch{return null}}async signTransaction(e){if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return e;let t=this.getKeypair(),r=new TextEncoder().encode(JSON.stringify(e)),i=await t.signPersonalMessage(r);return{...e,signature:i.signature}}async signMessage(e){let t=this.getKeypair(),r=new TextEncoder().encode(e);return(await t.signPersonalMessage(r)).signature}getKeypairInstance(){return this.getKeypair()}async importFromMnemonic(e){let t=(0,p.normalizeAndValidateMnemonic)(e),i=O.Ed25519Keypair.deriveKeypair(t).getPublicKey().toSuiAddress(),n={provider:A.PROVIDER_NAME,address:i,privateKey:null,mnemonic:t};return(0,p.setWarpWalletInConfig)(this.config,this.chain.name,n),n}async importFromPrivateKey(e){let t=Buffer.from(e,"hex"),r;if(t.length===70)r=new Uint8Array(t.subarray(1,33));else if(t.length===32)r=new Uint8Array(t);else throw new Error(`Unsupported private key length: ${t.length} bytes`);let n=O.Ed25519Keypair.fromSecretKey(r).getPublicKey().toSuiAddress(),a={provider:A.PROVIDER_NAME,address:n,privateKey:e,mnemonic:null};return(0,p.setWarpWalletInConfig)(this.config,this.chain.name,a),a}async export(){let e=this.getKeypair(),t=(0,p.getWarpWalletMnemonicFromConfig)(this.config,this.chain.name),r=(0,p.getWarpWalletPrivateKeyFromConfig)(this.config,this.chain.name);return{provider:A.PROVIDER_NAME,address:e.getPublicKey().toSuiAddress(),privateKey:r||null,mnemonic:t||null}}async generate(){let e=pe.generateMnemonic(ue.wordlist,256),t=(0,p.normalizeMnemonic)(e);(0,p.validateMnemonicLength)(t);let i=O.Ed25519Keypair.deriveKeypair(t).getPublicKey().toSuiAddress();return{provider:A.PROVIDER_NAME,address:i,privateKey:null,mnemonic:t}}async delete(e){(0,p.removeWarpWalletFromConfig)(this.config,this.chain.name)}getKeypair(){if(this.keypair)return this.keypair;let e=(0,p.getWarpWalletMnemonicFromConfig)(this.config,this.chain.name);if(!e)throw new Error("No mnemonic provided");return this.keypair=O.Ed25519Keypair.deriveKeypair(e.trim()),this.keypair}};A.PROVIDER_NAME="mnemonic";var T=A;var w=require("@joai/warps"),S=class{constructor(e,t){this.config=e;this.chain=t}async getAddress(){return(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name)}async getPublicKey(){return null}async signTransaction(e){let t=await this.getAddress();throw new Error(`Wallet can not be used for signing: ${t}`)}async signMessage(e){let t=await this.getAddress();throw new Error(`Wallet can not be used for signing: ${t}`)}async importFromMnemonic(e){let t=(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${t}`)}async importFromPrivateKey(e){let t=(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${t}`)}async export(){let e=(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${e}`)}async generate(){let e=(0,w.getWarpWalletAddressFromConfig)(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${e}`)}async delete(e){(0,w.removeWarpWalletFromConfig)(this.config,this.chain.name)}};var I=require("@mysten/sui/keypairs/ed25519"),m=require("@joai/warps"),P=class P{constructor(e,t){this.config=e;this.chain=t;this.keypair=null}async getAddress(){return(0,m.getWarpWalletAddressFromConfig)(this.config,this.chain.name)}async getPublicKey(){try{let t=this.getKeypair().getPublicKey();return Buffer.from(t.toRawBytes()).toString("hex")}catch{return null}}async signTransaction(e){if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return e;let t=this.getKeypair(),r=new TextEncoder().encode(JSON.stringify(e)),i=await t.signPersonalMessage(r);return{...e,signature:i.signature}}async signMessage(e){let t=this.getKeypair(),r=new TextEncoder().encode(e);return(await t.signPersonalMessage(r)).signature}getKeypairInstance(){return this.getKeypair()}async importFromMnemonic(e){let t=I.Ed25519Keypair.deriveKeypair(e.trim()),r=t.getPublicKey().toSuiAddress(),i=Buffer.from(t.getSecretKey()).toString("hex"),n={provider:P.PROVIDER_NAME,address:r,privateKey:i,mnemonic:e};return(0,m.setWarpWalletInConfig)(this.config,this.chain.name,n),n}async importFromPrivateKey(e){let t=Buffer.from(e,"hex"),r;if(t.length===70)r=new Uint8Array(t.subarray(1,33));else if(t.length===32)r=new Uint8Array(t);else throw new Error(`Unsupported private key length: ${t.length} bytes`);let n=I.Ed25519Keypair.fromSecretKey(r).getPublicKey().toSuiAddress(),a={provider:P.PROVIDER_NAME,address:n,privateKey:e,mnemonic:null};return(0,m.setWarpWalletInConfig)(this.config,this.chain.name,a),a}async export(){let e=this.getKeypair(),t=(0,m.getWarpWalletPrivateKeyFromConfig)(this.config,this.chain.name),r=(0,m.getWarpWalletMnemonicFromConfig)(this.config,this.chain.name);return{provider:P.PROVIDER_NAME,address:e.getPublicKey().toSuiAddress(),privateKey:t||null,mnemonic:r||null}}async generate(){let e=I.Ed25519Keypair.generate(),t=e.getPublicKey().toSuiAddress(),r=Buffer.from(e.getSecretKey()).toString("hex");return{provider:P.PROVIDER_NAME,address:t,privateKey:r,mnemonic:null}}async delete(e){(0,m.removeWarpWalletFromConfig)(this.config,this.chain.name)}getKeypair(){if(this.keypair)return this.keypair;let e=(0,m.getWarpWalletPrivateKeyFromConfig)(this.config,this.chain.name);if(!e)throw new Error("Wallet not initialized - no private key provided");try{let t=Buffer.from(e,"hex");if(t.length===70){let r=new Uint8Array(t.subarray(1,33));return this.keypair=I.Ed25519Keypair.fromSecretKey(r),this.keypair}else{if(t.length===32)return this.keypair=I.Ed25519Keypair.fromSecretKey(new Uint8Array(t)),this.keypair;throw new Error(`Unsupported private key length: ${t.length} bytes`)}}catch(t){throw t}}};P.PROVIDER_NAME="privateKey";var x=P;var z=class{constructor(e,t){this.config=e;this.chain=t;this.cachedAddress=null;this.cachedPublicKey=null;this.client=M(e,t),this.walletProvider=this.createProvider(),this.isInitializedPromise=new Promise(r=>{this.isInitializedResolve=r}),this.initializeCache()}async waitUntilInitialized(){await this.isInitializedPromise}async signTransaction(e){if(await this.waitUntilInitialized(),!e||typeof e!="object")throw new Error("Invalid transaction object");if(!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof S)throw new Error(`Wallet (${this.chain.name}) is read-only`);return(this.walletProvider instanceof x||this.walletProvider instanceof T)&&e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function"?e:await this.walletProvider.signTransaction(e)}async signMessage(e){if(await this.waitUntilInitialized(),!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof S)throw new Error(`Wallet (${this.chain.name}) is read-only`);return await this.walletProvider.signMessage(e)}async signTransactions(e){return await this.waitUntilInitialized(),e}async sendTransaction(e){if(await this.waitUntilInitialized(),!e||typeof e!="object")throw new Error("Invalid transaction object");if(e.transactionHash)return e.transactionHash;if(e&&typeof e=="object"&&"bytes"in e&&"signature"in e)return(await this.client.executeTransactionBlock({transactionBlock:e.bytes,signature:Array.isArray(e.signature)?e.signature:[e.signature],options:{showEffects:!0,showEvents:!0}})).digest;if(!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof x||this.walletProvider instanceof T){let t=this.walletProvider.getKeypairInstance();if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return(await this.client.signAndExecuteTransaction({transaction:e,signer:t,options:{showEffects:!0,showEvents:!0}})).digest;throw new Error(`Transaction must be a Transaction object or have bytes and signature. Got: ${typeof e}, has sign: ${e&&typeof e=="object"&&"sign"in e}, has bytes: ${e&&typeof e=="object"&&"bytes"in e}, has signature: ${e&&typeof e=="object"&&"signature"in e}`)}throw new Error("Remote wallet provider must return signed payload (bytes + signature) or transactionHash for Sui transactions")}async sendTransactions(e){return await this.waitUntilInitialized(),Promise.all(e.map(async t=>this.sendTransaction(t)))}async importFromMnemonic(e){return await this.waitUntilInitialized(),await this.createProviderForOperation("mnemonic").importFromMnemonic(e)}async importFromPrivateKey(e){return await this.waitUntilInitialized(),await this.createProviderForOperation("privateKey").importFromPrivateKey(e)}async export(e){return await this.waitUntilInitialized(),await this.createProviderForOperation(e).export()}async generate(e){return await this.waitUntilInitialized(),await this.createProviderForOperation(e).generate()}async delete(e,t){await this.waitUntilInitialized(),await this.createProviderForOperation(e).delete(t)}getAddress(){return this.cachedAddress}getPublicKey(){return this.cachedPublicKey}createProvider(){let e=this.config.user?.wallets?.[this.chain.name];return e?typeof e=="string"?new S(this.config,this.chain):e.provider?this.createProviderForOperation(e.provider):new S(this.config,this.chain):null}async initializeCache(){let e=await(0,de.initializeWalletCache)(this.walletProvider);this.cachedAddress=e.address,this.cachedPublicKey=e.publicKey,this.isInitializedResolve()}createProviderForOperation(e){let r=this.config.walletProviders?.[this.chain.name]?.[e];if(r){let i=r(this.config,this.chain);if(!i)throw new Error(`Custom wallet provider factory returned null for ${e}`);return i}if(e==="privateKey")return new x(this.config,this.chain);if(e==="mnemonic")return new T(this.config,this.chain);throw new Error(`Unsupported wallet provider for ${this.chain.name}: ${e}`)}};var j={chain:U.WarpChainName.Sui,identifier:"0x2::sui::SUI",name:"SUI",symbol:"SUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/26375/standard/sui-ocean-square.png?1727791290"};function Se(o,e){return(t,r)=>{if(!r)throw new Error(`${o} adapter requires a fallback adapter`);let i=e[t.env];if(!i)throw new Error(`SuiAdapter: chain info not found for chain ${o}`);return{chainInfo:i,builder:()=>new B(t,i),executor:new N(t,i),output:new b(t,i),serializer:new y,registry:r.registry,explorer:new D(t,i),abiBuilder:()=>new C(t,i),brandBuilder:()=>new K(t,i),dataLoader:new k(t,i),wallet:new z(t,i)}}}var Pe=Se(U.WarpChainName.Sui,{mainnet:{name:U.WarpChainName.Sui,displayName:"Sui",chainId:"1",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.mainnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:j},testnet:{name:U.WarpChainName.Sui,displayName:"Sui Testnet",chainId:"testnet",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.testnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:j},devnet:{name:U.WarpChainName.Sui,displayName:"Sui Devnet",chainId:"devnet",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.devnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:j}});var _=class{constructor(e,t){this.abi=new C(e,t)}async loadModuleAbi(e,t){return this.abi.getModuleAbi(e,t)}async loadFunctionAbi(e,t,r){return this.abi.getFunctionAbi(e,t,r)}};0&&(module.exports={ExplorerUrls,KnownTokens,NativeTokenSui,SuiAdapter,SuiExplorers,SuiExplorersConfig,WarpSuiAbiBuilder,WarpSuiBrandBuilder,WarpSuiBuilder,WarpSuiConstants,WarpSuiContractLoader,WarpSuiDataLoader,WarpSuiExecutor,WarpSuiExplorer,WarpSuiOutput,WarpSuiSerializer,WarpSuiWallet,findKnownTokenById,getConfiguredSuiClient});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var Fe={Sui:{Identifier:"SUI",DisplayName:"Sui",Decimals:9}},L=(a=>(a.SuiVision="suivision",a.SuiVisionTestnet="suivision_testnet",a.SuiVisionDevnet="suivision_devnet",a.SuiScan="suiscan",a.SuiScanTestnet="suiscan_testnet",a.SuiScanDevnet="suiscan_devnet",a))(L||{}),N={sui:{mainnet:["suivision","suiscan"],testnet:["suivision_testnet","suiscan_testnet"],devnet:["suivision_devnet","suiscan_devnet"]}},g={suivision:"https://suivision.xyz",suivision_testnet:"https://testnet.suivision.xyz",suivision_devnet:"https://devnet.suivision.xyz",suiscan:"https://suiscan.xyz",suiscan_testnet:"https://testnet.suiscan.xyz",suiscan_devnet:"https://devnet.suiscan.xyz"};import{SuiClient as J}from"@mysten/sui/client";import{getProviderConfig as q}from"@joai/warps";var D=(c,e)=>{let r=q(c,e.name,c.env,e.defaultApiUrl);return new J({url:r.url})};import{WarpChainName as A}from"@joai/warps";import{SuiClient as X}from"@mysten/sui/client";import{getProviderConfig as Y}from"@joai/warps";var W=class{constructor(e,r){this.config=e;this.chain=r;let t=Y(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new X({url:t.url})}async createInscriptionTransaction(e){throw new Error("WarpSuiAbiBuilder: createInscriptionTransaction not implemented")}async createFromRaw(e){return JSON.parse(e)}async createFromTransaction(e){return this.createFromRaw(e.data||"{}")}async createFromTransactionHash(e,r){try{let t=await this.client.getTransactionBlock({digest:e});return t?this.createFromTransaction(t):null}catch{return null}}async getModuleAbi(e,r){return this.client.getNormalizedMoveModule({package:e,module:r})}async getFunctionAbi(e,r,t){return this.client.getNormalizedMoveFunction({package:e,module:r,function:t})}};import{SuiClient as Z}from"@mysten/sui/client";import{Transaction as ee}from"@mysten/sui/transactions";import{getProviderConfig as re}from"@joai/warps";var E=class{constructor(e,r){this.config=e;this.chain=r;let t=re(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new Z({url:t.url})}createInscriptionTransaction(e){return new ee}async createFromRaw(e){return JSON.parse(e)}async createFromTransaction(e,r){return this.createFromRaw(e.data||"{}")}async createFromTransactionHash(e,r){try{let t=await this.client.getTransactionBlock({digest:e});return t?this.createFromTransaction(t,!1):null}catch{return null}}};import{SuiClient as te}from"@mysten/sui/client";import{getProviderConfig as ie,WarpBuilder as ne,WarpCache as ae}from"@joai/warps";var P=class extends ne{constructor(r,t){super(r);this.config=r;this.chain=t;this.cache=new ae(r.env,r.cache);let i=ie(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new te({url:i.url})}async createInscriptionTransaction(r){throw new Error("WarpSuiBuilder: on-chain inscription is not supported for Sui")}async createFromTransaction(r){return this.createFromRaw(r)}async createFromTransactionHash(r,t){return null}};import{SuiClient as ce}from"@mysten/sui/client";import{CacheTtl as le,getProviderConfig as pe,WarpCache as ue,WarpCacheKey as de}from"@joai/warps";import{WarpChainName as se}from"@joai/warps";var d=se.Sui,oe=[{chain:d,identifier:"0x2::sui::SUI",name:"Sui",symbol:"SUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/26375/small/sui-logo.png"},{chain:d,identifier:"0xa198f3be41cda8c07c3bf1c4e0bb88b8e9827b7c063f36b1e6c3d6da1c4e8753::usdc::USDC",name:"USD Coin",symbol:"USDC",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"},{chain:d,identifier:"0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48ace0cdd97::usdt::USDT",name:"Tether USD",symbol:"USDT",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/325/small/Tether.png"},{chain:d,identifier:"0xaf8cd5edc19c4512f4259f0bee101a7c94d8a5c0e7c90c7a7c8c8c8c8c8c8c8c8::wbtc::WBTC",name:"Wrapped Bitcoin",symbol:"WBTC",decimals:8,logoUrl:"https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png"},{chain:d,identifier:"0xb8a6a9b7c7a6f4a3e2d1c0b9a8f7e6d5c4b3a2b1c0d9e8f7a6b5c4d3e2f1a0b::weth::WETH",name:"Wrapped Ether",symbol:"WETH",decimals:8,logoUrl:"https://assets.coingecko.com/coins/images/2518/small/weth.png"},{chain:d,identifier:"0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a15e0e9::ocean::OCEAN",name:"Ocean Protocol",symbol:"OCEAN",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/3687/small/ocean-protocol-logo.png"},{chain:d,identifier:"0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c35569693fd50fb8b7::deep::DEEP",name:"DeepBook",symbol:"DEEP",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/30169/small/deepbook.png"},{chain:d,identifier:"0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47ba3::hasui::HASUI",name:"Haedal Staked SUI",symbol:"HASUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/30027/small/haSUI.png"},{chain:d,identifier:"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e935::usdc::USDC",name:"USD Coin (Wormhole)",symbol:"USDC",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"}],O=c=>oe.find(e=>e.identifier===c)||null;var T=class{constructor(e,r){this.config=e;this.chain=r;let t=pe(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new ce({url:t.url}),this.cache=new ue(e.env,e.cache)}async getAccount(e){let r=await this.client.getBalance({owner:e,coinType:"0x2::sui::SUI"});return{chain:this.chain.name,address:e,balance:BigInt(r.totalBalance)}}async getAccountAssets(e){let r=await this.client.getAllBalances({owner:e});console.log("WarpSuiDataLoader.getAccountAssets",r);let t=r.find(a=>a.coinType==="0x2::sui::SUI"),i=r.filter(a=>a.coinType!=="0x2::sui::SUI"&&BigInt(a.totalBalance)>0n),n=[];if(t&&BigInt(t.totalBalance)>0n&&n.push({...this.chain.nativeToken,amount:BigInt(t.totalBalance)}),i.length>0){let a=await Promise.all(i.map(s=>this.getAsset(s.coinType)));n.push(...a.filter(s=>s!==null).map(s=>({...s,amount:BigInt(i.find(o=>o.coinType===s.identifier)?.totalBalance||0)})))}return n}async getAsset(e){let r=de.Asset(this.config.env,this.chain.name,e),t=await this.cache.get(r);if(t)return t;let i=O(e);if(i)return{chain:this.chain.name,identifier:e,name:i.name,symbol:i.symbol,amount:0n,decimals:i.decimals,logoUrl:i.logoUrl};try{let n=await this.client.getCoinMetadata({coinType:e}),a={chain:this.chain.name,identifier:e,name:n?.name||e.split("::").pop()||e,symbol:n?.symbol||e.split("::").pop()||e,amount:0n,decimals:n?.decimals||9,logoUrl:n?.iconUrl||""};return await this.cache.set(r,a,le.OneHour),a}catch{return null}}async getAction(e,r=!1){return null}async getAccountActions(e,r){return[]}};import{SuiClient as we}from"@mysten/sui/client";import{Transaction as R}from"@mysten/sui/transactions";import{applyOutputToMessages as Ce,extractResolvedInputValues as be,getNextInfo as Se,getProviderConfig as Ae,getWarpActionByIndex as B,getWarpWalletAddressFromConfig as Ee}from"@joai/warps";import{SuiClient as me}from"@mysten/sui/client";import{applyOutputToMessages as fe,evaluateOutputCommon as $,getNextInfo as ye,getProviderConfig as We,getWarpWalletAddressFromConfig as ve,parseOutputOutIndex as z,WarpConstants as F}from"@joai/warps";import{Transaction as he}from"@mysten/sui/transactions";import{WarpSerializer as ge}from"@joai/warps";var h=class{constructor(){this.coreSerializer=new ge}typedToString(e){if(e==null)return"option:null";if(typeof e=="string")return`string:${e}`;if(typeof e=="boolean")return`bool:${e}`;if(typeof e=="number")return`uint64:${e.toString()}`;if(typeof e=="bigint")return`uint64:${e.toString()}`;if(e&&typeof e=="object"&&e.address)return`address:${e.address}`;if(Array.isArray(e)){if(e.length===0)return"vector:u8:";let r=this.typeToString(typeof e[0]),t=e.map(i=>this.typedToString(i).split(":")[1]);return`vector:${r}:${t.join(",")}`}if(e&&typeof e=="object"&&e.type&&e.value&&e.type==="option")return e.value===null||e.value===void 0?"option:null":`option:${this.typedToString(e.value)}`;throw new Error(`WarpSuiSerializer (typedToString): Unsupported input type: ${typeof e}`)}typedToNative(e){let r=this.typedToString(e);return this.coreSerializer.stringToNative(r)}nativeToTyped(e,r){let t=this.coreSerializer.nativeToString(e,r);return this.stringToTyped(t)}stringToTyped(e,r){let t=r||new he,[i,n]=e.split(/:(.*)/,2);if(i==="object")return t.object(n);if(i==="string")return t.pure.string(n);if(i==="bool")return t.pure.bool(n==="true");if(i==="u8")return t.pure.u8(Number(n));if(i==="u16")return t.pure.u16(Number(n));if(i==="u32")return t.pure.u32(Number(n));if(i==="u64"||i==="uint64")return t.pure.u64(BigInt(n));if(i==="u128")return t.pure.u128(BigInt(n));if(i==="u256")return t.pure.u256(BigInt(n));if(i==="address")return t.pure.address(n);throw new Error(`WarpSuiSerializer (stringToTyped): Unsupported type: ${i}`)}typeToString(e){if(e==="string")return"string";if(e==="bool")return"bool";if(e==="u8")return"u8";if(e==="u16")return"u16";if(e==="u32")return"u32";if(e==="u64"||e==="bigint"||e==="number")return"u64";if(e==="u128")return"u128";if(e==="u256")return"u256";if(e==="address")return"address";if(e==="vector")return"vector";if(e==="option")return"option";throw new Error(`WarpSuiSerializer (typeToString): Unsupported input type: ${e}`)}nativeToType(e){throw new Error("Not implemented")}};var v=class{constructor(e,r){this.config=e;this.chain=r;this.serializer=new h;let t=We(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new me({url:t.url})}async getActionExecution(e,r,t){let i=await this.extractContractOutput(e,r,t,[]),n=ye(this.config,[],e,r,i.output),a=fe(e,i.output,this.config);return{status:t.effects?.status?.status==="success"?"success":"error",warp:e,action:r,user:ve(this.config,this.chain.name),txHash:t.digest,tx:t,next:n,values:i.values,output:i.output,messages:a,destination:null,resolvedInputs:[]}}async extractContractOutput(e,r,t,i){let n=[],a=[],s={};if(!e.output)return{values:{string:n,native:a,mapped:{}},output:s};for(let[o,l]of Object.entries(e.output)){if(l.startsWith(F.Transform.Prefix))continue;if(l.startsWith("input.")){s[o]=l;continue}let p=z(l);if(p!==null&&p!==r){s[o]=null;continue}if(l.startsWith("out.")){let u=t.returnValues?t.returnValues[o]:null;s[o]=u,n.push(String(u)),a.push(u)}else s[o]=l}return{values:{string:n,native:a,mapped:{}},output:await $(e,s,a,r,i,this.serializer.coreSerializer,this.config)}}async extractQueryOutput(e,r,t,i){let n=r.map(l=>String(l)),a=r,s={string:n,native:a,mapped:{}},o={};if(!e.output)return{values:s,output:o};for(let[l,p]of Object.entries(e.output)){if(p.startsWith(F.Transform.Prefix))continue;let u=z(p);if(u!==null&&u!==t){o[l]=null;continue}if(p.startsWith("out.")||p==="out")if(Array.isArray(r)&&r.length>0&&typeof r[0]=="object"&&r[0]!==null){let Q=p.replace(/^out\./,"");o[l]=r[0][Q]}else o[l]=r[0];else o[l]=p}return{values:s,output:await $(e,o,a,t,i,this.serializer.coreSerializer,this.config)}}};var I=class{constructor(e,r){this.config=e;this.chain=r;this.serializer=new h,this.output=new v(this.config,this.chain);let t=Ae(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new we({url:t.url}),this.userWallet=Ee(this.config,this.chain.name)}async createTransaction(e){let r=B(e.warp,e.action);if(r.type==="transfer")return this.createTransferTransaction(e);if(r.type==="contract")return this.createContractCallTransaction(e);throw r.type==="query"?new Error("WarpSuiExecutor: Invalid action type for createTransaction; Use executeQuery instead"):r.type==="collect"?new Error("WarpSuiExecutor: Invalid action type for createTransaction; Use executeCollect instead"):new Error(`WarpSuiExecutor: Invalid action type (${r.type})`)}async createTransferTransaction(e){if(!this.userWallet)throw new Error("WarpSuiExecutor: createTransfer - user address not set");if(!e.destination)throw new Error("WarpSuiExecutor: Invalid destination address");if(e.value<0)throw new Error(`WarpSuiExecutor: Transfer value cannot be negative: ${e.value}`);let r=new R,t=[];if(e.value>0){let i=await this.handleCoinTransfer(r,"0x2::sui::SUI",e.value);t.push(i)}for(let i of e.transfers){let n=await this.handleCoinTransfer(r,i.identifier,i.amount);t.push(n)}return t.length>0&&r.transferObjects(t,r.pure.address(e.destination)),r}async createContractCallTransaction(e){if(!this.userWallet)throw new Error("WarpSuiExecutor: createContractCall - user address not set");if(!e.destination)throw new Error("WarpSuiExecutor: Invalid contract address");if(e.value<0)throw new Error(`WarpSuiExecutor: Contract call value cannot be negative: ${e.value}`);let r=B(e.warp,e.action);if(!r.func)throw new Error("WarpSuiExecutor: createContractCall - function not set");let t=new R;t.setSender(this.userWallet);let i=[];e.value>0&&i.push(await this.handleCoinTransfer(t,"0x2::sui::SUI",e.value));for(let o of e.transfers)i.push(await this.handleCoinTransfer(t,o.identifier,o.amount));let{target:n,typeArguments:a}=this.parseMoveCallTarget(r),s=e.args.map(o=>this.serializer.stringToTyped(o,t));return n==="0x2::transfer::public_transfer"?i.push(...await this.buildPublicTransferArgs(t,e,s)):i.push(...s),t.moveCall({target:n,arguments:i,typeArguments:a}),t.setGasBudget(1e8),t}async executeQuery(e){if(!e.destination)throw new Error("WarpSuiExecutor: executeQuery - destination not set");let r=B(e.warp,e.action);if(r.type!=="query")throw new Error(`WarpSuiExecutor: Invalid action type for executeQuery: ${r.type}`);let t=await this.client.getObject({id:e.destination,options:{showContent:!0}}),i=[t],{values:n,output:a}=await this.output.extractQueryOutput(e.warp,i,e.action,e.resolvedInputs),s=Se(this.config,[],e.warp,e.action,a),l=e.resolvedInputs.find(u=>u.input.position==="receiver"||u.input.position==="destination")?.value||e.destination,p=be(e.resolvedInputs);return{status:"success",warp:e.warp,action:e.action,user:this.userWallet,txHash:null,tx:null,next:s,values:n,output:{...a,_DATA:t},resolvedInputs:p,messages:Ce(e.warp,a,this.config),destination:l}}async signMessage(e,r){throw new Error("Not implemented")}parseMoveCallTarget(e){if(!e.func)throw new Error("WarpSuiExecutor: Function not set");let r=`${e.address}::${e.func}`,t=e.typeArguments;if(!t&&e.func.includes("<")&&e.func.includes(">")){let i=e.func.match(/<([^>]+)>/);i&&(t=[i[1]],r=`${e.address}::${e.func.replace(/<[^>]+>/,"")}`)}return{target:r,typeArguments:t}}async buildPublicTransferArgs(e,r,t){let i=r.resolvedInputs.find(s=>String(s.input.position)==="arg:0")?.value||r.args[0],n=r.resolvedInputs.find(s=>String(s.input.position)==="arg:1")?.value||r.resolvedInputs.find(s=>s.input.type==="address"&&String(s.input.position)!=="arg:0")?.value||r.args[1],a=this.extractObjectId(i);if(!a)return t;try{if(!(await this.client.getObject({id:a,options:{showType:!0,showContent:!0}})).data?.type?.startsWith("0x2::coin::Coin<"))return t;let o=n?this.serializer.stringToTyped(n.includes(":")?n:`address:${n}`,e):t[1]||e.pure.address(this.userWallet);return[e.object(a),o]}catch{return t}}extractObjectId(e){if(!e||typeof e!="string")return null;let r=e.startsWith("object:")?e.substring(7):e;return r.startsWith("0x")?r:null}async handleCoinTransfer(e,r,t){if(r==="0x2::sui::SUI")try{return e.splitCoins(e.gas,[t.toString()])[0]}catch{}return this.createCoinTransferFromObjects(e,r,t)}async createCoinTransferFromObjects(e,r,t){let i=await this.getCoinObjectsForTransfer(r,t);if(i.length===0)throw new Error(`No coin objects found for ${r}`);let n=e.object(i[0].coinObjectId);return i.length>1&&e.mergeCoins(n,i.slice(1).map(a=>e.object(a.coinObjectId))),e.splitCoins(n,[t.toString()])[0]}async getCoinObjectsForTransfer(e,r){if(!this.userWallet)throw new Error("User wallet not set");let{data:t}=await this.client.getCoins({owner:this.userWallet,coinType:e}),i=t.map(s=>({coinObjectId:s.coinObjectId,balance:s.balance})).sort((s,o)=>BigInt(o.balance)>BigInt(s.balance)?1:-1),n=BigInt(0),a=[];for(let s of i)if(a.push(s),n+=BigInt(s.balance),n>=r)return a;throw new Error(`Insufficient ${e} balance. Required: ${r}, Available: ${n}`)}};var x=class{constructor(e,r){this.config=e;this.chain=r}getExplorers(){let e=N[this.chain.name];if(!e)return["suivision"];let r=e[this.config.env];return r||["suivision"]}getPrimaryExplorer(){return this.getExplorers()[0]}getExplorerUrlByName(e){let r=this.config.preferences?.explorers?.[this.chain.name];if(r&&!e){let n=g[r];if(n)return n}if(e){let n=g[e];if(n)return n}let t=this.getPrimaryExplorer();return g[t]||g[t]}getAccountUrl(e,r){return`${this.getExplorerUrlByName(r)}/account/${e}`}getTransactionUrl(e,r){return`${this.getExplorerUrlByName(r)}/txblock/${e}`}getBlockUrl(e,r){return`${this.getExplorerUrlByName(r)}/block/${e}`}getAssetUrl(e,r){return`${this.getExplorerUrlByName(r)}/coin/${e}`}getContractUrl(e,r){return`${this.getExplorerUrlByName(r)}/object/${e}`}getAllExplorers(){return this.getExplorers()}getExplorerByName(e){return this.getExplorers().find(t=>t.toLowerCase()===e.toLowerCase())}getAccountUrls(e){let r=this.getAllExplorers(),t={};return r.forEach(i=>{let n=g[i];n&&(t[i]=`${n}/account/${e}`)}),t}getTransactionUrls(e){let r=this.getAllExplorers(),t={};return r.forEach(i=>{let n=g[i];n&&(t[i]=`${n}/txblock/${e}`)}),t}};import{initializeWalletCache as $e}from"@joai/warps";import{Ed25519Keypair as U}from"@mysten/sui/keypairs/ed25519";import*as V from"@scure/bip39";import{wordlist as Pe}from"@scure/bip39/wordlists/english.js";import{getWarpWalletAddressFromConfig as Te,getWarpWalletMnemonicFromConfig as j,getWarpWalletPrivateKeyFromConfig as Ie,normalizeAndValidateMnemonic as xe,normalizeMnemonic as Ue,removeWarpWalletFromConfig as Ke,setWarpWalletInConfig as M,validateMnemonicLength as Be}from"@joai/warps";var m=class m{constructor(e,r){this.config=e;this.chain=r;this.keypair=null}async getAddress(){return Te(this.config,this.chain.name)}async getPublicKey(){try{let r=this.getKeypair().getPublicKey();return Buffer.from(r.toRawBytes()).toString("hex")}catch{return null}}async signTransaction(e){if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return e;let r=this.getKeypair(),t=new TextEncoder().encode(JSON.stringify(e)),i=await r.signPersonalMessage(t);return{...e,signature:i.signature}}async signMessage(e){let r=this.getKeypair(),t=new TextEncoder().encode(e);return(await r.signPersonalMessage(t)).signature}getKeypairInstance(){return this.getKeypair()}async importFromMnemonic(e){let r=xe(e),i=U.deriveKeypair(r).getPublicKey().toSuiAddress(),n={provider:m.PROVIDER_NAME,address:i,privateKey:null,mnemonic:r};return M(this.config,this.chain.name,n),n}async importFromPrivateKey(e){let r=Buffer.from(e,"hex"),t;if(r.length===70)t=new Uint8Array(r.subarray(1,33));else if(r.length===32)t=new Uint8Array(r);else throw new Error(`Unsupported private key length: ${r.length} bytes`);let n=U.fromSecretKey(t).getPublicKey().toSuiAddress(),a={provider:m.PROVIDER_NAME,address:n,privateKey:e,mnemonic:null};return M(this.config,this.chain.name,a),a}async export(){let e=this.getKeypair(),r=j(this.config,this.chain.name),t=Ie(this.config,this.chain.name);return{provider:m.PROVIDER_NAME,address:e.getPublicKey().toSuiAddress(),privateKey:t||null,mnemonic:r||null}}async generate(){let e=V.generateMnemonic(Pe,256),r=Ue(e);Be(r);let i=U.deriveKeypair(r).getPublicKey().toSuiAddress();return{provider:m.PROVIDER_NAME,address:i,privateKey:null,mnemonic:r}}async delete(e){Ke(this.config,this.chain.name)}getKeypair(){if(this.keypair)return this.keypair;let e=j(this.config,this.chain.name);if(!e)throw new Error("No mnemonic provided");return this.keypair=U.deriveKeypair(e.trim()),this.keypair}};m.PROVIDER_NAME="mnemonic";var w=m;import{getWarpWalletAddressFromConfig as b,removeWarpWalletFromConfig as ke}from"@joai/warps";var f=class{constructor(e,r){this.config=e;this.chain=r}async getAddress(){return b(this.config,this.chain.name)}async getPublicKey(){return null}async signTransaction(e){let r=await this.getAddress();throw new Error(`Wallet can not be used for signing: ${r}`)}async signMessage(e){let r=await this.getAddress();throw new Error(`Wallet can not be used for signing: ${r}`)}async importFromMnemonic(e){let r=b(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${r}`)}async importFromPrivateKey(e){let r=b(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${r}`)}async export(){let e=b(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${e}`)}async generate(){let e=b(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${e}`)}async delete(e){ke(this.config,this.chain.name)}};import{Ed25519Keypair as S}from"@mysten/sui/keypairs/ed25519";import{getWarpWalletAddressFromConfig as Ne,getWarpWalletMnemonicFromConfig as De,getWarpWalletPrivateKeyFromConfig as H,removeWarpWalletFromConfig as Oe,setWarpWalletInConfig as G}from"@joai/warps";var y=class y{constructor(e,r){this.config=e;this.chain=r;this.keypair=null}async getAddress(){return Ne(this.config,this.chain.name)}async getPublicKey(){try{let r=this.getKeypair().getPublicKey();return Buffer.from(r.toRawBytes()).toString("hex")}catch{return null}}async signTransaction(e){if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return e;let r=this.getKeypair(),t=new TextEncoder().encode(JSON.stringify(e)),i=await r.signPersonalMessage(t);return{...e,signature:i.signature}}async signMessage(e){let r=this.getKeypair(),t=new TextEncoder().encode(e);return(await r.signPersonalMessage(t)).signature}getKeypairInstance(){return this.getKeypair()}async importFromMnemonic(e){let r=S.deriveKeypair(e.trim()),t=r.getPublicKey().toSuiAddress(),i=Buffer.from(r.getSecretKey()).toString("hex"),n={provider:y.PROVIDER_NAME,address:t,privateKey:i,mnemonic:e};return G(this.config,this.chain.name,n),n}async importFromPrivateKey(e){let r=Buffer.from(e,"hex"),t;if(r.length===70)t=new Uint8Array(r.subarray(1,33));else if(r.length===32)t=new Uint8Array(r);else throw new Error(`Unsupported private key length: ${r.length} bytes`);let n=S.fromSecretKey(t).getPublicKey().toSuiAddress(),a={provider:y.PROVIDER_NAME,address:n,privateKey:e,mnemonic:null};return G(this.config,this.chain.name,a),a}async export(){let e=this.getKeypair(),r=H(this.config,this.chain.name),t=De(this.config,this.chain.name);return{provider:y.PROVIDER_NAME,address:e.getPublicKey().toSuiAddress(),privateKey:r||null,mnemonic:t||null}}async generate(){let e=S.generate(),r=e.getPublicKey().toSuiAddress(),t=Buffer.from(e.getSecretKey()).toString("hex");return{provider:y.PROVIDER_NAME,address:r,privateKey:t,mnemonic:null}}async delete(e){Oe(this.config,this.chain.name)}getKeypair(){if(this.keypair)return this.keypair;let e=H(this.config,this.chain.name);if(!e)throw new Error("Wallet not initialized - no private key provided");try{let r=Buffer.from(e,"hex");if(r.length===70){let t=new Uint8Array(r.subarray(1,33));return this.keypair=S.fromSecretKey(t),this.keypair}else{if(r.length===32)return this.keypair=S.fromSecretKey(new Uint8Array(r)),this.keypair;throw new Error(`Unsupported private key length: ${r.length} bytes`)}}catch(r){throw r}}};y.PROVIDER_NAME="privateKey";var C=y;var K=class{constructor(e,r){this.config=e;this.chain=r;this.cachedAddress=null;this.cachedPublicKey=null;this.client=D(e,r),this.walletProvider=this.createProvider(),this.isInitializedPromise=new Promise(t=>{this.isInitializedResolve=t}),this.initializeCache()}async waitUntilInitialized(){await this.isInitializedPromise}async signTransaction(e){if(await this.waitUntilInitialized(),!e||typeof e!="object")throw new Error("Invalid transaction object");if(!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof f)throw new Error(`Wallet (${this.chain.name}) is read-only`);return(this.walletProvider instanceof C||this.walletProvider instanceof w)&&e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function"?e:await this.walletProvider.signTransaction(e)}async signMessage(e){if(await this.waitUntilInitialized(),!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof f)throw new Error(`Wallet (${this.chain.name}) is read-only`);return await this.walletProvider.signMessage(e)}async signTransactions(e){return await this.waitUntilInitialized(),e}async sendTransaction(e){if(await this.waitUntilInitialized(),!e||typeof e!="object")throw new Error("Invalid transaction object");if(e.transactionHash)return e.transactionHash;if(e&&typeof e=="object"&&"bytes"in e&&"signature"in e)return(await this.client.executeTransactionBlock({transactionBlock:e.bytes,signature:Array.isArray(e.signature)?e.signature:[e.signature],options:{showEffects:!0,showEvents:!0}})).digest;if(!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof C||this.walletProvider instanceof w){let r=this.walletProvider.getKeypairInstance();if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return(await this.client.signAndExecuteTransaction({transaction:e,signer:r,options:{showEffects:!0,showEvents:!0}})).digest;throw new Error(`Transaction must be a Transaction object or have bytes and signature. Got: ${typeof e}, has sign: ${e&&typeof e=="object"&&"sign"in e}, has bytes: ${e&&typeof e=="object"&&"bytes"in e}, has signature: ${e&&typeof e=="object"&&"signature"in e}`)}throw new Error("Remote wallet provider must return signed payload (bytes + signature) or transactionHash for Sui transactions")}async sendTransactions(e){return await this.waitUntilInitialized(),Promise.all(e.map(async r=>this.sendTransaction(r)))}async importFromMnemonic(e){return await this.waitUntilInitialized(),await this.createProviderForOperation("mnemonic").importFromMnemonic(e)}async importFromPrivateKey(e){return await this.waitUntilInitialized(),await this.createProviderForOperation("privateKey").importFromPrivateKey(e)}async export(e){return await this.waitUntilInitialized(),await this.createProviderForOperation(e).export()}async generate(e){return await this.waitUntilInitialized(),await this.createProviderForOperation(e).generate()}async delete(e,r){await this.waitUntilInitialized(),await this.createProviderForOperation(e).delete(r)}getAddress(){return this.cachedAddress}getPublicKey(){return this.cachedPublicKey}createProvider(){let e=this.config.user?.wallets?.[this.chain.name];return e?typeof e=="string"?new f(this.config,this.chain):e.provider?this.createProviderForOperation(e.provider):new f(this.config,this.chain):null}async initializeCache(){let e=await $e(this.walletProvider);this.cachedAddress=e.address,this.cachedPublicKey=e.publicKey,this.isInitializedResolve()}createProviderForOperation(e){let t=this.config.walletProviders?.[this.chain.name]?.[e];if(t){let i=t(this.config,this.chain);if(!i)throw new Error(`Custom wallet provider factory returned null for ${e}`);return i}if(e==="privateKey")return new C(this.config,this.chain);if(e==="mnemonic")return new w(this.config,this.chain);throw new Error(`Unsupported wallet provider for ${this.chain.name}: ${e}`)}};var k={chain:A.Sui,identifier:"0x2::sui::SUI",name:"SUI",symbol:"SUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/26375/standard/sui-ocean-square.png?1727791290"};function ze(c,e){return(r,t)=>{if(!t)throw new Error(`${c} adapter requires a fallback adapter`);let i=e[r.env];if(!i)throw new Error(`SuiAdapter: chain info not found for chain ${c}`);return{chainInfo:i,builder:()=>new P(r,i),executor:new I(r,i),output:new v(r,i),serializer:new h,registry:t.registry,explorer:new x(r,i),abiBuilder:()=>new W(r,i),brandBuilder:()=>new E(r,i),dataLoader:new T(r,i),wallet:new K(r,i)}}}var di=ze(A.Sui,{mainnet:{name:A.Sui,displayName:"Sui",chainId:"1",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.mainnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:k},testnet:{name:A.Sui,displayName:"Sui Testnet",chainId:"testnet",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.testnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:k},devnet:{name:A.Sui,displayName:"Sui Devnet",chainId:"devnet",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.devnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:k}});var _=class{constructor(e,r){this.abi=new W(e,r)}async loadModuleAbi(e,r){return this.abi.getModuleAbi(e,r)}async loadFunctionAbi(e,r,t){return this.abi.getFunctionAbi(e,r,t)}};export{g as ExplorerUrls,oe as KnownTokens,k as NativeTokenSui,di as SuiAdapter,L as SuiExplorers,N as SuiExplorersConfig,W as WarpSuiAbiBuilder,E as WarpSuiBrandBuilder,P as WarpSuiBuilder,Fe as WarpSuiConstants,_ as WarpSuiContractLoader,T as WarpSuiDataLoader,I as WarpSuiExecutor,x as WarpSuiExplorer,v as WarpSuiOutput,h as WarpSuiSerializer,K as WarpSuiWallet,O as findKnownTokenById,D as getConfiguredSuiClient};
1
+ var Me={Sui:{Identifier:"SUI",DisplayName:"Sui",Decimals:9}},X=(a=>(a.SuiVision="suivision",a.SuiVisionTestnet="suivision_testnet",a.SuiVisionDevnet="suivision_devnet",a.SuiScan="suiscan",a.SuiScanTestnet="suiscan_testnet",a.SuiScanDevnet="suiscan_devnet",a))(X||{}),O={sui:{mainnet:["suivision","suiscan"],testnet:["suivision_testnet","suiscan_testnet"],devnet:["suivision_devnet","suiscan_devnet"]}},g={suivision:"https://suivision.xyz",suivision_testnet:"https://testnet.suivision.xyz",suivision_devnet:"https://devnet.suivision.xyz",suiscan:"https://suiscan.xyz",suiscan_testnet:"https://testnet.suiscan.xyz",suiscan_devnet:"https://devnet.suiscan.xyz"};import{SuiClient as Y}from"@mysten/sui/client";import{getProviderConfig as Z}from"@joai/warps";var z=(l,e)=>{let t=Z(l,e.name,l.env,e.defaultApiUrl);return new Y({url:t.url})};import{WarpChainName as S}from"@joai/warps";import{SuiClient as ee}from"@mysten/sui/client";import{getProviderConfig as te}from"@joai/warps";var W=class{constructor(e,t){this.config=e;this.chain=t;let r=te(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new ee({url:r.url})}async createInscriptionTransaction(e){throw new Error("WarpSuiAbiBuilder: createInscriptionTransaction not implemented")}async createFromRaw(e){return JSON.parse(e)}async createFromTransaction(e){return this.createFromRaw(e.data||"{}")}async createFromTransactionHash(e,t){try{let r=await this.client.getTransactionBlock({digest:e});return r?this.createFromTransaction(r):null}catch{return null}}async getModuleAbi(e,t){return this.client.getNormalizedMoveModule({package:e,module:t})}async getFunctionAbi(e,t,r){return this.client.getNormalizedMoveFunction({package:e,module:t,function:r})}};import{SuiClient as re}from"@mysten/sui/client";import{Transaction as ie}from"@mysten/sui/transactions";import{getProviderConfig as ne}from"@joai/warps";var E=class{constructor(e,t){this.config=e;this.chain=t;let r=ne(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new re({url:r.url})}createInscriptionTransaction(e){return new ie}async createFromRaw(e){return JSON.parse(e)}async createFromTransaction(e,t){return this.createFromRaw(e.data||"{}")}async createFromTransactionHash(e,t){try{let r=await this.client.getTransactionBlock({digest:e});return r?this.createFromTransaction(r,!1):null}catch{return null}}};import{SuiClient as ae}from"@mysten/sui/client";import{getProviderConfig as se,WarpBuilder as oe,WarpCache as ce}from"@joai/warps";var T=class extends oe{constructor(t,r){super(t);this.config=t;this.chain=r;this.cache=new ce(t.env,t.cache);let i=se(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new ae({url:i.url})}async createInscriptionTransaction(t){throw new Error("WarpSuiBuilder: on-chain inscription is not supported for Sui")}async createFromTransaction(t){return this.createFromRaw(t)}async createFromTransactionHash(t,r){return null}};import{SuiClient as ue}from"@mysten/sui/client";import{CacheTtl as de,getProviderConfig as he,WarpCache as ge,WarpCacheKey as me}from"@joai/warps";import{WarpChainName as le}from"@joai/warps";var d=le.Sui,pe=[{chain:d,identifier:"0x2::sui::SUI",name:"Sui",symbol:"SUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/26375/small/sui-logo.png"},{chain:d,identifier:"0xa198f3be41cda8c07c3bf1c4e0bb88b8e9827b7c063f36b1e6c3d6da1c4e8753::usdc::USDC",name:"USD Coin",symbol:"USDC",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"},{chain:d,identifier:"0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48ace0cdd97::usdt::USDT",name:"Tether USD",symbol:"USDT",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/325/small/Tether.png"},{chain:d,identifier:"0xaf8cd5edc19c4512f4259f0bee101a7c94d8a5c0e7c90c7a7c8c8c8c8c8c8c8c8::wbtc::WBTC",name:"Wrapped Bitcoin",symbol:"WBTC",decimals:8,logoUrl:"https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png"},{chain:d,identifier:"0xb8a6a9b7c7a6f4a3e2d1c0b9a8f7e6d5c4b3a2b1c0d9e8f7a6b5c4d3e2f1a0b::weth::WETH",name:"Wrapped Ether",symbol:"WETH",decimals:8,logoUrl:"https://assets.coingecko.com/coins/images/2518/small/weth.png"},{chain:d,identifier:"0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a15e0e9::ocean::OCEAN",name:"Ocean Protocol",symbol:"OCEAN",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/3687/small/ocean-protocol-logo.png"},{chain:d,identifier:"0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c35569693fd50fb8b7::deep::DEEP",name:"DeepBook",symbol:"DEEP",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/30169/small/deepbook.png"},{chain:d,identifier:"0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47ba3::hasui::HASUI",name:"Haedal Staked SUI",symbol:"HASUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/30027/small/haSUI.png"},{chain:d,identifier:"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e935::usdc::USDC",name:"USD Coin (Wormhole)",symbol:"USDC",decimals:6,logoUrl:"https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png"}],$=l=>pe.find(e=>e.identifier===l)||null;var I=class{constructor(e,t){this.config=e;this.chain=t;let r=he(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new ue({url:r.url}),this.cache=new ge(e.env,e.cache)}async getAccount(e){let t=await this.client.getBalance({owner:e,coinType:"0x2::sui::SUI"});return{chain:this.chain.name,address:e,balance:BigInt(t.totalBalance)}}async getAccountAssets(e){let t=await this.client.getAllBalances({owner:e});console.log("WarpSuiDataLoader.getAccountAssets",t);let r=t.find(a=>a.coinType==="0x2::sui::SUI"),i=t.filter(a=>a.coinType!=="0x2::sui::SUI"&&BigInt(a.totalBalance)>0n),n=[];if(r&&BigInt(r.totalBalance)>0n&&n.push({...this.chain.nativeToken,amount:BigInt(r.totalBalance)}),i.length>0){let a=await Promise.all(i.map(s=>this.getAsset(s.coinType)));n.push(...a.filter(s=>s!==null).map(s=>({...s,amount:BigInt(i.find(o=>o.coinType===s.identifier)?.totalBalance||0)})))}return n}async getAsset(e){let t=me.Asset(this.config.env,this.chain.name,e),r=await this.cache.get(t);if(r)return r;let i=$(e);if(i)return{chain:this.chain.name,identifier:e,name:i.name,symbol:i.symbol,amount:0n,decimals:i.decimals,logoUrl:i.logoUrl};try{let n=await this.client.getCoinMetadata({coinType:e}),a={chain:this.chain.name,identifier:e,name:n?.name||e.split("::").pop()||e,symbol:n?.symbol||e.split("::").pop()||e,amount:0n,decimals:n?.decimals||9,logoUrl:n?.iconUrl||""};return await this.cache.set(t,a,de.OneHour),a}catch{return null}}async getAccountNfts(e,t){try{let r=t?.size||25,i=t?.page||0,n;for(let o=0;o<i;o++){let c=await this.client.getOwnedObjects({owner:e,options:{showContent:!1,showDisplay:!1},limit:r,cursor:n});if(n=c.nextCursor,!c.hasNextPage)return[]}let a=await this.client.getOwnedObjects({owner:e,options:{showContent:!0,showDisplay:!0},limit:r,cursor:n}),s=[];for(let o of a.data){let c=o.data?.content,p=o.data?.display?.data,u=c?.type||"";if(u.startsWith("0x2::coin::Coin"))continue;let P=o.data?.objectId||"",J=p?.name||u.split("::").pop()||P.slice(0,8),q=u.includes("::")?u.split("::").slice(0,2).join("::"):void 0,D=p?.image_url;s.push({chain:this.chain.name,identifier:P,name:J,symbol:"",amount:1n,decimals:0,type:"nft",nft:{collection:q,mediaUrl:D,thumbnailUrl:D}})}return s}catch{return[]}}async getAction(e,t=!1){return null}async getAccountActions(e,t){return[]}};import{SuiClient as Ae}from"@mysten/sui/client";import{Transaction as M}from"@mysten/sui/transactions";import{applyOutputToMessages as Se,extractResolvedInputValues as Pe,getNextInfo as Ee,getProviderConfig as Te,getWarpActionByIndex as k,getWarpWalletAddressFromConfig as Ie}from"@joai/warps";import{SuiClient as We}from"@mysten/sui/client";import{applyOutputToMessages as ve,evaluateOutputCommon as F,getNextInfo as we,getProviderConfig as Ce,getWarpWalletAddressFromConfig as be,parseOutputOutIndex as j,WarpConstants as R}from"@joai/warps";import{Transaction as fe}from"@mysten/sui/transactions";import{WarpSerializer as ye}from"@joai/warps";var h=class{constructor(){this.coreSerializer=new ye}typedToString(e){if(e==null)return"option:null";if(typeof e=="string")return`string:${e}`;if(typeof e=="boolean")return`bool:${e}`;if(typeof e=="number")return`uint64:${e.toString()}`;if(typeof e=="bigint")return`uint64:${e.toString()}`;if(e&&typeof e=="object"&&e.address)return`address:${e.address}`;if(Array.isArray(e)){if(e.length===0)return"vector:u8:";let t=this.typeToString(typeof e[0]),r=e.map(i=>this.typedToString(i).split(":")[1]);return`vector:${t}:${r.join(",")}`}if(e&&typeof e=="object"&&e.type&&e.value&&e.type==="option")return e.value===null||e.value===void 0?"option:null":`option:${this.typedToString(e.value)}`;throw new Error(`WarpSuiSerializer (typedToString): Unsupported input type: ${typeof e}`)}typedToNative(e){let t=this.typedToString(e);return this.coreSerializer.stringToNative(t)}nativeToTyped(e,t){let r=this.coreSerializer.nativeToString(e,t);return this.stringToTyped(r)}stringToTyped(e,t){let r=t||new fe,[i,n]=e.split(/:(.*)/,2);if(i==="object")return r.object(n);if(i==="string")return r.pure.string(n);if(i==="bool")return r.pure.bool(n==="true");if(i==="u8")return r.pure.u8(Number(n));if(i==="u16")return r.pure.u16(Number(n));if(i==="u32")return r.pure.u32(Number(n));if(i==="u64"||i==="uint64")return r.pure.u64(BigInt(n));if(i==="u128")return r.pure.u128(BigInt(n));if(i==="u256")return r.pure.u256(BigInt(n));if(i==="address")return r.pure.address(n);throw new Error(`WarpSuiSerializer (stringToTyped): Unsupported type: ${i}`)}typeToString(e){if(e==="string")return"string";if(e==="bool")return"bool";if(e==="u8")return"u8";if(e==="u16")return"u16";if(e==="u32")return"u32";if(e==="u64"||e==="bigint"||e==="number")return"u64";if(e==="u128")return"u128";if(e==="u256")return"u256";if(e==="address")return"address";if(e==="vector")return"vector";if(e==="option")return"option";throw new Error(`WarpSuiSerializer (typeToString): Unsupported input type: ${e}`)}nativeToType(e){throw new Error("Not implemented")}};var v=class{constructor(e,t){this.config=e;this.chain=t;this.serializer=new h;let r=Ce(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new We({url:r.url})}async getActionExecution(e,t,r){let i=await this.extractContractOutput(e,t,r,[]),n=we(this.config,[],e,t,i.output),a=ve(e,i.output,this.config);return{status:r.effects?.status?.status==="success"?"success":"error",warp:e,action:t,user:be(this.config,this.chain.name),txHash:r.digest,tx:r,next:n,values:i.values,output:i.output,messages:a,destination:null,resolvedInputs:[]}}async extractContractOutput(e,t,r,i){let n=[],a=[],s={};if(!e.output)return{values:{string:n,native:a,mapped:{}},output:s};for(let[o,c]of Object.entries(e.output)){if(c.startsWith(R.Transform.Prefix))continue;if(c.startsWith("input.")){s[o]=c;continue}let p=j(c);if(p!==null&&p!==t){s[o]=null;continue}if(c.startsWith("out.")){let u=r.returnValues?r.returnValues[o]:null;s[o]=u,n.push(String(u)),a.push(u)}else s[o]=c}return{values:{string:n,native:a,mapped:{}},output:await F(e,s,a,t,i,this.serializer.coreSerializer,this.config)}}async extractQueryOutput(e,t,r,i){let n=t.map(c=>String(c)),a=t,s={string:n,native:a,mapped:{}},o={};if(!e.output)return{values:s,output:o};for(let[c,p]of Object.entries(e.output)){if(p.startsWith(R.Transform.Prefix))continue;let u=j(p);if(u!==null&&u!==r){o[c]=null;continue}if(p.startsWith("out.")||p==="out")if(Array.isArray(t)&&t.length>0&&typeof t[0]=="object"&&t[0]!==null){let P=p.replace(/^out\./,"");o[c]=t[0][P]}else o[c]=t[0];else o[c]=p}return{values:s,output:await F(e,o,a,r,i,this.serializer.coreSerializer,this.config)}}};var x=class{constructor(e,t){this.config=e;this.chain=t;this.serializer=new h,this.output=new v(this.config,this.chain);let r=Te(this.config,this.chain.name,this.config.env,this.chain.defaultApiUrl);this.client=new Ae({url:r.url}),this.userWallet=Ie(this.config,this.chain.name)}async createTransaction(e){let t=k(e.warp,e.action);if(t.type==="transfer")return this.createTransferTransaction(e);if(t.type==="contract")return this.createContractCallTransaction(e);throw t.type==="query"?new Error("WarpSuiExecutor: Invalid action type for createTransaction; Use executeQuery instead"):t.type==="collect"?new Error("WarpSuiExecutor: Invalid action type for createTransaction; Use executeCollect instead"):new Error(`WarpSuiExecutor: Invalid action type (${t.type})`)}async createTransferTransaction(e){if(!this.userWallet)throw new Error("WarpSuiExecutor: createTransfer - user address not set");if(!e.destination)throw new Error("WarpSuiExecutor: Invalid destination address");if(e.value<0)throw new Error(`WarpSuiExecutor: Transfer value cannot be negative: ${e.value}`);let t=new M,r=[];if(e.value>0){let i=await this.handleCoinTransfer(t,"0x2::sui::SUI",e.value);r.push(i)}for(let i of e.transfers){let n=await this.handleCoinTransfer(t,i.identifier,i.amount);r.push(n)}return r.length>0&&t.transferObjects(r,t.pure.address(e.destination)),t}async createContractCallTransaction(e){if(!this.userWallet)throw new Error("WarpSuiExecutor: createContractCall - user address not set");if(!e.destination)throw new Error("WarpSuiExecutor: Invalid contract address");if(e.value<0)throw new Error(`WarpSuiExecutor: Contract call value cannot be negative: ${e.value}`);let t=k(e.warp,e.action);if(!t.func)throw new Error("WarpSuiExecutor: createContractCall - function not set");let r=new M;r.setSender(this.userWallet);let i=[];e.value>0&&i.push(await this.handleCoinTransfer(r,"0x2::sui::SUI",e.value));for(let o of e.transfers)i.push(await this.handleCoinTransfer(r,o.identifier,o.amount));let{target:n,typeArguments:a}=this.parseMoveCallTarget(t),s=e.args.map(o=>this.serializer.stringToTyped(o,r));return n==="0x2::transfer::public_transfer"?i.push(...await this.buildPublicTransferArgs(r,e,s)):i.push(...s),r.moveCall({target:n,arguments:i,typeArguments:a}),r.setGasBudget(1e8),r}async executeQuery(e){if(!e.destination)throw new Error("WarpSuiExecutor: executeQuery - destination not set");let t=k(e.warp,e.action);if(t.type!=="query")throw new Error(`WarpSuiExecutor: Invalid action type for executeQuery: ${t.type}`);let r=await this.client.getObject({id:e.destination,options:{showContent:!0}}),i=[r],{values:n,output:a}=await this.output.extractQueryOutput(e.warp,i,e.action,e.resolvedInputs),s=Ee(this.config,[],e.warp,e.action,a),c=e.resolvedInputs.find(u=>u.input.position==="receiver"||u.input.position==="destination")?.value||e.destination,p=Pe(e.resolvedInputs);return{status:"success",warp:e.warp,action:e.action,user:this.userWallet,txHash:null,tx:null,next:s,values:n,output:{...a,_DATA:r},resolvedInputs:p,messages:Se(e.warp,a,this.config),destination:c}}async signMessage(e,t){throw new Error("Not implemented")}parseMoveCallTarget(e){if(!e.func)throw new Error("WarpSuiExecutor: Function not set");let t=`${e.address}::${e.func}`,r=e.typeArguments;if(!r&&e.func.includes("<")&&e.func.includes(">")){let i=e.func.match(/<([^>]+)>/);i&&(r=[i[1]],t=`${e.address}::${e.func.replace(/<[^>]+>/,"")}`)}return{target:t,typeArguments:r}}async buildPublicTransferArgs(e,t,r){let i=t.resolvedInputs.find(s=>String(s.input.position)==="arg:0")?.value||t.args[0],n=t.resolvedInputs.find(s=>String(s.input.position)==="arg:1")?.value||t.resolvedInputs.find(s=>s.input.type==="address"&&String(s.input.position)!=="arg:0")?.value||t.args[1],a=this.extractObjectId(i);if(!a)return r;try{if(!(await this.client.getObject({id:a,options:{showType:!0,showContent:!0}})).data?.type?.startsWith("0x2::coin::Coin<"))return r;let o=n?this.serializer.stringToTyped(n.includes(":")?n:`address:${n}`,e):r[1]||e.pure.address(this.userWallet);return[e.object(a),o]}catch{return r}}extractObjectId(e){if(!e||typeof e!="string")return null;let t=e.startsWith("object:")?e.substring(7):e;return t.startsWith("0x")?t:null}async handleCoinTransfer(e,t,r){if(t==="0x2::sui::SUI")try{return e.splitCoins(e.gas,[r.toString()])[0]}catch{}return this.createCoinTransferFromObjects(e,t,r)}async createCoinTransferFromObjects(e,t,r){let i=await this.getCoinObjectsForTransfer(t,r);if(i.length===0)throw new Error(`No coin objects found for ${t}`);let n=e.object(i[0].coinObjectId);return i.length>1&&e.mergeCoins(n,i.slice(1).map(a=>e.object(a.coinObjectId))),e.splitCoins(n,[r.toString()])[0]}async getCoinObjectsForTransfer(e,t){if(!this.userWallet)throw new Error("User wallet not set");let{data:r}=await this.client.getCoins({owner:this.userWallet,coinType:e}),i=r.map(s=>({coinObjectId:s.coinObjectId,balance:s.balance})).sort((s,o)=>BigInt(o.balance)>BigInt(s.balance)?1:-1),n=BigInt(0),a=[];for(let s of i)if(a.push(s),n+=BigInt(s.balance),n>=t)return a;throw new Error(`Insufficient ${e} balance. Required: ${t}, Available: ${n}`)}};var U=class{constructor(e,t){this.config=e;this.chain=t}getExplorers(){let e=O[this.chain.name];if(!e)return["suivision"];let t=e[this.config.env];return t||["suivision"]}getPrimaryExplorer(){return this.getExplorers()[0]}getExplorerUrlByName(e){let t=this.config.preferences?.explorers?.[this.chain.name];if(t&&!e){let n=g[t];if(n)return n}if(e){let n=g[e];if(n)return n}let r=this.getPrimaryExplorer();return g[r]||g[r]}getAccountUrl(e,t){return`${this.getExplorerUrlByName(t)}/account/${e}`}getTransactionUrl(e,t){return`${this.getExplorerUrlByName(t)}/txblock/${e}`}getBlockUrl(e,t){return`${this.getExplorerUrlByName(t)}/block/${e}`}getAssetUrl(e,t){return`${this.getExplorerUrlByName(t)}/coin/${e}`}getContractUrl(e,t){return`${this.getExplorerUrlByName(t)}/object/${e}`}getAllExplorers(){return this.getExplorers()}getExplorerByName(e){return this.getExplorers().find(r=>r.toLowerCase()===e.toLowerCase())}getAccountUrls(e){let t=this.getAllExplorers(),r={};return t.forEach(i=>{let n=g[i];n&&(r[i]=`${n}/account/${e}`)}),r}getTransactionUrls(e){let t=this.getAllExplorers(),r={};return t.forEach(i=>{let n=g[i];n&&(r[i]=`${n}/txblock/${e}`)}),r}};import{initializeWalletCache as je}from"@joai/warps";import{Ed25519Keypair as K}from"@mysten/sui/keypairs/ed25519";import*as _ from"@scure/bip39";import{wordlist as xe}from"@scure/bip39/wordlists/english.js";import{getWarpWalletAddressFromConfig as Ue,getWarpWalletMnemonicFromConfig as V,getWarpWalletPrivateKeyFromConfig as Ke,normalizeAndValidateMnemonic as Be,normalizeMnemonic as ke,removeWarpWalletFromConfig as Ne,setWarpWalletInConfig as H,validateMnemonicLength as De}from"@joai/warps";var m=class m{constructor(e,t){this.config=e;this.chain=t;this.keypair=null}async getAddress(){return Ue(this.config,this.chain.name)}async getPublicKey(){try{let t=this.getKeypair().getPublicKey();return Buffer.from(t.toRawBytes()).toString("hex")}catch{return null}}async signTransaction(e){if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return e;let t=this.getKeypair(),r=new TextEncoder().encode(JSON.stringify(e)),i=await t.signPersonalMessage(r);return{...e,signature:i.signature}}async signMessage(e){let t=this.getKeypair(),r=new TextEncoder().encode(e);return(await t.signPersonalMessage(r)).signature}getKeypairInstance(){return this.getKeypair()}async importFromMnemonic(e){let t=Be(e),i=K.deriveKeypair(t).getPublicKey().toSuiAddress(),n={provider:m.PROVIDER_NAME,address:i,privateKey:null,mnemonic:t};return H(this.config,this.chain.name,n),n}async importFromPrivateKey(e){let t=Buffer.from(e,"hex"),r;if(t.length===70)r=new Uint8Array(t.subarray(1,33));else if(t.length===32)r=new Uint8Array(t);else throw new Error(`Unsupported private key length: ${t.length} bytes`);let n=K.fromSecretKey(r).getPublicKey().toSuiAddress(),a={provider:m.PROVIDER_NAME,address:n,privateKey:e,mnemonic:null};return H(this.config,this.chain.name,a),a}async export(){let e=this.getKeypair(),t=V(this.config,this.chain.name),r=Ke(this.config,this.chain.name);return{provider:m.PROVIDER_NAME,address:e.getPublicKey().toSuiAddress(),privateKey:r||null,mnemonic:t||null}}async generate(){let e=_.generateMnemonic(xe,256),t=ke(e);De(t);let i=K.deriveKeypair(t).getPublicKey().toSuiAddress();return{provider:m.PROVIDER_NAME,address:i,privateKey:null,mnemonic:t}}async delete(e){Ne(this.config,this.chain.name)}getKeypair(){if(this.keypair)return this.keypair;let e=V(this.config,this.chain.name);if(!e)throw new Error("No mnemonic provided");return this.keypair=K.deriveKeypair(e.trim()),this.keypair}};m.PROVIDER_NAME="mnemonic";var w=m;import{getWarpWalletAddressFromConfig as b,removeWarpWalletFromConfig as Oe}from"@joai/warps";var f=class{constructor(e,t){this.config=e;this.chain=t}async getAddress(){return b(this.config,this.chain.name)}async getPublicKey(){return null}async signTransaction(e){let t=await this.getAddress();throw new Error(`Wallet can not be used for signing: ${t}`)}async signMessage(e){let t=await this.getAddress();throw new Error(`Wallet can not be used for signing: ${t}`)}async importFromMnemonic(e){let t=b(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${t}`)}async importFromPrivateKey(e){let t=b(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${t}`)}async export(){let e=b(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${e}`)}async generate(){let e=b(this.config,this.chain.name);throw new Error(`Wallet can not be used for signing: ${e}`)}async delete(e){Oe(this.config,this.chain.name)}};import{Ed25519Keypair as A}from"@mysten/sui/keypairs/ed25519";import{getWarpWalletAddressFromConfig as ze,getWarpWalletMnemonicFromConfig as $e,getWarpWalletPrivateKeyFromConfig as G,removeWarpWalletFromConfig as Fe,setWarpWalletInConfig as Q}from"@joai/warps";var y=class y{constructor(e,t){this.config=e;this.chain=t;this.keypair=null}async getAddress(){return ze(this.config,this.chain.name)}async getPublicKey(){try{let t=this.getKeypair().getPublicKey();return Buffer.from(t.toRawBytes()).toString("hex")}catch{return null}}async signTransaction(e){if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return e;let t=this.getKeypair(),r=new TextEncoder().encode(JSON.stringify(e)),i=await t.signPersonalMessage(r);return{...e,signature:i.signature}}async signMessage(e){let t=this.getKeypair(),r=new TextEncoder().encode(e);return(await t.signPersonalMessage(r)).signature}getKeypairInstance(){return this.getKeypair()}async importFromMnemonic(e){let t=A.deriveKeypair(e.trim()),r=t.getPublicKey().toSuiAddress(),i=Buffer.from(t.getSecretKey()).toString("hex"),n={provider:y.PROVIDER_NAME,address:r,privateKey:i,mnemonic:e};return Q(this.config,this.chain.name,n),n}async importFromPrivateKey(e){let t=Buffer.from(e,"hex"),r;if(t.length===70)r=new Uint8Array(t.subarray(1,33));else if(t.length===32)r=new Uint8Array(t);else throw new Error(`Unsupported private key length: ${t.length} bytes`);let n=A.fromSecretKey(r).getPublicKey().toSuiAddress(),a={provider:y.PROVIDER_NAME,address:n,privateKey:e,mnemonic:null};return Q(this.config,this.chain.name,a),a}async export(){let e=this.getKeypair(),t=G(this.config,this.chain.name),r=$e(this.config,this.chain.name);return{provider:y.PROVIDER_NAME,address:e.getPublicKey().toSuiAddress(),privateKey:t||null,mnemonic:r||null}}async generate(){let e=A.generate(),t=e.getPublicKey().toSuiAddress(),r=Buffer.from(e.getSecretKey()).toString("hex");return{provider:y.PROVIDER_NAME,address:t,privateKey:r,mnemonic:null}}async delete(e){Fe(this.config,this.chain.name)}getKeypair(){if(this.keypair)return this.keypair;let e=G(this.config,this.chain.name);if(!e)throw new Error("Wallet not initialized - no private key provided");try{let t=Buffer.from(e,"hex");if(t.length===70){let r=new Uint8Array(t.subarray(1,33));return this.keypair=A.fromSecretKey(r),this.keypair}else{if(t.length===32)return this.keypair=A.fromSecretKey(new Uint8Array(t)),this.keypair;throw new Error(`Unsupported private key length: ${t.length} bytes`)}}catch(t){throw t}}};y.PROVIDER_NAME="privateKey";var C=y;var B=class{constructor(e,t){this.config=e;this.chain=t;this.cachedAddress=null;this.cachedPublicKey=null;this.client=z(e,t),this.walletProvider=this.createProvider(),this.isInitializedPromise=new Promise(r=>{this.isInitializedResolve=r}),this.initializeCache()}async waitUntilInitialized(){await this.isInitializedPromise}async signTransaction(e){if(await this.waitUntilInitialized(),!e||typeof e!="object")throw new Error("Invalid transaction object");if(!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof f)throw new Error(`Wallet (${this.chain.name}) is read-only`);return(this.walletProvider instanceof C||this.walletProvider instanceof w)&&e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function"?e:await this.walletProvider.signTransaction(e)}async signMessage(e){if(await this.waitUntilInitialized(),!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof f)throw new Error(`Wallet (${this.chain.name}) is read-only`);return await this.walletProvider.signMessage(e)}async signTransactions(e){return await this.waitUntilInitialized(),e}async sendTransaction(e){if(await this.waitUntilInitialized(),!e||typeof e!="object")throw new Error("Invalid transaction object");if(e.transactionHash)return e.transactionHash;if(e&&typeof e=="object"&&"bytes"in e&&"signature"in e)return(await this.client.executeTransactionBlock({transactionBlock:e.bytes,signature:Array.isArray(e.signature)?e.signature:[e.signature],options:{showEffects:!0,showEvents:!0}})).digest;if(!this.walletProvider)throw new Error("No wallet provider available");if(this.walletProvider instanceof C||this.walletProvider instanceof w){let t=this.walletProvider.getKeypairInstance();if(e&&typeof e=="object"&&"sign"in e&&typeof e.sign=="function")return(await this.client.signAndExecuteTransaction({transaction:e,signer:t,options:{showEffects:!0,showEvents:!0}})).digest;throw new Error(`Transaction must be a Transaction object or have bytes and signature. Got: ${typeof e}, has sign: ${e&&typeof e=="object"&&"sign"in e}, has bytes: ${e&&typeof e=="object"&&"bytes"in e}, has signature: ${e&&typeof e=="object"&&"signature"in e}`)}throw new Error("Remote wallet provider must return signed payload (bytes + signature) or transactionHash for Sui transactions")}async sendTransactions(e){return await this.waitUntilInitialized(),Promise.all(e.map(async t=>this.sendTransaction(t)))}async importFromMnemonic(e){return await this.waitUntilInitialized(),await this.createProviderForOperation("mnemonic").importFromMnemonic(e)}async importFromPrivateKey(e){return await this.waitUntilInitialized(),await this.createProviderForOperation("privateKey").importFromPrivateKey(e)}async export(e){return await this.waitUntilInitialized(),await this.createProviderForOperation(e).export()}async generate(e){return await this.waitUntilInitialized(),await this.createProviderForOperation(e).generate()}async delete(e,t){await this.waitUntilInitialized(),await this.createProviderForOperation(e).delete(t)}getAddress(){return this.cachedAddress}getPublicKey(){return this.cachedPublicKey}createProvider(){let e=this.config.user?.wallets?.[this.chain.name];return e?typeof e=="string"?new f(this.config,this.chain):e.provider?this.createProviderForOperation(e.provider):new f(this.config,this.chain):null}async initializeCache(){let e=await je(this.walletProvider);this.cachedAddress=e.address,this.cachedPublicKey=e.publicKey,this.isInitializedResolve()}createProviderForOperation(e){let r=this.config.walletProviders?.[this.chain.name]?.[e];if(r){let i=r(this.config,this.chain);if(!i)throw new Error(`Custom wallet provider factory returned null for ${e}`);return i}if(e==="privateKey")return new C(this.config,this.chain);if(e==="mnemonic")return new w(this.config,this.chain);throw new Error(`Unsupported wallet provider for ${this.chain.name}: ${e}`)}};var N={chain:S.Sui,identifier:"0x2::sui::SUI",name:"SUI",symbol:"SUI",decimals:9,logoUrl:"https://assets.coingecko.com/coins/images/26375/standard/sui-ocean-square.png?1727791290"};function Re(l,e){return(t,r)=>{if(!r)throw new Error(`${l} adapter requires a fallback adapter`);let i=e[t.env];if(!i)throw new Error(`SuiAdapter: chain info not found for chain ${l}`);return{chainInfo:i,builder:()=>new T(t,i),executor:new x(t,i),output:new v(t,i),serializer:new h,registry:r.registry,explorer:new U(t,i),abiBuilder:()=>new W(t,i),brandBuilder:()=>new E(t,i),dataLoader:new I(t,i),wallet:new B(t,i)}}}var mi=Re(S.Sui,{mainnet:{name:S.Sui,displayName:"Sui",chainId:"1",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.mainnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:N},testnet:{name:S.Sui,displayName:"Sui Testnet",chainId:"testnet",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.testnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:N},devnet:{name:S.Sui,displayName:"Sui Devnet",chainId:"devnet",blockTime:3e3,addressHrp:"sui",defaultApiUrl:"https://fullnode.devnet.sui.io",logoUrl:"https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/chains/logos/sui.svg",nativeToken:N}});var L=class{constructor(e,t){this.abi=new W(e,t)}async loadModuleAbi(e,t){return this.abi.getModuleAbi(e,t)}async loadFunctionAbi(e,t,r){return this.abi.getFunctionAbi(e,t,r)}};export{g as ExplorerUrls,pe as KnownTokens,N as NativeTokenSui,mi as SuiAdapter,X as SuiExplorers,O as SuiExplorersConfig,W as WarpSuiAbiBuilder,E as WarpSuiBrandBuilder,T as WarpSuiBuilder,Me as WarpSuiConstants,L as WarpSuiContractLoader,I as WarpSuiDataLoader,x as WarpSuiExecutor,U as WarpSuiExplorer,v as WarpSuiOutput,h as WarpSuiSerializer,B as WarpSuiWallet,$ as findKnownTokenById,z as getConfiguredSuiClient};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joai/warps-adapter-sui",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -38,6 +38,6 @@
38
38
  "dependencies": {
39
39
  "@mysten/sui": "^1.45.2",
40
40
  "@scure/bip39": "^2.0.1",
41
- "@joai/warps": "^4.3.0"
41
+ "@joai/warps": "^4.11.0"
42
42
  }
43
43
  }