UNPKG

@windoge98/pnp-solflare

Version:

Solflare Wallet adapter for PNP (Plug N Play)

2 lines (1 loc) 8.52 kB
import{BaseSiwxAdapter as t,Adapter as e,deriveAccountId as n,formatSiwsMessage as i,createAdapterExtension as a}from"@windoge98/plug-n-play";import{formatSiwsMessage as s}from"@windoge98/plug-n-play";import{AnonymousIdentity as r}from"@dfinity/agent";import{SolflareWalletAdapter as o}from"@solana/wallet-adapter-solflare";import{WalletAdapterNetwork as l}from"@solana/wallet-adapter-base";import{Connection as c}from"@solana/web3.js";import{Ed25519KeyIdentity as d}from"@dfinity/identity";import h from"bs58";const p=({IDL:t})=>{const e=t.Variant({IncludeUriInSeed:t.Null,DisablePrincipalToSolMapping:t.Null,DisableSolToPrincipalMapping:t.Null});t.Record({uri:t.Text,runtime_features:t.Opt(t.Vec(e)),domain:t.Text,statement:t.Opt(t.Text),scheme:t.Opt(t.Text),salt:t.Text,session_expires_in:t.Opt(t.Nat64),targets:t.Opt(t.Vec(t.Text)),chain_id:t.Opt(t.Text),sign_in_expires_in:t.Opt(t.Nat64)});const n=t.Vec(t.Nat8),i=t.Text,a=t.Variant({Ok:i,Err:t.Text}),s=t.Variant({Ok:n,Err:t.Text}),r=t.Vec(t.Nat8),o=r,l=t.Nat64,c=t.Record({pubkey:r,targets:t.Opt(t.Vec(t.Principal)),expiration:l}),d=t.Record({signature:t.Vec(t.Nat8),delegation:c}),h=t.Variant({Ok:d,Err:t.Text}),p=t.Text,g=t.Text,w=r,u=t.Record({user_canister_pubkey:w,expiration:l}),f=t.Variant({Ok:u,Err:t.Text}),S=t.Record({uri:t.Text,issued_at:t.Nat64,domain:t.Text,statement:t.Text,version:t.Nat32,chain_id:t.Text,address:i,nonce:t.Text,expiration_time:t.Nat64}),y=t.Variant({Ok:S,Err:t.Text});return t.Service({get_address:t.Func([n],[a],["query"]),get_caller_address:t.Func([],[a],["query"]),get_principal:t.Func([i],[s],["query"]),siws_get_delegation:t.Func([i,o,l],[h],["query"]),siws_login:t.Func([p,i,o,g],[f],[]),siws_prepare_login:t.Func([i],[y],[])})};class g extends t{constructor(t){super(t),this.id="solflare",this.solanaAdapter=null,this.solanaAddress=null,this.connectingPromise=null,this.handleSolanaConnect=t=>{this.logger.debug("Solflare connected to Solana")},this.handleSolanaDisconnect=()=>{this.logger.debug("Solflare disconnected from Solana"),this.setState(e.Status.DISCONNECTED)},this.handleSolanaError=t=>{this.logger.error("Solflare error:",t),this.setState(e.Status.ERROR)},this.solanaConnection=this.initializeConnection(),this.initializeSolanaAdapter(),this.setState(e.Status.READY)}initializeConnection(){const t=this.config.solanaNetwork||l.Mainnet,e=this.config.rpcEndpoint||(t===l.Mainnet?"https://api.mainnet-beta.solana.com":"https://api.devnet.solana.com");return new c(e)}initializeSolanaAdapter(){const t=this.config.solanaNetwork||l.Mainnet;this.solanaAdapter=new o({network:t}),this.setupWalletListeners()}setupWalletListeners(){this.solanaAdapter&&(this.solanaAdapter.on("connect",this.handleSolanaConnect),this.solanaAdapter.on("disconnect",this.handleSolanaDisconnect),this.solanaAdapter.on("error",this.handleSolanaError))}removeWalletListeners(){this.solanaAdapter&&(this.solanaAdapter.off("connect",this.handleSolanaConnect),this.solanaAdapter.off("disconnect",this.handleSolanaDisconnect),this.solanaAdapter.off("error",this.handleSolanaError))}async connect(){if(this.connectingPromise)return this.connectingPromise;this.connectingPromise=this.performConnect();try{return await this.connectingPromise}finally{this.connectingPromise=null}}async performConnect(){this.setState(e.Status.CONNECTING);try{if(!this.solanaAdapter)throw new Error("Solflare adapter not initialized");if(await this.solanaAdapter.connect(),!this.solanaAdapter.publicKey)throw new Error("Failed to get public key from Solflare");const t=this.solanaAdapter.publicKey.toBase58();this.solanaAddress=t;const{identity:i,sessionKey:a}=await this.performSiwsLogin(t,this.solanaAdapter);this.identity=i,this.sessionKey=a,await this.storage.set(`${this.id}-solana-address`,t);const s=i.getPrincipal();return this.setState(e.Status.CONNECTED),{owner:s.toText(),subaccount:n(s)}}catch(t){throw this.setState(e.Status.ERROR),this.logger.error("Failed to connect Solflare:",t),t}}async performSiwsLogin(t,e){const n=await this.createSiwsProviderActor(),a=await n.siws_prepare_login(t);if("Err"in a)throw new Error(`SIWS Prepare Login failed: ${a.Err}`);const s=i(a.Ok),r=(new TextEncoder).encode(s);if(!e.signMessage)throw new Error("Solflare wallet does not support message signing");const o=await e.signMessage(r),l=h.encode(o),c=d.generate(),p=c.getPublicKey().toDer(),g=await n.siws_login(l,t,new Uint8Array(p),a.Ok.nonce);if("Err"in g)throw new Error(`SIWS Login failed: ${g.Err}`);const w=await n.siws_get_delegation(t,new Uint8Array(p),g.Ok.expiration);if("Err"in w)throw new Error(`SIWS Get Delegation failed: ${w.Err}`);return{identity:this.createDelegationIdentity(w.Ok,c,new Uint8Array(g.Ok.user_canister_pubkey).buffer),sessionKey:c}}async createSiwsProviderActor(t){const e=t??new r;return this.createProviderActor(p,e)}async isConnected(){return null!==this.identity&&!this.identity.getPrincipal().isAnonymous()&&!0===this.solanaAdapter?.connected}async getPrincipal(){if(!this.identity)throw new Error("Not connected");return this.identity.getPrincipal().toText()}async getAccountId(){if(!this.identity)throw new Error("Not connected");const t=this.identity.getPrincipal();return n(t)}async getAddresses(){const t=this.identity?.getPrincipal();return{sol:{address:this.solanaAddress,network:this.config.solanaNetwork===l.Devnet?"devnet":"mainnet"},icp:{address:t?.toText(),subaccount:t?n(t):void 0}}}async disconnectInternal(){if(this.solanaAdapter)try{await this.solanaAdapter.disconnect()}catch(t){this.logger.warn("Error disconnecting Solflare:",t)}this.solanaAddress=null,await this.storage.remove(`${this.id}-solana-address`),await super.disconnectInternal()}createActorInternal(t,e,n){if((n?.requiresSigning??!0)&&!this.identity)throw new Error("Cannot create signed actor: Not connected");const i=this.buildHttpAgentSync({identity:this.identity??void 0});return this.createActorWithAgent(i,t,e)}async onStorageRestored(t,e){const n=await this.storage.get(`${this.id}-solana-address`);n&&"string"==typeof n&&(this.solanaAddress=n)}async onClearStoredSession(){this.solanaAddress=null,await this.storage.remove(`${this.id}-solana-address`)}destroy(){this.removeWalletListeners(),this.solanaAdapter&&(this.solanaAdapter.disconnect().catch(()=>{}),this.solanaAdapter=null)}}const w=a({solflare:{id:"solflare",enabled:!1,walletName:"Solflare",logo:"data:image/svg+xml,%3csvg%20width='290'%20height='290'%20viewBox='0%200%20290%20290'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_146_299)'%3e%3cpath%20d='M63.2951%201H226.705C261.11%201%20289%2028.8905%20289%2063.2951V226.705C289%20261.11%20261.11%20289%20226.705%20289H63.2951C28.8905%20289%201%20261.11%201%20226.705V63.2951C1%2028.8905%2028.8905%201%2063.2951%201Z'%20fill='%23FFEF46'%20stroke='%23EEDA0F'%20stroke-width='2'/%3e%3cpath%20d='M140.548%20153.231L154.832%20139.432L181.462%20148.147C198.893%20153.958%20207.609%20164.61%20207.609%20179.62C207.609%20190.999%20203.251%20198.504%20194.536%20208.188L191.873%20211.093L192.841%20204.314C196.714%20179.62%20189.452%20168.968%20165.484%20161.22L140.548%20153.231ZM104.717%2068.739L177.347%2092.9488L161.61%20107.959L123.843%2095.3698C110.77%2091.012%20106.412%2083.9911%20104.717%2069.2232V68.739ZM100.359%20191.725L116.822%20175.988L147.811%20186.157C164.031%20191.483%20169.599%20198.504%20167.905%20216.177L100.359%20191.725ZM79.539%20121.516C79.539%20116.917%2081.9599%20112.559%2086.0756%20108.927C90.4334%20115.222%2097.9384%20120.79%20109.801%20124.664L135.464%20133.137L121.18%20146.937L96.0016%20138.705C84.3809%20134.832%2079.539%20129.021%2079.539%20121.516ZM155.558%20248.618C208.819%20213.272%20237.387%20189.304%20237.387%20159.768C237.387%20140.158%20225.766%20129.263%20200.104%20120.79L180.736%20114.253L233.756%2063.4128L223.103%2052.0342L207.367%2065.8337L133.043%2041.3818C110.043%2048.8869%2080.9916%2070.9178%2080.9916%2092.9487C80.9916%2095.3697%2081.2337%2097.7907%2081.96%20100.454C62.8342%20111.348%2055.0871%20121.516%2055.0871%20134.105C55.0871%20145.968%2061.3816%20157.831%2081.4758%20164.368L97.4542%20169.694L42.2559%20222.713L52.9082%20234.092L70.0972%20218.356L155.558%20248.618Z'%20fill='%2302050A'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_146_299'%3e%3crect%20width='290'%20height='290'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e",website:"https://solflare.com",chain:"SOL",adapter:g,config:{enabled:!1,solanaNetwork:l.Mainnet,siwsProviderCanisterId:""}}});export{g as SolflareAdapter,w as SolflareExtension,s as formatSiwsMessage};