WalletManager.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. import WalletM from "../api/WalletM";
  2. import LoginM from "../mgr/LoginM";
  3. import Utils from "../utils/Utils";
  4. import { Web3Result } from "./Contract";
  5. import { Web3Networks } from "./Web3Networks";
  6. declare global {
  7. interface Window {
  8. ethers: any;
  9. PogAdapter: {
  10. create: (config: PogAdapterConfig) => any;
  11. };
  12. }
  13. interface PogAdapterConfig {
  14. logOpen: boolean;
  15. projectId: string;
  16. onAccountChange: (state: any, nameSpace: any) => void;
  17. onNetworkChange: (state: any) => void;
  18. onProvidersChange: (state: any) => void;
  19. customNetworks: any[];
  20. features: {
  21. email: false;
  22. socials: [];
  23. analytics: true;
  24. emailShowWallets: false; // default to true
  25. };
  26. defaultNetwork: any;
  27. metadata: {
  28. name: string;
  29. description: string;
  30. icons: string[];
  31. url: string;
  32. };
  33. themeMode: any;
  34. }
  35. }
  36. export interface WalletListener {
  37. onLoginSuccess(account: string, balance: number): void;
  38. OnWalletDisconnected(): void;
  39. }
  40. export class WalletManager {
  41. async signMessage(signFullMessage: string): Promise<any> {
  42. if (!this.evmProvider || !this.evmProvider.provider) {
  43. console.error("No EVM provider available");
  44. return null;
  45. }
  46. let signature = null;
  47. try {
  48. signature = await this.evmProvider.provider.request({
  49. method: "personal_sign",
  50. params: [signFullMessage, this.address],
  51. });
  52. if (!signature) {
  53. console.error("sign message error", "signature is null");
  54. return null;
  55. }
  56. } catch (error) {
  57. console.error("sign message error", error);
  58. return null;
  59. }
  60. console.warn("sign message signature", signature);
  61. return signature;
  62. }
  63. private static _ins: WalletManager = null!;
  64. public address: any;
  65. appKitProvider: any;
  66. private constructor() {}
  67. public static get ins(): WalletManager {
  68. return (WalletManager._ins ??= new WalletManager());
  69. }
  70. private walletListener: WalletListener = null!;
  71. // private projectId = "b56e18d47c72ab683b10814fe9495694";
  72. private projectId = "bdbdb3ba190e30b9a9800c501848c96f";
  73. public init(walletListener: WalletListener) {
  74. this.walletListener = walletListener;
  75. this.initAppKit();
  76. }
  77. private pogAdapter: any = null;
  78. private evmProvider: any = null;
  79. private signer: any = null;
  80. public getWeb3Result() {
  81. let web3Result = new Web3Result();
  82. web3Result.evmProvider = this.evmProvider;
  83. web3Result.signer = this.signer;
  84. web3Result.account = this.address;
  85. return web3Result;
  86. }
  87. public getSigner() {
  88. if (!this.evmProvider) {
  89. console.error("没有evmProvider");
  90. return null;
  91. }
  92. if (!this.signer) {
  93. console.error("没有signer");
  94. return null;
  95. }
  96. return this.signer;
  97. }
  98. public async isConnected() {
  99. if (!this.evmProvider) {
  100. return false;
  101. }
  102. if (!this.address) {
  103. return false;
  104. }
  105. try {
  106. await this.evmProvider.getBalance(this.address);
  107. return true;
  108. } catch (error) {
  109. return false;
  110. }
  111. }
  112. public async getBalance() {
  113. if (!this.evmProvider) {
  114. return 0;
  115. }
  116. if (!this.address) {
  117. return 0;
  118. }
  119. let balance = await this.evmProvider.getBalance(this.address);
  120. return await Web3Result.formatEther(balance);
  121. }
  122. private verifySignature(signature: string) {}
  123. private initAppKit() {
  124. let self = this;
  125. let config: PogAdapterConfig = {
  126. projectId: this.projectId,
  127. logOpen: true,
  128. onAccountChange: (state, nameSpace) => {
  129. console.log("onAccountChange", state, nameSpace);
  130. },
  131. onNetworkChange: (state) => {
  132. console.log("onNetworkChange", state);
  133. // this.displayBalance(state);
  134. },
  135. onProvidersChange: async (state) => {
  136. console.log("onProvidersChange", state);
  137. let provider = state["eip155"];
  138. if (provider) {
  139. this.appKitProvider = provider;
  140. let address = await this.initProvider();
  141. if (address) {
  142. this.onWalletConnected(address);
  143. }
  144. }
  145. },
  146. customNetworks: [Web3Networks.kaia, Web3Networks.base],
  147. features: {
  148. email: false,
  149. socials: [],
  150. analytics: true,
  151. emailShowWallets: false, // default to true
  152. },
  153. defaultNetwork: Web3Networks.kaia,
  154. metadata: {
  155. name: "Telgather Portal",
  156. description: "Telgather Portal",
  157. icons: ["https://portal.telgather.com/h/imgs/icon_tog.png"],
  158. // url: window.location.href,
  159. url: "https://portal.telgather.com",
  160. },
  161. themeMode: "light",
  162. };
  163. this.pogAdapter = window.PogAdapter.create(config);
  164. }
  165. async onWalletConnected(address: string) {
  166. this.walletListener.onLoginSuccess(address, 0);
  167. }
  168. // async displayBalance(state: any) {
  169. // await this.initProvider();
  170. // if (!this.evmProvider) {
  171. // return;
  172. // }
  173. // if (!this.signer) {
  174. // return;
  175. // }
  176. // if (!this.address) {
  177. // return;
  178. // }
  179. // try {
  180. // let balance = await this.evmProvider.getBalance(this.address);
  181. // console.log("balance", balance);
  182. // let balanceNumber = await Web3Result.formatEther(balance);
  183. // console.log("balanceNumber", balanceNumber);
  184. // this.walletListener.onLoginSuccess(this.address, balanceNumber);
  185. // } catch (error) {
  186. // console.error("error", error);
  187. // this.walletListener.OnWalletDisconnected();
  188. // }
  189. // }
  190. private async initProvider(): Promise<string | null> {
  191. if (!this.appKitProvider) {
  192. console.error("没有appKitProvider");
  193. return;
  194. }
  195. this.evmProvider = new window.ethers.providers.Web3Provider(
  196. this.appKitProvider
  197. );
  198. console.log("33333", await this.evmProvider.provider.enable());
  199. this.signer = await this.evmProvider.getSigner();
  200. this.address = await this.signer.getAddress();
  201. return this.address;
  202. // console.log("signer", this.signer);
  203. // console.log("evmProvider", this.evmProvider);
  204. // console.log("address", this.address);
  205. // console.warn("evm provider创建成功", this.address);
  206. }
  207. public open() {
  208. this.pogAdapter.open();
  209. }
  210. public disconnect() {
  211. this.pogAdapter.disconnect();
  212. }
  213. public async switchNetwork(network: any) {
  214. await this.pogAdapter.switchNetwork(network);
  215. console.log("switchNetwork", network);
  216. }
  217. }