UNPKG

@keyban/sdk-base

Version:

Keyban Javascript SDK provides core functionalities for the MPC wallet solution, supporting web and Node.js apps with TypeScript, custom storage, and Ethereum blockchain integration.

3 lines 30.6 kB
'use strict';var cache=require('@apollo/client/cache'),core=require('@apollo/client/core'),context=require('@apollo/client/link/context'),subscriptions=require('@apollo/client/link/subscriptions'),utilities=require('@apollo/client/utilities'),graphqlWs=require('graphql-ws'),viem=require('viem'),accounts=require('viem/accounts'),N=require('viem/chains'),secp256k1=require('@noble/curves/secp256k1'),starknet=require('starknet'),stellarSdk=require('@stellar/stellar-sdk'),bignumber_js=require('bignumber.js'),buffer=require('buffer'),ed25519=require('@noble/curves/ed25519');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var N__namespace=/*#__PURE__*/_interopNamespace(N);var tt=Object.defineProperty;var c=(l,e)=>()=>(l&&(e=l(l=0)),e);var X=(l,e)=>{for(var t in e)tt(l,t,{get:e[t],enumerable:true});};exports.KeybanAccount=void 0;var le=c(()=>{exports.KeybanAccount=class{rpcClient;constructor(e){this.rpcClient=e;}async dppClaim(e){return this.rpcClient.call("dpp","claim",e,this.address)}async loyaltySetup(){return Promise.resolve()}async loyaltyDestroy(){return Promise.resolve()}};});function pe(l,e){let t=context.setContext(async(i,{headers:p})=>{let d=await e?.();return {headers:{...p,authorization:d?`Bearer ${d}`:""}}}),r=core.createHttpLink({uri:l.toString()}),n=new URL(l);n.protocol="wss";let s=new subscriptions.GraphQLWsLink(graphqlWs.createClient({url:n.toString()})),o=core.split(({query:i})=>{let p=utilities.getMainDefinition(i);return p.kind==="OperationDefinition"&&p.operation==="subscription"},s,r);return new core.ApolloClient({connectToDevTools:true,defaultOptions:{query:{fetchPolicy:"network-only"},watchQuery:{fetchPolicy:"cache-and-network"}},cache:new cache.InMemoryCache({typePolicies:{Query:{fields:{tokenBalances:utilities.relayStylePagination(["filter"]),nftBalances:utilities.relayStylePagination(["filter"]),assetTransfers:utilities.relayStylePagination(["filter"]),orders:utilities.relayStylePagination(["filter"])}},Transaction:{fields:{date:{read(i){return i&&i+"Z"}}}}}}),link:core.ApolloLink.from([t,o])})}var de=c(()=>{});exports.KeybanBaseError=void 0;var C=c(()=>{exports.KeybanBaseError=class extends Error{type;title;instance;status;detail;timestamp;rootError;toJSON(){return {type:this.type,title:this.title,instance:this.instance,status:this.status,detail:this.detail,timestamp:this.timestamp,rootError:this.rootError}}constructor({type:e,title:t,instance:r,rootError:n,detail:s,status:o}){super(s??t??e),this.type=e,this.title=t??e,this.instance=r,this.detail=s,this.status=o,this.timestamp=new Date().toISOString(),this.rootError=n;}};});var me=c(()=>{C();});var ue=c(()=>{C();});var ye=c(()=>{C();});exports.SdkErrorTypes=void 0;exports.SdkError=void 0;var he=c(()=>{C();exports.SdkErrorTypes=(m=>(m.UnknownTransactionError="UnknownTransactionError",m.UnknownIframeRpcError="UnknownIframeRpcError",m.AddressInvalid="AddressInvalid",m.AmountInvalid="AmountInvalid",m.AmountRequired="AmountRequired",m.AmountIrrelevant="AmountIrrelevant",m.RecipientAddressEqualsSender="RecipientAddressEqualsSender",m.EstimateGasExecution="EstimateGasExecution",m.InsufficientFunds="InsufficientFunds",m.InvalidNftStandard="InvalidNftStandard",m.NftNotFound="NftNotFound",m.TokenBalanceNotFound="TokenBalanceNotFound",m))(exports.SdkErrorTypes||{}),exports.SdkError=class l extends exports.KeybanBaseError{static types=exports.SdkErrorTypes;constructor(e,t,r){super({type:e,instance:t,rootError:r,title:l.#e(e)});}static#e(e){switch(e){case "UnknownTransactionError":return "An unknown error occurred with the transaction";case "UnknownIframeRpcError":return "An unknown error occured with iframe rpc call";case "AddressInvalid":return "Address is invalid";case "AmountInvalid":return "The specified amount is invalid";case "AmountRequired":return "An amount is required for this operation";case "AmountIrrelevant":return "The amount provided is irrelevant and should not be included";case "RecipientAddressEqualsSender":return "Recipient address cannot be the same as the sender address";case "EstimateGasExecution":return "Gas estimation failed";case "InsufficientFunds":return "Insufficient funds to complete the transaction";case "InvalidNftStandard":return "Invalid NFT standard. Supported standards are ERC721 and ERC1155";case "NftNotFound":return "NFT not found with the provided contract address and token ID";case "TokenBalanceNotFound":return "Token balance not found with the provided contract address";default:return `Unknown error type: ${e}`}}};});var K=c(()=>{me();ue();ye();C();he();});var A,j=c(()=>{K();A=class l{#e;#t;static#r=new Map;static#n({apiUrl:e,appId:t,network:r}){let n=new URL("/sdk-client/rpc",e);return n.searchParams.set("appId",t),n.searchParams.set("network",r),n}static getInstance(e){let t=l.#n(e).toString();return l.#r.has(t)||l.#r.set(t,new l(e)),l.#r.get(t)}constructor(e){this.#e=l.#n(e),this.#t=new Promise((t,r)=>{let n=Object.assign(document.createElement("iframe"),{src:this.#e,hidden:true,onload:()=>t(n),onerror:r});document.body.appendChild(n);});}destroy(){this.#t.then(e=>document.body.removeChild(e));}async call(e,t,...r){let n=await this.#t,s=new MessageChannel;return await new Promise((o,i)=>{s.port1.onmessage=({data:[d,u]})=>(s.port1.close(),u!=null?i(new exports.KeybanBaseError(JSON.parse(u))):o(d));let p={__KEYBAN_RPC:true,service:e,method:t,params:r};n.contentWindow?.postMessage(p,this.#e.origin,[s.port2]);})}};});var Ee,k,we=c(()=>{K();P();Ee=[{type:"function",name:"safeTransferFrom",inputs:[{name:"from",type:"address",internalType:"address"},{name:"to",type:"address",internalType:"address"},{name:"id",type:"uint256",internalType:"uint256"},{name:"value",type:"uint256",internalType:"uint256"},{name:"data",type:"bytes",internalType:"bytes"}],outputs:[],stateMutability:"nonpayable"}],k=class extends exports.KeybanAccount{#e;#t;constructor(e,t,r){super(e),this.#e=t,this.#t=r;}get address(){return this.#t.account.address.toLowerCase()}get publicKey(){return this.#t.account.publicKey.toLowerCase()}async signMessage(e){return this.#t.signMessage({message:e})}async transfer(e,t,r){if(!viem.isAddress(e))throw new exports.SdkError(exports.SdkError.types.AddressInvalid,"KeybanAccount.transfer");if(t<=0n)throw new exports.SdkError(exports.SdkError.types.AmountInvalid,"KeybanAccount.transfer");return this.#t.sendTransaction({to:e,value:t,type:"eip1559",...r}).catch(n=>{throw n.cause})}async estimateTransfer(e){let[{maxFeePerGas:t,maxPriorityFeePerGas:r},n]=await Promise.all([this.#e.estimateFeesPerGas({type:"eip1559"}),this.#e.estimateGas({to:e,account:this.address})]);return {maxFees:t*n,details:{maxFeePerGas:t,maxPriorityFeePerGas:r}}}async transferERC20(e){let{contractAddress:t,to:r,value:n,fees:s}=e;if(!viem.isAddress(r))throw new exports.SdkError(exports.SdkError.types.AddressInvalid,"KeybanAccount.transferERC20");if(!viem.isAddress(t))throw new exports.SdkError(exports.SdkError.types.AddressInvalid,"KeybanAccount.transferERC20");if(r===this.address)throw new exports.SdkError(exports.SdkError.types.RecipientAddressEqualsSender,"KeybanAccount.transferERC20");if(n<=0n)throw new exports.SdkError(exports.SdkError.types.AmountInvalid,"KeybanAccount.transferERC20");return viem.getContract({address:t,abi:viem.erc20Abi,client:{public:this.#e,wallet:this.#t}}).write.transfer([r,n],s).catch(i=>{switch(true){case i.cause.cause instanceof viem.InsufficientFundsError:case i.cause.cause instanceof viem.EstimateGasExecutionError:throw new exports.SdkError(exports.SdkError.types.InsufficientFunds,"KeybanAccount.transferERC20");default:throw i.cause}})}async estimateERC20Transfer(e){let{contractAddress:t,to:r,value:n}=e,[{maxFeePerGas:s,maxPriorityFeePerGas:o},i]=await Promise.all([this.#e.estimateFeesPerGas({type:"eip1559"}),this.#e.estimateContractGas({address:t,abi:viem.erc20Abi,functionName:"transfer",args:[r,n],account:this.address})]);return {maxFees:s*i,details:{maxFeePerGas:s,maxPriorityFeePerGas:o}}}async transferNft(e){let{contractAddress:t,tokenId:r,to:n,value:s,standard:o,fees:i}=e;if(!viem.isAddress(n))throw new exports.SdkError(exports.SdkError.types.AddressInvalid,"KeybanAccount.transferNft");if(!viem.isAddress(t))throw new exports.SdkError(exports.SdkError.types.AddressInvalid,"KeybanAccount.transferNft");if(n===this.address)throw new exports.SdkError(exports.SdkError.types.RecipientAddressEqualsSender,"KeybanAccount.transferNft");if(o==="ERC1155"){if(s===void 0)throw new exports.SdkError(exports.SdkError.types.AmountRequired,"KeybanAccount.transferNft");if(s<=0n)throw new exports.SdkError(exports.SdkError.types.AmountInvalid,"KeybanAccount.transferNft");return this.#n({contractAddress:t,tokenId:r,value:s,to:n,fees:i})}if(o==="ERC721"){if(s!==void 0&&s!==1n)throw new exports.SdkError(exports.SdkError.types.AmountIrrelevant,"KeybanAccount.transferNft");return this.#r({contractAddress:t,tokenId:r,to:n,fees:i})}throw new exports.SdkError(exports.SdkError.types.InvalidNftStandard,"KeybanAccount.transferNft")}async#r({contractAddress:e,tokenId:t,to:r,fees:n}){let s=viem.getContract({address:e,abi:viem.erc721Abi,client:{public:this.#e,wallet:this.#t}}),o=this.address;return s.write.transferFrom([o,r,t],n).catch(i=>{switch(true){case i.cause.cause instanceof viem.InsufficientFundsError:case i.cause.cause instanceof viem.EstimateGasExecutionError:throw new exports.SdkError(exports.SdkError.types.InsufficientFunds,"KeybanAccount.transferNft");default:throw i.cause}})}async#n({contractAddress:e,tokenId:t,value:r,to:n,fees:s}){let o=viem.getContract({address:e,abi:Ee,client:{public:this.#e,wallet:this.#t}}),i=this.address;return o.write.safeTransferFrom([i,n,t,r,""],s).catch(p=>{switch(true){case p.cause.cause instanceof viem.InsufficientFundsError:case p.cause.cause instanceof viem.EstimateGasExecutionError:throw new exports.SdkError(exports.SdkError.types.InsufficientFunds,"KeybanAccount.transferNft");default:throw p.cause}})}async estimateNftTransfer(e){let{standard:t,contractAddress:r,tokenId:n,to:s,value:o}=e;if(t==="ERC1155")return this.#a({contractAddress:r,tokenId:n,to:s,value:o});if(t==="ERC721"){if(o!==void 0&&o!==1n)throw new exports.SdkError(exports.SdkError.types.AmountIrrelevant,"KeybanAccount.transferNft");return this.#s({contractAddress:r,tokenId:n,to:s})}throw new exports.SdkError(exports.SdkError.types.InvalidNftStandard,"KeybanAccount.estimateNftTransfer")}async#s({contractAddress:e,tokenId:t,to:r}){let n=this.address,[{maxFeePerGas:s,maxPriorityFeePerGas:o},i]=await Promise.all([this.#e.estimateFeesPerGas({type:"eip1559"}),this.#e.estimateContractGas({address:e,abi:viem.erc721Abi,functionName:"transferFrom",args:[n,r,t],account:this.address})]);return {maxFees:s*i,details:{maxFeePerGas:s,maxPriorityFeePerGas:o}}}async#a({contractAddress:e,tokenId:t,to:r,value:n}){let s=this.address,[{maxFeePerGas:o,maxPriorityFeePerGas:i},p]=await Promise.all([this.#e.estimateFeesPerGas({type:"eip1559"}),this.#e.estimateContractGas({address:e,abi:Ee,functionName:"safeTransferFrom",args:[s,r,t,n,""],account:this.address})]);return {maxFees:o*p,details:{maxFeePerGas:o,maxPriorityFeePerGas:i}}}async signTransaction(e){throw new Error("Unimplemented")}};});exports.KeybanNetwork=void 0;var ee=c(()=>{exports.KeybanNetwork=(p=>(p.EthereumAnvil="EthereumAnvil",p.PolygonAmoy="PolygonAmoy",p.StarknetDevnet="StarknetDevnet",p.StarknetSepolia="StarknetSepolia",p.StarknetMainnet="StarknetMainnet",p.StellarQuickstart="StellarQuickstart",p.StellarTestnet="StellarTestnet",p.StellarMainnet="StellarMainnet",p))(exports.KeybanNetwork||{});});var M,Ce=c(()=>{b();we();ee();M=class extends g{#e;constructor(e,t){super(e,t);let r=this.metadataConfig.then(o=>viem.http(o.network.rpcUrl)),n={EthereumAnvil:N__namespace.anvil,PolygonAmoy:N__namespace.polygonAmoy,StarknetDevnet:null,StarknetSepolia:null,StarknetMainnet:null,StellarQuickstart:null,StellarTestnet:null,StellarMainnet:null}[this.network],s=r.then(o=>viem.createPublicClient({chain:n,transport:o}));this.#e={chain:n,transport:r,publicClient:s};}async initialize(){let e=`ecdsa:${this.network}`,t=await this.clientShareProvider.get(e);t||(t=await this.rpcClient.call("ecdsa","dkg"),await this.clientShareProvider.set(e,t));let r=await this.rpcClient.call("ecdsa","publicKey",t),n=accounts.toAccount({address:accounts.publicKeyToAddress(r),signMessage:async({message:i})=>{let p=viem.hashMessage(i,"hex");return this.rpcClient.call("ecdsa","sign",t,p)},signTransaction:async(i,p)=>{let d=p?.serializer??viem.serializeTransaction,u=i.type==="eip4844"?{...i,sidecars:false}:i,w=await this.rpcClient.call("ecdsa","sign",t,viem.keccak256(d(u))).then(viem.parseSignature);return d(i,w)},signTypedData:async i=>{let p=viem.hashTypedData(i);return this.rpcClient.call("ecdsa","sign",t,p)}});n.publicKey=r;let s=await this.#e.publicClient,o=viem.createWalletClient({chain:s.chain,transport:await this.#e.transport,account:n});return new k(this.rpcClient,s,o)}};});var te={};X(te,{KeybanEvmClient:()=>M});var re=c(()=>{Ce();});var Ae=c(()=>{});var xe=c(()=>{});var Se=c(()=>{});var Te=c(()=>{});var h,L,U,Pe=c(()=>{h={V0:"0x0",V1:"0x1",V2:"0x2",V3:"0x3",F0:"0x100000000000000000000000000000000",F1:"0x100000000000000000000000000000001",F2:"0x100000000000000000000000000000002",F3:"0x100000000000000000000000000000003"},L={V0:h.V0,V1:h.V1,V2:h.V2,F0:h.F0,F1:h.F1,F2:h.F2},U={V3:h.V3,F3:h.F3};});var be=c(()=>{});var ve=c(()=>{});var Ie=c(()=>{Ae();xe();Se();Te();Pe();be();ve();});var De=c(()=>{});var Re=c(()=>{});var Ke=c(()=>{});var ke=c(()=>{});var Fe=c(()=>{});var Me=c(()=>{});var Ne=c(()=>{});var Le=c(()=>{De();Re();Ke();ke();Fe();Me();Ne();});var ne=c(()=>{Ie();Le();});var _,Ue=c(()=>{P();_=class extends exports.KeybanAccount{#e;address;publicKey;constructor(e,t,r){super(e),this.#e=t,this.address=t.address,this.publicKey=r;}async signMessage(e){let t={types:{StarknetDomain:[{name:"name",type:"shortstring"},{name:"version",type:"shortstring"},{name:"chainId",type:"shortstring"},{name:"revision",type:"shortstring"}],Message:[{name:"message",type:"string"}]},primaryType:"Message",domain:{name:"StarkNet Message",version:"1",chainId:"1",revision:"1"},message:{message:e}};return await this.#e.signMessage(t)}async transfer(e,t,r){throw new Error("Unimplemented")}async estimateTransfer(e){throw new Error("Unimplemented")}async transferERC20(e){throw new Error("Unimplemented")}async estimateERC20Transfer(e){throw new Error("Unimplemented")}async transferNft(e){throw new Error("Unimplemented")}async estimateNftTransfer(e){throw new Error("Unimplemented")}async signTransaction(e){throw new Error("Unimplemented")}};});function Pt(l){let{r:e,s:t}=secp256k1.secp256k1.Signature.fromCompact(l.slice(2,130)),r=+`0x${l.slice(130)}`;if(r!==0&&r!==1)throw new Error("Invalid yParity value");let n=starknet.uint256.bnToUint256(e),s=starknet.uint256.bnToUint256(t);if(r===void 0)throw Error("yParity is required");return [starknet.num.toHex(n.low),starknet.num.toHex(n.high),starknet.num.toHex(s.low),starknet.num.toHex(s.high),starknet.num.toHex(r)]}var H,Oe=c(()=>{ne();H=class{#e;#t;#r;constructor(e,t,r){this.#e=e,this.#t=t,this.#r=r;}async getPubKey(){return this.#r}async#n(e){return this.#e.call("ecdsa","sign",this.#t,starknet.encode.removeHexPrefix(starknet.encode.sanitizeHex(e))).then(Pt)}async signMessage(e,t){let r=starknet.typedData.getMessageHash(e,t);return this.#n(r)}async signTransaction(e,t){let r=starknet.transaction.getExecuteCalldata(e,t.cairoVersion),n;if(Object.values(L).includes(t.version)){let s=t;n=starknet.hash.calculateInvokeTransactionHash({...s,senderAddress:s.walletAddress,compiledCalldata:r,version:s.version});}else if(Object.values(U).includes(t.version)){let s=t;n=starknet.hash.calculateInvokeTransactionHash({...s,senderAddress:s.walletAddress,compiledCalldata:r,version:s.version,nonceDataAvailabilityMode:starknet.stark.intDAM(s.nonceDataAvailabilityMode),feeDataAvailabilityMode:starknet.stark.intDAM(s.feeDataAvailabilityMode)});}else throw Error("unsupported signTransaction version");return this.#n(n)}async signDeployAccountTransaction(e){let t=starknet.CallData.compile(e.constructorCalldata),r;if(Object.values(L).includes(e.version)){let n=e;r=starknet.hash.calculateDeployAccountTransactionHash({...n,salt:n.addressSalt,constructorCalldata:t,version:n.version});}else if(Object.values(U).includes(e.version)){let n=e;r=starknet.hash.calculateDeployAccountTransactionHash({...n,salt:n.addressSalt,compiledConstructorCalldata:t,version:n.version,nonceDataAvailabilityMode:starknet.stark.intDAM(n.nonceDataAvailabilityMode),feeDataAvailabilityMode:starknet.stark.intDAM(n.feeDataAvailabilityMode)});}else throw Error("unsupported signDeployAccountTransaction version");return this.#n(r)}async signDeclareTransaction(e){let t;if(Object.values(L).includes(e.version)){let r=e;t=starknet.hash.calculateDeclareTransactionHash({...r,version:r.version});}else if(Object.values(U).includes(e.version)){let r=e;t=starknet.hash.calculateDeclareTransactionHash({...r,version:r.version,nonceDataAvailabilityMode:starknet.stark.intDAM(r.nonceDataAvailabilityMode),feeDataAvailabilityMode:starknet.stark.intDAM(r.feeDataAvailabilityMode)});}else throw Error("unsupported signDeclareTransaction version");return this.#n(t)}};});var O,Be=c(()=>{ne();b();Ue();Oe();O=class extends g{#e;constructor(e,t){super(e,t),this.#e=this.metadataConfig.then(r=>new starknet.RpcProvider({nodeUrl:r.network.rpcUrl}));}async initialize(){let e=`ecdsa:${this.network}`,t=await this.clientShareProvider.get(e);t||(t=await this.rpcClient.call("ecdsa","dkg"),await this.clientShareProvider.set(e,t));let[r,n,s]=await Promise.all([this.#e,this.rpcClient.call("ecdsa","publicKey",t).then(p=>`0x${p.slice(4)}`),this.rpcClient.call("account","getAddress")]),o=new H(this.rpcClient,t,n),i=new starknet.Account(r,s,o,void 0,h.V3);return new _(this.rpcClient,i,n)}};});var B={};X(B,{StarknetClient:()=>O});var V=c(()=>{Be();});var ze,oe,$,Xe=c(()=>{P();ze=25,oe=7;bignumber_js.BigNumber.config({DECIMAL_PLACES:oe});$=class extends exports.KeybanAccount{address;publicKey;#e;#t;#r;constructor(e,t,r,n,s){super(e),this.#t=t,this.#r=r,this.#e=n,this.address=s,this.publicKey=s;}async signMessage(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return (await this.#e.sign(buffer.Buffer.from(t))).toString("base64")}async transfer(e,t,r){if(t<=0n)throw new exports.SdkError(exports.SdkError.types.AmountInvalid,"KeybanAccount.transfer");let[n,s]=await Promise.all([this.#t.getAccount(this.address),this.#t.getNetwork()]),o=new stellarSdk.TransactionBuilder(n,{fee:r??stellarSdk.BASE_FEE,networkPassphrase:s.passphrase}),i=bignumber_js.BigNumber(t).dividedBy(10**oe).toString();await this.#s(e)?o.addOperation(stellarSdk.Operation.payment({destination:e,asset:stellarSdk.Asset.native(),amount:i})):o.addOperation(stellarSdk.Operation.createAccount({destination:e,startingBalance:i}));let d=o.setTimeout(ze).build(),u=await this.#e.signDecorated(d.hash());return d.addDecoratedSignature(u),this.#n(d,"transfer")}async estimateTransfer(e){let t=1n,r=await this.#a();return {maxFees:r*t,details:r.toString()}}async transferERC20({contractAddress:e,to:t,value:r,fees:n}){if(!await this.#s(t))throw new exports.SdkError(exports.SdkError.types.AddressInvalid,"KeybanAccount.transferERC20");if(!/^[a-zA-Z0-9]+:[a-zA-Z0-9]+$/.test(e))throw new exports.SdkError(exports.SdkError.types.AddressInvalid,"KeybanAccount.transferERC20");if(t===this.address)throw new exports.SdkError(exports.SdkError.types.RecipientAddressEqualsSender,"KeybanAccount.transferERC20");if(r<=0n)throw new exports.SdkError(exports.SdkError.types.AmountInvalid,"KeybanAccount.transferERC20");let[o,i]=e.split(":"),p=new stellarSdk.Asset(o,i),[d,u]=await Promise.all([this.#t.getAccount(this.address),this.#t.getNetwork()]),w=bignumber_js.BigNumber(r).dividedBy(10**oe).toString(),m=new stellarSdk.TransactionBuilder(d,{fee:n??stellarSdk.BASE_FEE,networkPassphrase:u.passphrase}).addOperation(stellarSdk.Operation.payment({destination:t,asset:p,amount:w})).setTimeout(ze).build(),et=await this.#e.signDecorated(m.hash());return m.addDecoratedSignature(et),this.#n(m,"transferERC20")}async estimateERC20Transfer(e){let t=1n,r=await this.#a();return {maxFees:r*t,details:r.toString()}}transferNft(e){throw new Error("transferNft not implemented.")}estimateNftTransfer(e){throw new Error("estimateNftTransfer not implemented.")}async#n(e,t){return this.#t.sendTransaction(e).then(async r=>{if(r.status!=="PENDING")throw JSON.stringify(r).includes("txInsufficientBalance")?new exports.SdkError(exports.SdkError.types.InsufficientFunds,"KeybanAccount.transferERC20"):new exports.SdkError(exports.SdkError.types.UnknownTransactionError,`KeybanAccount.${t}`,{SendTransactionResponse:r.errorResult?.result()??r});return this.#t.pollTransaction(r.hash)}).then(r=>{if(JSON.stringify(r).includes("txInsufficientBalance"))throw new exports.SdkError(exports.SdkError.types.InsufficientFunds,"KeybanAccount.transferERC20");switch(r.status){case stellarSdk.rpc.Api.GetTransactionStatus.NOT_FOUND:throw new exports.SdkError(exports.SdkError.types.UnknownTransactionError,`KeybanAccount.${t}`,{transactionResponse:JSON.stringify(r)});case stellarSdk.rpc.Api.GetTransactionStatus.FAILED:throw new exports.SdkError(exports.SdkError.types.UnknownTransactionError,`KeybanAccount.${t}`,{transactionResponse:r.resultXdr.result()});case stellarSdk.rpc.Api.GetTransactionStatus.SUCCESS:return r.txHash}})}async loyaltySetup(){if(await this.#s(this.address)){console.log("Stellar Account already setup for Loyalty, nothing to do.");return}console.log("Stellar Account not setup for Loyalty, setting it up now...");let t=await this.rpcClient.call("loyalty","initAccountSetup"),{passphrase:r}=await this.#t.getNetwork(),n=new stellarSdk.Transaction(t,r),s=await this.#e.signDecorated(n.hash());n.addDecoratedSignature(s),await this.rpcClient.call("loyalty","submitAccountSetup",n.toXDR());}async loyaltyDestroy(){if(!await this.#s(this.address)){console.log("Stellar Account not setup for Loyalty, nothing to destroy.");return}console.log("Stellar Account setup for Loyalty, destroying it now...");let t=await this.rpcClient.call("loyalty","initAccountDestroy"),{passphrase:r}=await this.#t.getNetwork(),n=new stellarSdk.Transaction(t,r),s=await this.#e.signDecorated(n.hash());n.addDecoratedSignature(s),await this.rpcClient.call("loyalty","submitAccountDestroy",n.toXDR());}async#s(e){try{return await this.#t.getAccount(e),!0}catch{return false}}async#a(){let{max_fee:e}=await this.#r.feeStats();return BigInt(e.mode)}async signTransaction(e){let t=buffer.Buffer.from(e,"hex");return (await this.#e.signDecorated(t)).toXDR("hex")}};});var G,We=c(()=>{G=class{type="ed25519";#e;#t;#r;constructor(e,t,r){this.#e=e,this.#t=t,this.#r=r;}publicKey(){return stellarSdk.StrKey.encodeEd25519PublicKey(this.rawPublicKey())}rawPublicKey(){let e=this.#r.replace(/^0x/,"");return buffer.Buffer.from(e,"hex")}async sign(e){let t=await this.#e.call("eddsa","sign",this.#t,e.toString("hex"));return buffer.Buffer.from(t,"hex")}async signDecorated(e){let t=await this.sign(e),r=this.signatureHint();return new stellarSdk.xdr.DecoratedSignature({hint:r,signature:t})}async signPayloadDecorated(e){let t=await this.sign(e),r=this.signatureHint(),n=buffer.Buffer.from(e.slice(-4));return n.length<4&&(n=buffer.Buffer.concat([n,buffer.Buffer.alloc(4-e.length,0)])),new stellarSdk.xdr.DecoratedSignature({hint:n.map((s,o)=>s^r[o]),signature:t})}signatureHint(){let e=this.xdrAccountId().toXDR();return e.slice(e.length-4)}verify(e,t){try{return ed25519.ed25519.verify(t,e,this.rawPublicKey())}catch{return false}}xdrAccountId(){return stellarSdk.xdr.PublicKey.publicKeyTypeEd25519(this.rawPublicKey())}xdrPublicKey(){return stellarSdk.xdr.PublicKey.publicKeyTypeEd25519(this.rawPublicKey())}xdrMuxedAccount(e){if(typeof e<"u"){if(typeof e!="string")throw new TypeError(`expected string for ID, got ${typeof e}`);return stellarSdk.xdr.MuxedAccount.keyTypeMuxedEd25519(new stellarSdk.xdr.MuxedAccountMed25519({id:stellarSdk.xdr.Uint64.fromString(e),ed25519:this.rawPublicKey()}))}return stellarSdk.xdr.MuxedAccount.keyTypeEd25519(this.rawPublicKey())}};});var q,je=c(()=>{b();Xe();We();q=class extends g{#e;constructor(e,t){super(e,t),this.#e=t??Promise.reject(new Error("metadataConfig is required"));}async initialize(){let e=`eddsa:${this.network}`,t=await this.clientShareProvider.get(e);t||(t=await this.rpcClient.call("eddsa","dkg"),await this.clientShareProvider.set(e,t));let[r,n]=await Promise.all([this.#e,this.rpcClient.call("eddsa","publicKey",t)]);if(!r.network.horizonUrl)throw new Error("Missing required horizonUrl in network config");let s=new G(this.rpcClient,t,n),o=stellarSdk.StrKey.encodeEd25519PublicKey(buffer.Buffer.from(n,"hex"));return new $(this.rpcClient,new stellarSdk.rpc.Server(r.network.rpcUrl),new stellarSdk.Horizon.Server(r.network.horizonUrl),s,o)}};});var Y={};X(Y,{StellarClient:()=>q});var z=c(()=>{je();});var g;exports.KeybanClient=void 0;var b=c(()=>{de();P();j();g=class{apiUrl;appId;network;apolloClient;clientShareProvider;metadataConfig;constructor(e,t){this.apiUrl=new URL(e.apiUrl??"https://api.prod.keyban.io"),this.appId=e.appId,this.network=e.network,this.clientShareProvider=e.clientShareProvider,this.clientShareProvider instanceof exports.KeybanClientShareProvider&&this.clientShareProvider.registerClient(this);let r={EthereumAnvil:"subql-ethereum-anvil.",PolygonAmoy:"subql-polygon-amoy.",StarknetDevnet:"subql-starknet-devnet.",StarknetSepolia:"subql-starknet-sepolia.",StarknetMainnet:"subql-starknet-mainnet.",StellarQuickstart:"subql-stellar-quickstart.",StellarTestnet:"subql-stellar-testnet.",StellarMainnet:"subql-stellar-mainnet."}[this.network];this.apolloClient=pe(new URL(this.apiUrl.origin.replace("api.",r)));let n=new URL("/v1/metadata",this.apiUrl);n.searchParams.set("network",this.network),this.metadataConfig=t??fetch(n).then(s=>s.json());}get rpcClient(){return A.getInstance(this)}get nativeCurrency(){return {EthereumAnvil:{decimals:18,name:"Ether",symbol:"ETH"},PolygonAmoy:{name:"POL",symbol:"POL",decimals:18},StarknetDevnet:{name:"Starknet Token",symbol:"STRK",decimals:18},StarknetSepolia:{name:"StarkNet Token",symbol:"STRK",decimals:18},StarknetMainnet:{name:"StarkNet Token",symbol:"STRK",decimals:18},StellarQuickstart:{name:"Lumen",symbol:"XLM",decimals:7},StellarTestnet:{name:"Lumen",symbol:"XLM",decimals:7},StellarMainnet:{name:"Lumen",symbol:"XLM",decimals:7}}[this.network]}get feesUnit(){return {EthereumAnvil:{symbol:"gwei",decimals:9},PolygonAmoy:{symbol:"gwei",decimals:9},StarknetDevnet:{symbol:"FRI",decimals:18},StarknetSepolia:{symbol:"FRI",decimals:18},StarknetMainnet:{symbol:"FRI",decimals:18},StellarQuickstart:{symbol:"stroop",decimals:7},StellarTestnet:{symbol:"stroop",decimals:7},StellarMainnet:{symbol:"stroop",decimals:7}}[this.network]}async apiStatus(){return fetch(new URL("/health/ready",this.apiUrl)).then(e=>e.ok?"operational":"down").catch(e=>(console.error("Failed to perform health check",e),"down"))}async isAuthenticated(){return this.rpcClient.call("auth","isAuthenticated")}async getUser(){return this.rpcClient.call("auth","getUser")}async passwordLogin(e){return this.rpcClient.call("auth","passwordLogin",e)}async passwordlessStart(e){return this.rpcClient.call("auth","passwordlessStart",e)}async passwordlessLogin(e){return this.rpcClient.call("auth","passwordlessLogin",e)}async login(e){let t=await this.rpcClient.call("auth","getLoginUrl",e),r=500,n=685,s=window.screenX+(window.innerWidth-r)/2,o=window.screenY+(window.innerHeight-n)/2,i=window.open(t,`keyban:auth:${this.appId}`,`left=${s},top=${o},width=${r},height=${n},popup,resizable,scrollbars`),p=new Promise(d=>{let u=w=>{w.origin===this.apiUrl.origin&&w.data==="keyban:auth:isAuthenticated"&&(window.removeEventListener("message",u),d());};window.addEventListener("message",u);});await new Promise(d=>{let u=setInterval(()=>{i?.closed&&(clearInterval(u),d());},100);}),await Promise.race([p,new Promise(d=>setTimeout(d,2e3))]);}async logout(){let e=await this.rpcClient.call("auth","getLogoutUrl",window.location.href),t=500,r=685,n=window.screenX+(window.innerWidth-t)/2,s=window.screenY+(window.innerHeight-r)/2,o=window.open(e,`keyban:auth:${this.appId}`,`left=${n},top=${s},width=${t},height=${r},popup,resizable,scrollbars`);await new Promise(i=>{let p=setInterval(()=>{o?.closed&&(clearInterval(p),i());},100);});}},exports.KeybanClient=class extends g{#e;#t=new Map;constructor(e){super(e),this.#e={EthereumAnvil:()=>Promise.resolve().then(()=>(re(),te)).then(({KeybanEvmClient:t})=>new t(e,this.metadataConfig)),PolygonAmoy:()=>Promise.resolve().then(()=>(re(),te)).then(({KeybanEvmClient:t})=>new t(e,this.metadataConfig)),StarknetDevnet:()=>Promise.resolve().then(()=>(V(),B)).then(({StarknetClient:t})=>new t(e,this.metadataConfig)),StarknetSepolia:()=>Promise.resolve().then(()=>(V(),B)).then(({StarknetClient:t})=>new t(e,this.metadataConfig)),StarknetMainnet:()=>Promise.resolve().then(()=>(V(),B)).then(({StarknetClient:t})=>new t(e,this.metadataConfig)),StellarQuickstart:()=>Promise.resolve().then(()=>(z(),Y)).then(({StellarClient:t})=>new t(e,this.metadataConfig)),StellarTestnet:()=>Promise.resolve().then(()=>(z(),Y)).then(({StellarClient:t})=>new t(e,this.metadataConfig)),StellarMainnet:()=>Promise.resolve().then(()=>(z(),Y)).then(({StellarClient:t})=>new t(e,this.metadataConfig))}[this.network]();}async initialize(){let e="WHATEVER",t=this.#t.get(e);if(t)return t;let r=this.#e.then(n=>n.initialize());return this.#t.set(e,r),r.catch(()=>{}).finally(()=>this.#t.delete(e)),r}};});exports.KeybanClientShareProvider=void 0;var Je=c(()=>{j();exports.KeybanClientShareProvider=class{#e;registerClient(e){this.#e=e;}get#t(){return A.getInstance(this.#e)}async get(e){return this.#t.call("clientShareStorage","get",e)}async set(e,t){return this.#t.call("clientShareStorage","set",e,t)}};});function hs(l,e,t){let r=e.decimals,n=e.symbol;e.isFees?(r=l.feesUnit.decimals,n=l.feesUnit.symbol):e.isNative?(r=l.nativeCurrency.decimals,n=l.nativeCurrency.symbol):t&&(r=t.decimals??void 0,n=t.symbol??void 0),r=r??0;let s=viem.formatUnits(typeof e.raw=="bigint"?e.raw:BigInt(e.raw),r);return n?`${s} ${n}`:s}var Qe=c(()=>{});var Ze=c(()=>{Qe();});var P=c(()=>{le();b();Je();K();ee();Ze();});P(); exports.formatBalance=hs;//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map