@windoge98/pnp-solflare
Version:
Solflare Wallet adapter for PNP (Plug N Play)
2 lines (1 loc) • 8.72 kB
JavaScript
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@windoge98/plug-n-play"),t=require("@dfinity/agent"),n=require("@solana/wallet-adapter-solflare"),a=require("@solana/wallet-adapter-base"),i=require("@solana/web3.js"),r=require("@dfinity/identity"),s=require("bs58"),o=({IDL:e})=>{const t=e.Variant({IncludeUriInSeed:e.Null,DisablePrincipalToSolMapping:e.Null,DisableSolToPrincipalMapping:e.Null});e.Record({uri:e.Text,runtime_features:e.Opt(e.Vec(t)),domain:e.Text,statement:e.Opt(e.Text),scheme:e.Opt(e.Text),salt:e.Text,session_expires_in:e.Opt(e.Nat64),targets:e.Opt(e.Vec(e.Text)),chain_id:e.Opt(e.Text),sign_in_expires_in:e.Opt(e.Nat64)});const n=e.Vec(e.Nat8),a=e.Text,i=e.Variant({Ok:a,Err:e.Text}),r=e.Variant({Ok:n,Err:e.Text}),s=e.Vec(e.Nat8),o=s,l=e.Nat64,c=e.Record({pubkey:s,targets:e.Opt(e.Vec(e.Principal)),expiration:l}),d=e.Record({signature:e.Vec(e.Nat8),delegation:c}),h=e.Variant({Ok:d,Err:e.Text}),p=e.Text,g=e.Text,u=s,w=e.Record({user_canister_pubkey:u,expiration:l}),f=e.Variant({Ok:w,Err:e.Text}),A=e.Record({uri:e.Text,issued_at:e.Nat64,domain:e.Text,statement:e.Text,version:e.Nat32,chain_id:e.Text,address:a,nonce:e.Text,expiration_time:e.Nat64}),S=e.Variant({Ok:A,Err:e.Text});return e.Service({get_address:e.Func([n],[i],["query"]),get_caller_address:e.Func([],[i],["query"]),get_principal:e.Func([a],[r],["query"]),siws_get_delegation:e.Func([a,o,l],[h],["query"]),siws_login:e.Func([p,a,o,g],[f],[]),siws_prepare_login:e.Func([a],[S],[])})};class l extends e.BaseSiwxAdapter{constructor(t){super(t),this.id="solflare",this.solanaAdapter=null,this.solanaAddress=null,this.connectingPromise=null,this.handleSolanaConnect=e=>{this.logger.debug("Solflare connected to Solana")},this.handleSolanaDisconnect=()=>{this.logger.debug("Solflare disconnected from Solana"),this.setState(e.Adapter.Status.DISCONNECTED)},this.handleSolanaError=t=>{this.logger.error("Solflare error:",t),this.setState(e.Adapter.Status.ERROR)},this.solanaConnection=this.initializeConnection(),this.initializeSolanaAdapter(),this.setState(e.Adapter.Status.READY)}initializeConnection(){const e=this.config.solanaNetwork||a.WalletAdapterNetwork.Mainnet,t=this.config.rpcEndpoint||(e===a.WalletAdapterNetwork.Mainnet?"https://api.mainnet-beta.solana.com":"https://api.devnet.solana.com");return new i.Connection(t)}initializeSolanaAdapter(){const e=this.config.solanaNetwork||a.WalletAdapterNetwork.Mainnet;this.solanaAdapter=new n.SolflareWalletAdapter({network:e}),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.Adapter.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:n,sessionKey:a}=await this.performSiwsLogin(t,this.solanaAdapter);this.identity=n,this.sessionKey=a,await this.storage.set(`${this.id}-solana-address`,t);const i=n.getPrincipal();return this.setState(e.Adapter.Status.CONNECTED),{owner:i.toText(),subaccount:e.deriveAccountId(i)}}catch(t){throw this.setState(e.Adapter.Status.ERROR),this.logger.error("Failed to connect Solflare:",t),t}}async performSiwsLogin(t,n){const a=await this.createSiwsProviderActor(),i=await a.siws_prepare_login(t);if("Err"in i)throw new Error(`SIWS Prepare Login failed: ${i.Err}`);const o=e.formatSiwsMessage(i.Ok),l=(new TextEncoder).encode(o);if(!n.signMessage)throw new Error("Solflare wallet does not support message signing");const c=await n.signMessage(l),d=s.encode(c),h=r.Ed25519KeyIdentity.generate(),p=h.getPublicKey().toDer(),g=await a.siws_login(d,t,new Uint8Array(p),i.Ok.nonce);if("Err"in g)throw new Error(`SIWS Login failed: ${g.Err}`);const u=await a.siws_get_delegation(t,new Uint8Array(p),g.Ok.expiration);if("Err"in u)throw new Error(`SIWS Get Delegation failed: ${u.Err}`);return{identity:this.createDelegationIdentity(u.Ok,h,new Uint8Array(g.Ok.user_canister_pubkey).buffer),sessionKey:h}}async createSiwsProviderActor(e){const n=e??new t.AnonymousIdentity;return this.createProviderActor(o,n)}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 e.deriveAccountId(t)}async getAddresses(){const t=this.identity?.getPrincipal();return{sol:{address:this.solanaAddress,network:this.config.solanaNetwork===a.WalletAdapterNetwork.Devnet?"devnet":"mainnet"},icp:{address:t?.toText(),subaccount:t?e.deriveAccountId(t):void 0}}}async disconnectInternal(){if(this.solanaAdapter)try{await this.solanaAdapter.disconnect()}catch(e){this.logger.warn("Error disconnecting Solflare:",e)}this.solanaAddress=null,await this.storage.remove(`${this.id}-solana-address`),await super.disconnectInternal()}createActorInternal(e,t,n){if((n?.requiresSigning??!0)&&!this.identity)throw new Error("Cannot create signed actor: Not connected");const a=this.buildHttpAgentSync({identity:this.identity??void 0});return this.createActorWithAgent(a,e,t)}async onStorageRestored(e,t){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 c=e.createAdapterExtension({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:l,config:{enabled:!1,solanaNetwork:a.WalletAdapterNetwork.Mainnet,siwsProviderCanisterId:""}}});Object.defineProperty(exports,"formatSiwsMessage",{enumerable:!0,get:()=>e.formatSiwsMessage}),exports.SolflareAdapter=l,exports.SolflareExtension=c;