UNPKG

@windoge98/pnp-okx

Version:

OKX multi-chain wallet adapter for Plug-n-Play

2 lines (1 loc) 9.6 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@windoge98/plug-n-play"),t=require("@solana/wallet-adapter-base"),n=require("@dfinity/agent"),r=require("@dfinity/identity"),i=require("bs58"),a=({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),r=e.Text,i=e.Variant({Ok:r,Err:e.Text}),a=e.Variant({Ok:n,Err:e.Text}),o=e.Vec(e.Nat8),s=o,M=e.Nat64,c=e.Record({pubkey:o,targets:e.Opt(e.Vec(e.Principal)),expiration:M}),l=e.Record({signature:e.Vec(e.Nat8),delegation:c}),d=e.Variant({Ok:l,Err:e.Text}),u=e.Text,g=e.Text,w=o,y=e.Record({user_canister_pubkey:w,expiration:M}),N=e.Variant({Ok:y,Err:e.Text}),j=e.Record({uri:e.Text,issued_at:e.Nat64,domain:e.Text,statement:e.Text,version:e.Nat32,chain_id:e.Text,address:r,nonce:e.Text,expiration_time:e.Nat64}),I=e.Variant({Ok:j,Err:e.Text});return e.Service({get_address:e.Func([n],[i],["query"]),get_caller_address:e.Func([],[i],["query"]),get_principal:e.Func([r],[a],["query"]),siws_get_delegation:e.Func([r,s,M],[d],["query"]),siws_login:e.Func([u,r,s,g],[N],[]),siws_prepare_login:e.Func([r],[I],[])})};class o extends e.BaseSiwxAdapter{constructor(e){super({...e,adapter:{...e.adapter,id:"okxSolana",walletName:"OKX Wallet (Solana)"}}),this.solanaAddress=null,this.identity=null,this.sessionKey=null}async connect(){const t=window;if(!t.okxwallet?.solana)throw new Error("OKX Wallet Solana provider not available");try{const n=(await t.okxwallet.solana.connect()).publicKey.toBase58();this.solanaAddress=n;const{identity:r,sessionKey:i}=await this.performSiwsLogin(n,t.okxwallet.solana);this.identity=r,this.sessionKey=i;const a=r.getPrincipal();return this.setState(e.Adapter.Status.CONNECTED),{owner:a.toText(),subaccount:e.deriveAccountId(a)}}catch(n){throw this.setState(e.Adapter.Status.ERROR),n}}async performSiwsLogin(t,n){const a=await this.createSiwsProviderActor(),o=await a.siws_prepare_login(t);if("Err"in o)throw new Error(`SIWS Prepare Login failed: ${o.Err}`);const s=e.formatSiwsMessage(o.Ok),M=(new TextEncoder).encode(s);let c;try{if("function"==typeof n.signMessage){const e=await n.signMessage(M,"utf8");if(e?.signature)c="string"==typeof e.signature?i.decode(e.signature):new Uint8Array(e.signature);else if(e instanceof Uint8Array)c=e;else{if(!Array.isArray(e))throw new Error("Unexpected signature format from OKX wallet");c=new Uint8Array(e)}}else if("function"==typeof n.sign){const e=await n.sign(M,"utf8");c="string"==typeof e?i.decode(e):new Uint8Array(e)}else{if("function"!=typeof n.request)throw new Error("OKX wallet provider does not support any known message signing method");{const e=await n.request({method:"signMessage",params:[i.encode(M),"utf8"]});c="string"==typeof e?i.decode(e):new Uint8Array(e)}}}catch(y){throw new Error(`Failed to sign message with OKX wallet: ${y}`)}const l=i.encode(c),d=r.Ed25519KeyIdentity.generate(),u=d.getPublicKey().toDer(),g=await a.siws_login(l,t,new Uint8Array(u),o.Ok.nonce);if("Err"in g)throw new Error(`SIWS Login failed: ${g.Err}`);const w=await a.siws_get_delegation(t,new Uint8Array(u),g.Ok.expiration);if("Err"in w)throw new Error(`SIWS Get Delegation failed: ${w.Err}`);return{identity:this.createDelegationIdentity(w.Ok,d,new Uint8Array(g.Ok.user_canister_pubkey).buffer),sessionKey:d}}async createSiwsProviderActor(e){const t=e??new n.AnonymousIdentity;return this.createProviderActor(a,t)}async isConnected(){return null!==this.identity&&!this.identity.getPrincipal().isAnonymous()}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:"mainnet"},icp:{address:t?.toText(),subaccount:t?e.deriveAccountId(t):void 0}}}async disconnectInternal(){const e=window;if(e.okxwallet?.solana)try{await e.okxwallet.solana.disconnect()}catch{}this.solanaAddress=null,await super.disconnectInternal()}createActorInternal(e,t,n){if((n?.requiresSigning??!0)&&!this.identity)throw new Error("Cannot create signed actor: Not connected");const r=this.buildHttpAgentSync({identity:this.identity??void 0});return this.createActorWithAgent(r,e,t)}async onStorageRestored(e,t){}async onClearStoredSession(){this.solanaAddress=null}}class s extends e.BaseMultiChainAdapter{constructor(e){super({...e,config:{...e.config,supportedNetworks:e.config.supportedNetworks||["solana"]}}),this.networkAdapters=new Map}async connect(){try{return await super.connect()}catch(e){if(e?.message?.includes("SIWS provider")){throw new Error("OKX Wallet connection failed: Please ensure siwsProviderCanisterId is configured in your PNP config")}throw e}}async detectNetwork(){const e=window;if(!e.okxwallet)throw new Error("OKX Wallet is not installed. Please install OKX Wallet browser extension.");if(!e.okxwallet.solana)throw new Error("OKX Wallet Solana provider not available. Please ensure OKX Wallet is properly installed.");return{network:"solana",isTestnet:!1}}async getNetworkAdapter(e){const n=this.networkAdapters.get(e.network);if(n)return n;if("solana"===e.network){const n=new o({adapter:{...this.adapter,chain:"SOL"},config:{...this.config,solanaNetwork:this.config?.solanaNetwork||t.WalletAdapterNetwork.Mainnet,siwsProviderCanisterId:this.config?.siwsProviderCanisterId,providerCanisterId:this.config?.siwsProviderCanisterId},logger:this.logger});return this.networkAdapters.set(e.network,n),n}throw new Error(`OKX wallet adapter only supports Solana network. Current network: ${e.network}`)}async switchNetwork(e){const t=window;if(!t.okxwallet)throw new Error("OKX Wallet not available");if(!["ethereum","bsc","polygon","optimism","arbitrum","avalanche","fantom"].includes(e))throw new Error(`Network switching to ${e} must be done manually in OKX Wallet`);{const r={ethereum:"0x1",bsc:"0x38",polygon:"0x89",optimism:"0xa",arbitrum:"0xa4b1",avalanche:"0xa86a",fantom:"0xfa"}[e];if(!r)throw new Error(`Unknown chain ID for network: ${e}`);try{await t.okxwallet.request({method:"wallet_switchEthereumChain",params:[{chainId:r}]})}catch(n){if(4902===n.code)throw new Error(`Please add ${e} network to OKX Wallet manually`);throw n}}}}const M=e.createAdapterExtension({okx:{id:"okx",enabled:!1,walletName:"OKX Wallet",logo:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOCIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTI0LjA0MDkgMTQuNzAxOUgyOC44OTI1QzI5LjE3NzEgMTQuNzAxOSAyOS40MDc1IDE0LjkzMjMgMjkuNDA3NSAxNS4yMTY5VjIwLjA2ODRDMjkuNDA3NSAyMC4zNTMgMjkuMTc3MSAyMC41ODM0IDI4Ljg5MjUgMjAuNTgzNEgyNC4wNDA5QzIzLjc1NjMgMjAuNTgzNCAyMy41MjU5IDIwLjM1MyAyMy41MjU5IDIwLjA2ODRWMTUuMjE2OUMyMy41MjU5IDE0LjkzMjMgMjMuNzU2MyAxNC43MDE5IDI0LjA0MDkgMTQuNzAxOVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik0xMC4xMDcxIDE0LjcwMTlIMTQuOTU4N0MxNS4yNDMzIDE0LjcwMTkgMTUuNDczNyAxNC45MzIzIDE1LjQ3MzcgMTUuMjE2OVYyMC4wNjg0QzE1LjQ3MzcgMjAuMzUzIDE1LjI0MzMgMjAuNTgzNCAxNC45NTg3IDIwLjU4MzRIMTAuMTA3MUM5LjgyMjUgMjAuNTgzNCA5LjU5MjEgMjAuMzUzIDkuNTkyMSAyMC4wNjg0VjE1LjIxNjlDOS41OTIxIDE0LjkzMjMgOS44MjI1IDE0LjcwMTkgMTAuMTA3MSAxNC43MDE5WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTI0LjA0MDkgNS41SDI4Ljg5MjVDMjkuMTc3MSA1LjUgMjkuNDA3NSA1LjczMDQgMjkuNDA3NSA2LjAxNVYxMC44NjY1QzI5LjQwNzUgMTEuMTUxMSAyOS4xNzcxIDExLjM4MTUgMjguODkyNSAxMS4zODE1SDI0LjA0MDlDMjMuNzU2MyAxMS4zODE1IDIzLjUyNTkgMTEuMTUxMSAyMy41MjU5IDEwLjg2NjVWNi4wMTVDMjMuNTI1OSA1LjczMDQgMjMuNzU2MyA1LjUgMjQuMDQwOSA1LjVaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTAuMTA3MSA1LjVIMTQuOTU4N0MxNS4yNDMzIDUuNSAxNS40NzM3IDUuNzMwNCAxNS40NzM3IDYuMDE1VjEwLjg2NjVDMTUuNDczNyAxMS4xNTExIDE1LjI0MzMgMTEuMzgxNSAxNC45NTg3IDExLjM4MTVIMTAuMTA3MUM5LjgyMjUgMTEuMzgxNSA5LjU5MjEgMTEuMTUxMSA5LjU5MjEgMTAuODY2NVY2LjAxNUM5LjU5MjEgNS43MzA0IDkuODIyNSA1LjUgMTAuMTA3MSA1LjVaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjQuMDQwOSAyMy45MDM3SDI4Ljg5MjVDMjkuMTc3MSAyMy45MDM3IDI5LjQwNzUgMjQuMTM0MSAyOS40MDc1IDI0LjQxODdWMjkuMjcwM0MyOS40MDc1IDI5LjU1NDkgMjkuMTc3MSAyOS43ODUzIDI4Ljg5MjUgMjkuNzg1M0gyNC4wNDA5QzIzLjc1NjMgMjkuNzg1MyAyMy41MjU5IDI5LjU1NDkgMjMuNTI1OSAyOS4yNzAzVjI0LjQxODdDMjMuNTI1OSAyNC4xMzQxIDIzLjc1NjMgMjMuOTAzNyAyNC4wNDA5IDIzLjkwMzdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMTAuMTA3MSAyMy45MDM3SDE0Ljk1ODdDMTUuMjQzMyAyMy45MDM3IDE1LjQ3MzcgMjQuMTM0MSAxNS40NzM3IDI0LjQxODdWMjkuMjcwM0MxNS40NzM3IDI5LjU1NDkgMTUuMjQzMyAyOS43ODUzIDE0Ljk1ODcgMjkuNzg1M0gxMC4xMDcxQzkuODIyNSAyOS43ODUzIDkuNTkyMSAyOS41NTQ5IDkuNTkyMSAyOS4yNzAzVjI0LjQxODdDOS41OTIxIDI0LjEzNDEgOS44MjI1IDIzLjkwMzcgMTAuMTA3MSAyMy45MDM3WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTE3LjA3NCAxNC43MDE5SDIxLjkyNTVDMjIuMjEwMSAxNC43MDE5IDIyLjQ0MDUgMTQuOTMyMyAyMi40NDA1IDE1LjIxNjlWMjAuMDY4NEMyMi40NDA1IDIwLjM1MyAyMi4yMTAxIDIwLjU4MzQgMjEuOTI1NSAyMC41ODM0SDE3LjA3NEMxNi43ODk0IDIwLjU4MzQgMTYuNTU5IDIwLjM1MyAxNi41NTkgMjAuMDY4NFYxNS4yMTY5QzE2LjU1OSAxNC45MzIzIDE2Ljc4OTQgMTQuNzAxOSAxNy4wNzQgMTQuNzAxOVoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==",website:"https://www.okx.com/web3",chain:"SOL",adapter:s,config:{enabled:!1,supportedNetworks:["solana"],solanaNetwork:t.WalletAdapterNetwork.Mainnet,siwsProviderCanisterId:""}}});exports.OkxExtension=M,exports.OkxMultiChainAdapter=s;