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 27.4 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'),M=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 M__namespace=/*#__PURE__*/_interopNamespace(M);var qe=Object.defineProperty;var i=(l,e)=>()=>(l&&(e=l(l=0)),e);var q=(l,e)=>{for(var t in e)qe(l,t,{get:e[t],enumerable:true});};exports.KeybanAccount=void 0;var ae=i(()=>{exports.KeybanAccount=class{rpcClient;constructor(e){this.rpcClient=e;}async tppClaim(e){return this.rpcClient.call("tpp","claim",e,this.address)}async loyaltySetup(){return Promise.resolve()}};});function ie(l,e){let t=context.setContext(async(o,{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()})),a=core.split(({query:o})=>{let p=utilities.getMainDefinition(o);return p.kind==="OperationDefinition"&&p.operation==="subscription"},s,r);return new core.ApolloClient({connectToDevTools:true,cache:new cache.InMemoryCache({typePolicies:{Query:{fields:{tokenBalances:utilities.relayStylePagination(["filter"]),nftBalances:utilities.relayStylePagination(["filter"]),assetTransfers:utilities.relayStylePagination(["filter"])}},Transaction:{fields:{date:{read(o){return o&&o+"Z"}}}}}}),link:core.ApolloLink.from([t,a])})}var oe=i(()=>{});exports.KeybanBaseError=void 0;var C=i(()=>{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:a}){super(s??t??e),this.type=e,this.title=t??e,this.instance=r,this.detail=s,this.status=a,this.timestamp=new Date().toISOString(),this.rootError=n;}};});var ce=i(()=>{C();});var le=i(()=>{C();});var pe=i(()=>{C();});exports.SdkErrorTypes=void 0;exports.SdkError=void 0;var me=i(()=>{C();exports.SdkErrorTypes=(m=>(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 "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 R=i(()=>{ce();le();pe();C();me();});var T,X=i(()=>{R();T=class l{#e;#t;static#r=new Map;static#n({apiUrl:e,appId:t,network:r}){let n=new URL("/signer-client/",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((a,o)=>{s.port1.onmessage=({data:[d,y]})=>(s.port1.close(),y!=null?o(new exports.KeybanBaseError(JSON.parse(y))):a(d));let p={__KEYBAN_RPC:true,service:e,method:t,params:r};n.contentWindow?.postMessage(p,this.#e.origin,[s.port2]);})}};});var he,K,ye=i(()=>{R();S();he=[{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",maxFeePerGas:r?.maxFeePerGas,maxPriorityFeePerGas:r?.maxPriorityFeePerGas}).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,gasCost:n}}}async transferERC20(e){let{contractAddress:t,to:r,value:n,txOptions: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(o=>{switch(true){case o.cause.cause instanceof viem.InsufficientFundsError:case o.cause.cause instanceof viem.EstimateGasExecutionError:throw new exports.SdkError(exports.SdkError.types.InsufficientFunds,"KeybanAccount.transferERC20");default:throw o.cause}})}async estimateERC20Transfer(e){let{contractAddress:t,to:r,value:n}=e,[{maxFeePerGas:s,maxPriorityFeePerGas:a},o]=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*o,details:{maxFeePerGas:s,maxPriorityFeePerGas:a,gasCost:o}}}async transferNft(e){let{contractAddress:t,tokenId:r,to:n,value:s,standard:a,txOptions:o}=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(a==="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,txOptions:o})}if(a==="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,txOptions:o})}throw new exports.SdkError(exports.SdkError.types.InvalidNftStandard,"KeybanAccount.transferNft")}async#r({contractAddress:e,tokenId:t,to:r,txOptions:n}){let s=viem.getContract({address:e,abi:viem.erc721Abi,client:{public:this.#e,wallet:this.#t}}),a=this.address;return s.write.transferFrom([a,r,t],n).catch(o=>{switch(true){case o.cause.cause instanceof viem.InsufficientFundsError:case o.cause.cause instanceof viem.EstimateGasExecutionError:throw new exports.SdkError(exports.SdkError.types.InsufficientFunds,"KeybanAccount.transferNft");default:throw o.cause}})}async#n({contractAddress:e,tokenId:t,value:r,to:n,txOptions:s}){let a=viem.getContract({address:e,abi:he,client:{public:this.#e,wallet:this.#t}}),o=this.address;return a.write.safeTransferFrom([o,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:a}=e;if(t==="ERC1155")return this.#a({contractAddress:r,tokenId:n,to:s,value:a});if(t==="ERC721"){if(a!==void 0&&a!==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:a},o]=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*o,details:{maxFeePerGas:s,maxPriorityFeePerGas:a,gasCost:o}}}async#a({contractAddress:e,tokenId:t,to:r,value:n}){let s=this.address,[{maxFeePerGas:a,maxPriorityFeePerGas:o},p]=await Promise.all([this.#e.estimateFeesPerGas({type:"eip1559"}),this.#e.estimateContractGas({address:e,abi:he,functionName:"safeTransferFrom",args:[s,r,t,n,""],account:this.address})]);return {maxFees:a*p,details:{maxFeePerGas:a,maxPriorityFeePerGas:o,gasCost:p}}}};});exports.KeybanNetwork=void 0;var Z=i(()=>{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 k,fe=i(()=>{P();ye();Z();k=class extends g{#e;constructor(e,t){super(e,t);let r=this.metadataConfig.then(a=>viem.http(a.network.rpcUrl)),n={EthereumAnvil:M__namespace.anvil,PolygonAmoy:M__namespace.polygonAmoy,StarknetDevnet:null,StarknetSepolia:null,StarknetMainnet:null,StellarQuickstart:null,StellarTestnet:null,StellarMainnet:null}[this.network],s=r.then(a=>viem.createPublicClient({chain:n,transport:a}));this.#e={chain:n,transport:r,publicClient:s};}async initialize(){let e=await this.clientShareProvider.get("ecdsa");e||(e=await this.rpcClient.call("ecdsa","dkg"),await this.clientShareProvider.set("ecdsa",e));let t=await this.rpcClient.call("ecdsa","publicKey",e),r=accounts.toAccount({address:accounts.publicKeyToAddress(t),signMessage:async({message:a})=>{let o=viem.hashMessage(a,"hex");return this.rpcClient.call("ecdsa","sign",e,o)},signTransaction:async(a,o)=>{let p=o?.serializer??viem.serializeTransaction,d=a.type==="eip4844"?{...a,sidecars:false}:a,y=await this.rpcClient.call("ecdsa","sign",e,viem.keccak256(p(d))).then(viem.parseSignature);return p(a,y)},signTypedData:async a=>{let o=viem.hashTypedData(a);return this.rpcClient.call("ecdsa","sign",e,o)}});r.publicKey=t;let n=await this.#e.publicClient,s=viem.createWalletClient({chain:n.chain,transport:await this.#e.transport,account:r});return new K(this.rpcClient,n,s)}};});var ee={};q(ee,{KeybanEvmClient:()=>k});var te=i(()=>{fe();});var ge=i(()=>{});var Ee=i(()=>{});var Ce=i(()=>{});var Te=i(()=>{});var h,N,L,xe=i(()=>{h={V0:"0x0",V1:"0x1",V2:"0x2",V3:"0x3",F0:"0x100000000000000000000000000000000",F1:"0x100000000000000000000000000000001",F2:"0x100000000000000000000000000000002",F3:"0x100000000000000000000000000000003"},N={V0:h.V0,V1:h.V1,V2:h.V2,F0:h.F0,F1:h.F1,F2:h.F2},L={V3:h.V3,F3:h.F3};});var we=i(()=>{});var Ae=i(()=>{});var Se=i(()=>{ge();Ee();Ce();Te();xe();we();Ae();});var Pe=i(()=>{});var be=i(()=>{});var ve=i(()=>{});var Ie=i(()=>{});var Re=i(()=>{});var Ke=i(()=>{});var De=i(()=>{});var ke=i(()=>{Pe();be();ve();Ie();Re();Ke();De();});var re=i(()=>{Se();ke();});var F,Me=i(()=>{S();F=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")}};});function ft(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 _,Fe=i(()=>{re();_=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(ft)}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(N).includes(t.version)){let s=t;n=starknet.hash.calculateInvokeTransactionHash({...s,senderAddress:s.walletAddress,compiledCalldata:r,version:s.version});}else if(Object.values(L).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(N).includes(e.version)){let n=e;r=starknet.hash.calculateDeployAccountTransactionHash({...n,salt:n.addressSalt,constructorCalldata:t,version:n.version});}else if(Object.values(L).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(N).includes(e.version)){let r=e;t=starknet.hash.calculateDeclareTransactionHash({...r,version:r.version});}else if(Object.values(L).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 U,_e=i(()=>{re();P();Me();Fe();U=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=await this.clientShareProvider.get("ecdsa");e||(e=await this.rpcClient.call("ecdsa","dkg"),await this.clientShareProvider.set("ecdsa",e));let[t,r,n]=await Promise.all([this.#e,this.rpcClient.call("ecdsa","publicKey",e).then(o=>`0x${o.slice(4)}`),this.rpcClient.call("account","getAddress")]),s=new _(this.rpcClient,e,r),a=new starknet.Account(t,n,s,void 0,h.V3);return new F(this.rpcClient,a,r)}};});var O={};q(O,{StarknetClient:()=>U});var H=i(()=>{_e();});var Pt,Oe,B,He=i(()=>{S();Pt=25,Oe=7;bignumber_js.BigNumber.config({DECIMAL_PLACES:Oe});B=class extends exports.KeybanAccount{address;publicKey;#e;#t;constructor(e,t,r,n){super(e),this.#t=t,this.#e=r,this.address=n,this.publicKey=n;}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){let[r,n]=await Promise.all([this.#t.getAccount(this.address),this.#t.getNetwork()]),s=new stellarSdk.TransactionBuilder(r,{fee:stellarSdk.BASE_FEE,networkPassphrase:n.passphrase}).addOperation(stellarSdk.Operation.payment({destination:e,asset:stellarSdk.Asset.native(),amount:bignumber_js.BigNumber(t).dividedBy(10**Oe).toString()})).setTimeout(Pt).build(),a=await this.#e.signDecorated(s.hash());return s.addDecoratedSignature(a),this.#r(s)}estimateTransfer(e){throw new Error("estimateTransfer not implemented.")}transferERC20(e){throw new Error("transferERC20 not implemented.")}estimateERC20Transfer(e){throw new Error("estimateERC20Transfer not implemented.")}transferNft(e){throw new Error("transferNft not implemented.")}estimateNftTransfer(e){throw new Error("estimateNftTransfer not implemented.")}async#r(e){return this.#t.sendTransaction(e).then(async t=>{if(t.status!=="PENDING")throw t;return this.#t.pollTransaction(t.hash)}).then(t=>{switch(t.status){case stellarSdk.rpc.Api.GetTransactionStatus.FAILED:case stellarSdk.rpc.Api.GetTransactionStatus.NOT_FOUND:throw t;case stellarSdk.rpc.Api.GetTransactionStatus.SUCCESS:return t.txHash}})}async loyaltySetup(){try{if(await this.#t.getAccount(this.publicKey))return}catch{console.log("Stellar Account not yet setup for Loyalty, Doing it now...");}let e=await this.rpcClient.call("loyalty","initAccountSetup"),{passphrase:t}=await this.#t.getNetwork(),r=new stellarSdk.Transaction(e,t),n=await this.#e.signDecorated(r.hash());r.addDecoratedSignature(n),await this.rpcClient.call("loyalty","submitAccountSetup",r.toXDR());}};});var G,Be=i(()=>{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,a)=>s^r[a]),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 V,Ge=i(()=>{P();He();Be();V=class extends g{#e;constructor(e,t){super(e,t),this.#e=this.metadataConfig.then(r=>new stellarSdk.rpc.Server(r.network.rpcUrl));}async initialize(){let e=await this.clientShareProvider.get("eddsa");e||(e=await this.rpcClient.call("eddsa","dkg"),await this.clientShareProvider.set("eddsa",e));let[t,r]=await Promise.all([this.#e,this.rpcClient.call("eddsa","publicKey",e)]),n=new G(this.rpcClient,e,r),s=stellarSdk.StrKey.encodeEd25519PublicKey(buffer.Buffer.from(r,"hex"));return new B(this.rpcClient,t,n,s)}};});var $={};q($,{StellarClient:()=>V});var Y=i(()=>{Ge();});var g;exports.KeybanClient=void 0;var P=i(()=>{oe();S();X();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=ie(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 T.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,t){return this.rpcClient.call("auth","passwordLogin",e,t)}async passwordlessStart(e,t){return this.rpcClient.call("auth","passwordlessStart",e,t)}async passwordlessLogin(e,t,r){return this.rpcClient.call("auth","passwordlessLogin",e,t,r)}async login(e){let t=await this.rpcClient.call("auth","getLoginUrl",e),r=500,n=685,s=window.screenX+(window.innerWidth-r)/2,a=window.screenY+(window.innerHeight-n)/2,o=window.open(t,`keyban:auth:${this.appId}`,`left=${s},top=${a},width=${r},height=${n},popup,resizable,scrollbars`),p=new Promise(d=>{let y=m=>{m.origin===this.apiUrl.origin&&m.data==="keyban:auth:isAuthenticated"&&(window.removeEventListener("message",y),d());};window.addEventListener("message",y);});await new Promise(d=>{let y=setInterval(()=>{o?.closed&&(clearInterval(y),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,a=window.open(e,`keyban:auth:${this.appId}`,`left=${n},top=${s},width=${t},height=${r},popup,resizable,scrollbars`);await new Promise(o=>{let p=setInterval(()=>{a?.closed&&(clearInterval(p),o());},100);});}},exports.KeybanClient=class extends g{#e;#t=new Map;constructor(e){super(e),this.#e={EthereumAnvil:()=>Promise.resolve().then(()=>(te(),ee)).then(({KeybanEvmClient:t})=>new t(e,this.metadataConfig)),PolygonAmoy:()=>Promise.resolve().then(()=>(te(),ee)).then(({KeybanEvmClient:t})=>new t(e,this.metadataConfig)),StarknetDevnet:()=>Promise.resolve().then(()=>(H(),O)).then(({StarknetClient:t})=>new t(e,this.metadataConfig)),StarknetSepolia:()=>Promise.resolve().then(()=>(H(),O)).then(({StarknetClient:t})=>new t(e,this.metadataConfig)),StarknetMainnet:()=>Promise.resolve().then(()=>(H(),O)).then(({StarknetClient:t})=>new t(e,this.metadataConfig)),StellarQuickstart:()=>Promise.resolve().then(()=>(Y(),$)).then(({StellarClient:t})=>new t(e,this.metadataConfig)),StellarTestnet:()=>Promise.resolve().then(()=>(Y(),$)).then(({StellarClient:t})=>new t(e,this.metadataConfig)),StellarMainnet:()=>Promise.resolve().then(()=>(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 Ve=i(()=>{X();exports.KeybanClientShareProvider=class{#e;registerClient(e){this.#e=e;}get#t(){return T.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 ms(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 $e=i(()=>{});var Ye=i(()=>{$e();});var S=i(()=>{ae();P();Ve();R();Z();Ye();});S(); exports.formatBalance=ms;//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map