|
1 | 1 | import { defineStore } from 'pinia'; |
2 | 2 |
|
3 | 3 | import { useBlockchain } from '@/stores'; |
4 | | -import ChainRegistryClient from '@ping-pub/chain-registry-client'; |
5 | | -import type { IBCPath, IBCInfo } from '@ping-pub/chain-registry-client/dist/types'; |
6 | | -import type { Channel } from '@/types'; |
| 4 | +import { ChainRegistryClient } from '@chain-registry/client'; |
| 5 | +import type { IBCData } from '@chain-registry/types/ibc_data.schema'; |
7 | 6 | import router from '@/router'; |
| 7 | +import fetch from 'cross-fetch'; |
| 8 | + |
| 9 | +const IBC_USE_GITHUB_API = import.meta.env.VITE_IBC_USE_GITHUB_API === 'true'; |
| 10 | +const PINGPUB_API_URL = import.meta.env.VITE_PINGPUB_API_URL || 'https://registry.ping.pub'; |
| 11 | +const GITHUB_API_URL = |
| 12 | + import.meta.env.VITE_GITHUB_API_URL || 'https://api.github.com/repos/cosmos/chain-registry/contents'; |
| 13 | +const IBC_API_URL = IBC_USE_GITHUB_API ? GITHUB_API_URL : PINGPUB_API_URL; |
8 | 14 |
|
9 | 15 | export const useIBCModule = defineStore('module-ibc', { |
10 | 16 | state: () => { |
11 | 17 | return { |
12 | | - paths: [] as IBCPath[], |
| 18 | + info: [] as IBCData[], |
13 | 19 | connectionId: '' as string, |
14 | | - registryConf: {} as IBCInfo, |
| 20 | + registryConf: {} as IBCData, |
15 | 21 | }; |
16 | 22 | }, |
17 | 23 | getters: { |
18 | 24 | chain() { |
19 | 25 | return useBlockchain(); |
20 | 26 | }, |
21 | | - commonIBCs(): any { |
22 | | - return this.paths.filter( |
23 | | - (x: IBCPath) => x.path.search(this.chain.current?.prettyName || this.chain.chainName) > -1 |
| 27 | + chainName(): string { |
| 28 | + return this.chain.chainName; |
| 29 | + }, |
| 30 | + isFirstChain(): boolean { |
| 31 | + return ( |
| 32 | + this.registryConf.chain_1.chain_name === this.chain.current?.prettyName || |
| 33 | + this.registryConf.chain_1.chain_name === this.chain.chainName |
24 | 34 | ); |
25 | 35 | }, |
26 | 36 | sourceField(): string { |
27 | | - return this.registryConf?.chain_1?.chain_name === this.chain.current?.prettyName || this.chain.chainName |
28 | | - ? 'chain_1' |
29 | | - : 'chain_2'; |
| 37 | + return this.isFirstChain ? 'chain_1' : 'chain_2'; |
30 | 38 | }, |
31 | 39 | destField(): string { |
32 | | - return this.registryConf?.chain_1?.chain_name === this.chain.current?.prettyName || this.chain.chainName |
33 | | - ? 'chain_2' |
34 | | - : 'chain_1'; |
| 40 | + return this.isFirstChain ? 'chain_2' : 'chain_1'; |
35 | 41 | }, |
36 | 42 | registryChannels(): any { |
37 | 43 | return this.registryConf.channels; |
38 | 44 | }, |
39 | 45 | }, |
40 | 46 | actions: { |
41 | 47 | load() { |
42 | | - const client = new ChainRegistryClient(); |
43 | | - client.fetchIBCPaths().then((res) => { |
44 | | - this.paths = res; |
| 48 | + const prefix = this.chain.current?.networkType?.includes('testnet') ? 'testnets/' : ''; |
| 49 | + const client = new ChainRegistryClient({ |
| 50 | + chainNames: [this.chainName], |
| 51 | + baseUrl: IBC_USE_GITHUB_API ? undefined : new URL(`${prefix}`, PINGPUB_API_URL + '/').toString(), |
| 52 | + }); |
| 53 | + this.fetchIBCUrls().then((res) => { |
| 54 | + res.forEach((element: any) => { |
| 55 | + if (element.download_url) { |
| 56 | + client.urls.push(element.download_url); |
| 57 | + } |
| 58 | + }); |
| 59 | + client.fetchUrls().then(() => { |
| 60 | + const info = client.getChainIbcData(this.chainName); |
| 61 | + this.info = info.sort((a, b) => { |
| 62 | + // Sort by remote chain name (not equal to this.chainName) |
| 63 | + const getRemote = (x: any) => |
| 64 | + x?.chain_1?.chain_name === this.chain.current?.prettyName || |
| 65 | + x?.chain_1?.chain_name === this.chain.chainName |
| 66 | + ? x.chain_2.chain_name |
| 67 | + : x.chain_1.chain_name; |
| 68 | + return getRemote(a).localeCompare(getRemote(b)); |
| 69 | + }); |
| 70 | + }); |
45 | 71 | }); |
46 | 72 | }, |
47 | | - fetchConnection(path: string) { |
48 | | - const client = new ChainRegistryClient(); |
49 | | - client.fetchIBCPathInfo(path).then((res) => { |
50 | | - const isFirstChain = |
51 | | - res.chain_1.chain_name === this.chain.current?.prettyName || res.chain_1.chain_name === this.chain.chainName; |
52 | | - |
53 | | - const connId = isFirstChain ? res.chain_1.connection_id : res.chain_2.connection_id; |
| 73 | + async fetchIBCUrls(): Promise<any[]> { |
| 74 | + const prefix = this.chain.current?.networkType?.includes('testnet') ? 'testnets/' : ''; |
| 75 | + const ibcEndpoint = new URL(`${prefix}_IBC`, IBC_API_URL + '/').toString(); |
| 76 | + console.log('Fetching IBC URLs from:', IBC_API_URL); |
| 77 | + let entries = await fetch(ibcEndpoint) |
| 78 | + .then((res) => res.json()) |
| 79 | + .then((data: any) => (Array.isArray(data) ? data.filter((x: any) => x.name.match(this.chainName)) : [])); |
54 | 80 |
|
55 | | - this.registryConf = res; |
56 | | - this.showConnection(connId); |
57 | | - }); |
| 81 | + // If using PINGPUB_API_URL, add thedownload URLs |
| 82 | + if (IBC_API_URL == PINGPUB_API_URL) { |
| 83 | + return entries.map((entry: any) => { |
| 84 | + entry.download_url = new URL(`${prefix}_IBC/${entry.name}`, PINGPUB_API_URL + '/').toString(); |
| 85 | + return entry; |
| 86 | + }); |
| 87 | + } |
| 88 | + return entries; |
| 89 | + }, |
| 90 | + fetchConnection(index: number) { |
| 91 | + this.registryConf = this.info[index]; |
| 92 | + const connId = this.isFirstChain |
| 93 | + ? this.registryConf.chain_1.connection_id |
| 94 | + : this.registryConf.chain_2.connection_id; |
| 95 | + this.showConnection(connId); |
58 | 96 | }, |
59 | 97 | showConnection(connId?: string | number) { |
60 | 98 | if (!connId) { |
|
0 commit comments