diff --git a/package.json b/package.json index aded964e..08c20a26 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,13 @@ }, "dependencies": { "@chenfengyuan/vue-countdown": "2", - "@cosmjs/tendermint-rpc": "^0.32.2", - "cosmjs-types": "^0.9.0", - "@cosmjs/stargate": "^0.32.2", "@cosmjs/crypto": "^0.32.2", "@cosmjs/encoding": "^0.32.2", + "@cosmjs/stargate": "^0.32.2", + "@cosmjs/tendermint-rpc": "^0.32.2", "@iconify/vue": "^4.1.0", + "@injectivelabs/core-proto-ts": "^0.0.21", + "@injectivelabs/ts-types": "^1.14.5", "@intlify/unplugin-vue-i18n": "^0.8.2", "@leapwallet/cosmos-snap-provider": "^0.1.20", "@leapwallet/name-matcha": "^1.1.0", @@ -33,6 +34,7 @@ "axios": "^1.3.2", "buffer": "^6.0.3", "build": "^0.1.4", + "cosmjs-types": "^0.9.0", "cross-fetch": "^3.1.5", "daisyui": "^3.1.0", "dayjs": "^1.11.7", diff --git a/src/components/ProposalListItem.vue b/src/components/ProposalListItem.vue index e354d970..1e823065 100644 --- a/src/components/ProposalListItem.vue +++ b/src/components/ProposalListItem.vue @@ -10,6 +10,7 @@ import type { PaginatedProposals } from '@/types'; import ProposalProcess from './ProposalProcess.vue'; import type { PropType } from 'vue'; import { computed, ref } from 'vue'; +import { fromTimestamp } from 'cosmjs-types/helpers'; import type { QueryProposalsResponse } from 'cosmjs-types/cosmos/gov/v1beta1/query'; const dialog = useTxDialog(); defineProps({ @@ -118,7 +119,7 @@ function metaItem(metadata: string | undefined): { > {{ format.toDay( - Number(item.votingEndTime.seconds) * 1000, + fromTimestamp(item.votingEndTime.seconds), 'from' ) }} @@ -189,9 +190,7 @@ function metaItem(metadata: string | undefined): {
| + | {{ String(k).replaceAll('_', ' ') }} |
-
+
+
diff --git a/src/components/dynamic/index.ts b/src/components/dynamic/index.ts
index 5d228dd0..3b39a53f 100644
--- a/src/components/dynamic/index.ts
+++ b/src/components/dynamic/index.ts
@@ -1,3 +1,6 @@
+import * as injProto from '@injectivelabs/core-proto-ts';
+import { MsgType } from '@injectivelabs/ts-types';
+
import ObjectElement from './ObjectElement.vue';
import TextElement from './TextElement.vue';
import ArrayElement from './ArrayElement.vue';
@@ -11,6 +14,7 @@ export function select(v: any, direct?: string) {
// if(k === 'txs' && v) {
// return TxsElement
// } else {
+
const type = typeof v;
switch (type) {
case 'object':
@@ -31,7 +35,9 @@ function selectObject(v: Object, direct?: string) {
return UInt8Array;
case Array.isArray(v):
return ArrayElement;
- case v && Object.keys(v).includes('amount') && Object.keys(v).includes('denom'): {
+ case v &&
+ Object.keys(v).includes('amount') &&
+ Object.keys(v).includes('denom'): {
return TokenElement;
}
case direct === 'horizontal':
@@ -40,3 +46,33 @@ function selectObject(v: Object, direct?: string) {
return ObjectElement;
}
}
+
+const typeMap = Object.fromEntries(
+ Object.entries(MsgType).map(([k, v]) => ['/' + v, k])
+);
+
+type TxType = keyof typeof MsgType;
+
+const findType = (obj: any, type: string): any => {
+ if (typeof obj !== 'object') return;
+ const msg = obj[type];
+ if (msg && msg.decode) return msg;
+ for (const subObj of Object.values(obj)) {
+ const find = findType(subObj, type);
+ if (find) return find;
+ }
+};
+
+export const decodeProto = (msg: { typeUrl: string; value: Uint8Array }) => {
+ const type = typeMap[msg.typeUrl];
+ if (type) {
+ const obj = findType(injProto, type);
+ if (obj) {
+ const res = obj.decode(msg.value);
+ if (res.msgs) {
+ res.msgs = res.msgs.map(decodeProto);
+ }
+ return res;
+ }
+ }
+};
diff --git a/src/modules/[chain]/block/[height].vue b/src/modules/[chain]/block/[height].vue
index 362a1654..96530fc1 100644
--- a/src/modules/[chain]/block/[height].vue
+++ b/src/modules/[chain]/block/[height].vue
@@ -25,7 +25,10 @@ const isFutureBlock = computed({
get: () => {
const latest = store.latest?.block?.header.height
const isFuture = latest ? target.value > Number(latest) : true
- if (!isFuture && !current.value.blockId) store.fetchBlock(target.value).then(x => current.value = x)
+ if (!isFuture && !current.value.blockId) store.fetchBlock(target.value).then(x => {
+ current.value = x;
+ console.log('fetchBlock',x.block.txs);
+ })
return isFuture
},
set: val => {
@@ -56,7 +59,10 @@ function updateTarget() {
onBeforeRouteUpdate(async (to, from, next) => {
if (from.path !== to.path) {
- store.fetchBlock(String(to.params.height)).then(x => current.value = x);
+ store.fetchBlock(String(to.params.height)).then(x => {
+ current.value = x;
+ console.log('fetchBlock',x.block.txs);
+ });
next();
}
});
diff --git a/src/modules/[chain]/ibc/connStore.ts b/src/modules/[chain]/ibc/connStore.ts
index ad8f6c36..221519fe 100644
--- a/src/modules/[chain]/ibc/connStore.ts
+++ b/src/modules/[chain]/ibc/connStore.ts
@@ -50,6 +50,7 @@ export const useIBCModule = defineStore('module-ibc', {
load() {
const client = new ChainRegistryClient();
client.fetchIBCPaths().then((res) => {
+ console.log('fetchIBCPaths', res);
this.paths = res;
});
},
diff --git a/src/modules/[chain]/staking/[validator].vue b/src/modules/[chain]/staking/[validator].vue
index 91a5a062..9db24034 100644
--- a/src/modules/[chain]/staking/[validator].vue
+++ b/src/modules/[chain]/staking/[validator].vue
@@ -26,6 +26,7 @@ import PaginationBar from '@/components/PaginationBar.vue';
import { fromBase64, toBase64 } from '@cosmjs/encoding';
import { stringToUint8Array, uint8ArrayToString } from '@/libs/utils';
import type { TxSearchResponse } from '@cosmjs/tendermint-rpc';
+import { fromTimestamp } from 'cosmjs-types/helpers';
import type {
DelegationResponse,
Validator,
@@ -513,14 +514,12 @@ function mapDelegators(messages: any[]) {
{{ text }}
+
+
+
+
+
+ - {{ - format.toDay(Number(v.unbondingTime.seconds) * 1000, 'from') - }} + {{ format.toDay(fromTimestamp(v.unbondingTime), 'from') }}-{{ $t('staking.unbonding_time') }} diff --git a/src/modules/[chain]/tx/[hash].vue b/src/modules/[chain]/tx/[hash].vue index f7a6272c..4e2835af 100644 --- a/src/modules/[chain]/tx/[hash].vue +++ b/src/modules/[chain]/tx/[hash].vue @@ -2,113 +2,132 @@ import { useBaseStore, useBlockchain, useFormatter } from '@/stores'; import DynamicComponent from '@/components/dynamic/DynamicComponent.vue'; import { computed, ref } from '@vue/reactivity'; -import type { Tx, TxResponse } from '@/types'; +import type { GetTxResponse } from 'cosmjs-types/cosmos/tx/v1beta1/service'; -import { JsonViewer } from "vue3-json-viewer" +import { JsonViewer } from 'vue3-json-viewer'; // if you used v1.0.5 or latster ,you should add import "vue3-json-viewer/dist/index.css" -import "vue3-json-viewer/dist/index.css"; +import 'vue3-json-viewer/dist/index.css'; const props = defineProps(['hash', 'chain']); const blockchain = useBlockchain(); const baseStore = useBaseStore(); const format = useFormatter(); -const tx = ref( - {} as { - tx: Tx; - tx_response: TxResponse; - } -); +const tx = ref({} as GetTxResponse); if (props.hash) { - blockchain.rpc.getTx(props.hash).then((x) => (tx.value = x)); + blockchain.rpc.getTx(props.hash).then((x) => (tx.value = x)); } const messages = computed(() => { - return tx.value.tx?.body?.messages || []; + return tx.value.tx?.body?.messages || []; }); -
-
-
-
- {{ $t('tx.title') }}-
-
-
-
-
- - {{ $t('account.messages') }}: ({{ messages.length }}) --
-
-
-
- {{ $t('tx.no_messages') }}
-
-
+ JSON-
+
diff --git a/yarn.lock b/yarn.lock
index c98eba4e..5c8f988e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1833,6 +1833,31 @@
dependencies:
"@iconify/types" "^2.0.0"
+"@injectivelabs/core-proto-ts@^0.0.21":
+ version "0.0.21"
+ resolved "https://registry.yarnpkg.com/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz#b52d4bee7556ce57c7c7e2c1ec7f6b920b4c2ffd"
+ integrity sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==
+ dependencies:
+ "@injectivelabs/grpc-web" "^0.0.1"
+ google-protobuf "^3.14.0"
+ protobufjs "^7.0.0"
+ rxjs "^7.4.0"
+
+"@injectivelabs/grpc-web@^0.0.1":
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/@injectivelabs/grpc-web/-/grpc-web-0.0.1.tgz#24c028f6db50e589e30505efd2077110c8b492ba"
+ integrity sha512-Pu5YgaZp+OvR5UWfqbrPdHer3+gDf+b5fQoY+t2VZx1IAVHX8bzbN9EreYTvTYtFeDpYRWM8P7app2u4EX5wTw==
+ dependencies:
+ browser-headers "^0.4.1"
+
+"@injectivelabs/ts-types@^1.14.5":
+ version "1.14.5"
+ resolved "https://registry.yarnpkg.com/@injectivelabs/ts-types/-/ts-types-1.14.5.tgz#e7ed5fa87052b0763908bd77b132775aa37a097c"
+ integrity sha512-dwmEJE90vMr1zkQhz5lX2280sBMe2GvAj98vOHoL2RLTo0OQkJZrirUHwsTkexJf7sFZIT2PlmLCfix9Ulcp5A==
+ dependencies:
+ link-module-alias "^1.2.0"
+ shx "^0.3.2"
+
"@intlify/bundle-utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@intlify/bundle-utils/-/bundle-utils-4.0.0.tgz#29c1d602c7e4e33b516581496a7c6740ed7e2585"
@@ -3013,6 +3038,11 @@ brorand@^1.1.0:
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+browser-headers@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02"
+ integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==
+
browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9:
version "4.21.10"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0"
@@ -4241,6 +4271,11 @@ good-listener@^1.2.2:
dependencies:
delegate "^3.1.2"
+google-protobuf@^3.14.0:
+ version "3.21.2"
+ resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4"
+ integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==
+
gopd@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
@@ -4870,6 +4905,13 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+link-module-alias@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/link-module-alias/-/link-module-alias-1.2.0.tgz#6a3b7b014cfe18b2759a1222fffce6a40fc120e4"
+ integrity sha512-ahPjXepbSVKbahTB6LxR//VHm8HPfI+QQygCH+E82spBY4HR5VPJTvlhKBc9F7muVxnS6C1rRfoPOXAbWO/fyw==
+ dependencies:
+ chalk "^2.4.1"
+
load-json-file@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
@@ -4929,7 +4971,7 @@ long@^4.0.0:
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
-long@^5.2.0, long@^5.2.1, long@^5.2.3:
+long@^5.0.0, long@^5.2.0, long@^5.2.1, long@^5.2.3:
version "5.2.3"
resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1"
integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==
@@ -5098,7 +5140,7 @@ minimist@1.2.6:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-minimist@^1.2.6:
+minimist@^1.2.3, minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -5809,6 +5851,24 @@ protobufjs@^6.11.3, protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3:
"@types/node" ">=13.7.0"
long "^4.0.0"
+protobufjs@^7.0.0:
+ version "7.2.6"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215"
+ integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/node" ">=13.7.0"
+ long "^5.0.0"
+
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
@@ -6034,6 +6094,13 @@ rxjs@^6.4.0:
dependencies:
tslib "^1.9.0"
+rxjs@^7.4.0:
+ version "7.8.1"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
+ integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
+ dependencies:
+ tslib "^2.1.0"
+
safe-array-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c"
@@ -6131,7 +6198,7 @@ shell-quote@^1.6.1:
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
-shelljs@0.8.5:
+shelljs@0.8.5, shelljs@^0.8.5:
version "0.8.5"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==
@@ -6140,6 +6207,14 @@ shelljs@0.8.5:
interpret "^1.0.0"
rechoir "^0.6.2"
+shx@^0.3.2:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02"
+ integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==
+ dependencies:
+ minimist "^1.2.3"
+ shelljs "^0.8.5"
+
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
@@ -6616,6 +6691,11 @@ tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+tslib@^2.1.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
+ integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+
type@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+
+
+ {{ $t('tx.title') }}+
+
+
+
+ + {{ $t('account.messages') }}: ({{ messages.length }}) ++
+
+
+
+ {{ $t('tx.no_messages') }}
+
+
+ JSON+ |