@instadapp/avocado-base 0.0.0-dev.c8c43bc → 0.0.0-dev.cfde212
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abi/forwarder.json +1253 -149
- package/app.vue +20 -0
- package/assets/images/icons/arrow-left.svg +5 -0
- package/assets/images/icons/arrow-right.svg +5 -0
- package/assets/images/icons/avocado.svg +4 -0
- package/assets/images/icons/bridge-2.svg +3 -0
- package/assets/images/icons/bridge.svg +7 -0
- package/assets/images/icons/calendar.svg +8 -0
- package/assets/images/icons/check-circle.svg +4 -0
- package/assets/images/icons/chevron-down.svg +4 -0
- package/assets/images/icons/clipboard.svg +7 -0
- package/assets/images/icons/clock-circle.svg +5 -0
- package/assets/images/icons/copy.svg +5 -0
- package/assets/images/icons/error-circle.svg +6 -0
- package/assets/images/icons/exclamation-circle.svg +13 -0
- package/assets/images/icons/exclamation-octagon.svg +13 -0
- package/assets/images/icons/exclamation-triangle.svg +5 -0
- package/assets/images/icons/external-link.svg +6 -0
- package/assets/images/icons/eye.svg +4 -0
- package/assets/images/icons/flowers.svg +8 -0
- package/assets/images/icons/gas-emoji.svg +193 -0
- package/assets/images/icons/gas.svg +7 -0
- package/assets/images/icons/gift.svg +153 -0
- package/assets/images/icons/globe.svg +110 -0
- package/assets/images/icons/hamburger.svg +6 -0
- package/assets/images/icons/logout.svg +3 -0
- package/assets/images/icons/moon.svg +3 -0
- package/assets/images/icons/network.svg +13 -0
- package/assets/images/icons/options.svg +5 -0
- package/assets/images/icons/plus.svg +5 -0
- package/assets/images/icons/power-off-bg.svg +24 -0
- package/assets/images/icons/power-off.svg +19 -0
- package/assets/images/icons/power-on.svg +19 -0
- package/assets/images/icons/qr.svg +20 -0
- package/assets/images/icons/question-circle.svg +14 -0
- package/assets/images/icons/refresh.svg +6 -0
- package/assets/images/icons/search.svg +12 -0
- package/assets/images/icons/sun.svg +3 -0
- package/assets/images/icons/wave.svg +214 -0
- package/assets/images/icons/x.svg +5 -0
- package/components/ActionMetadata.vue +73 -0
- package/components/ChainLogo.vue +141 -1
- package/components/metadata/Bridge.vue +39 -0
- package/components/metadata/CrossTransfer.vue +67 -0
- package/components/metadata/GasTopup.vue +33 -0
- package/components/metadata/Permit2.vue +37 -0
- package/components/metadata/Swap.vue +67 -0
- package/components/metadata/Transfer.vue +46 -0
- package/components.d.ts +13 -0
- package/contracts/Forwarder.ts +856 -2
- package/contracts/factories/Forwarder__factory.ts +816 -16
- package/nuxt.config.ts +18 -2
- package/package.json +7 -3
- package/server/utils/index.ts +2 -0
- package/utils/avocado.ts +2 -0
- package/utils/bignumber.ts +51 -0
- package/utils/formatter.ts +94 -0
- package/utils/helper.ts +33 -0
- package/utils/metadata.ts +317 -124
- package/utils/network.ts +130 -67
- package/utils/services.ts +14 -0
- package/utils/utils.d.ts +66 -16
- package/utils/index.ts +0 -93
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
|
|
3
|
+
const props = defineProps<{
|
|
4
|
+
metadata: {
|
|
5
|
+
type: MetadataTypes
|
|
6
|
+
[key: string]: any
|
|
7
|
+
};
|
|
8
|
+
chain_id: number | string;
|
|
9
|
+
compact?: boolean;
|
|
10
|
+
}>();
|
|
11
|
+
|
|
12
|
+
provide('compact', props.compact);
|
|
13
|
+
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<div>
|
|
18
|
+
<MetadataTransfer v-if="metadata.type === 'transfer'" :metadata="metadata" :chain_id="chain_id" />
|
|
19
|
+
<MetadataCrossTransfer v-if="metadata.type === 'cross-transfer'" :metadata="metadata" :chain_id="chain_id" />
|
|
20
|
+
<MetadataGasTopup v-if="metadata.type === 'gas-topup'" :metadata="metadata" :chain_id="chain_id" />
|
|
21
|
+
<MetadataSwap v-if="metadata.type === 'swap'" :metadata="metadata" :chain_id="chain_id" />
|
|
22
|
+
<MetadataBridge v-if="metadata.type === 'bridge'" :metadata="metadata" :chain_id="chain_id" />
|
|
23
|
+
<MetadataPermit2 v-if="metadata.type === 'permit2'" :metadata="metadata" :chain_id="chain_id" />
|
|
24
|
+
|
|
25
|
+
<div v-if="metadata.type === 'upgrade'" class="self-start">
|
|
26
|
+
Wallet upgraded to {{ metadata?.version }}
|
|
27
|
+
</div>
|
|
28
|
+
<div v-if="metadata.type === 'dapp'" class="self-start flex items-center gap-2 text-primary">
|
|
29
|
+
<a :href="metadata?.url" target="_blank" rel="noopener noreferrer">{{
|
|
30
|
+
metadata?.name
|
|
31
|
+
}}</a>
|
|
32
|
+
<SvgoExternalLink />
|
|
33
|
+
</div>
|
|
34
|
+
<div v-if="metadata.type === 'deploy'" class="self-start capitalize">
|
|
35
|
+
{{ metadata?.type }}
|
|
36
|
+
</div>
|
|
37
|
+
<div v-if="metadata.type === 'auth'" class="self-start capitalize flex gap-3">
|
|
38
|
+
Authority {{ metadata.remove ? 'Removed' : 'Added' }}:
|
|
39
|
+
<a
|
|
40
|
+
class="text-primary break-all"
|
|
41
|
+
:href="getExplorerUrl(metadata.chainId, `/address/${metadata.address}`)"
|
|
42
|
+
target="_blank"
|
|
43
|
+
>
|
|
44
|
+
{{ shortenHash(metadata.address) }}
|
|
45
|
+
</a>
|
|
46
|
+
<div class="flex gap-3">
|
|
47
|
+
<ChainLogo class="w-5 h-5" :chain="metadata.chainId"/>
|
|
48
|
+
{{ chainIdToName(metadata.chainId) }}
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
<div v-if="metadata.type === 'instadapp-pro'" class="self-start capitalize flex gap-3">
|
|
52
|
+
Instadapp Pro |
|
|
53
|
+
{{ metadata?.castDetails }}
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<div v-if="metadata.type === 'add-signers' || metadata.type === 'remove-signers'" class="text-left w-fit" v-tippy="formatMultipleAddresses(metadata.addresses, false)" >
|
|
57
|
+
{{ formatMultipleAddresses(metadata.addresses) }}
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div v-if="metadata.type === 'change-threshold'" class="text-left w-fit" >
|
|
61
|
+
Change Threshold to {{ metadata.count }}
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<div v-tippy="{
|
|
65
|
+
content: metadata.id,
|
|
66
|
+
maxWidth: 'none',
|
|
67
|
+
interactive: true,
|
|
68
|
+
}"
|
|
69
|
+
v-if="metadata.type === 'rejection'" class="text-left w-fit">
|
|
70
|
+
{{ shortenHash(metadata.id) }}
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</template>
|
package/components/ChainLogo.vue
CHANGED
|
@@ -380,6 +380,146 @@
|
|
|
380
380
|
</defs>
|
|
381
381
|
</svg>
|
|
382
382
|
|
|
383
|
+
<svg
|
|
384
|
+
v-else-if="chain == 1313161554"
|
|
385
|
+
width="24"
|
|
386
|
+
height="24"
|
|
387
|
+
viewBox="0 0 24 24"
|
|
388
|
+
fill="none"
|
|
389
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
390
|
+
>
|
|
391
|
+
<rect
|
|
392
|
+
x="1"
|
|
393
|
+
y="1"
|
|
394
|
+
width="22"
|
|
395
|
+
height="22"
|
|
396
|
+
rx="11"
|
|
397
|
+
:fill="generateID('aurora', true)"
|
|
398
|
+
/>
|
|
399
|
+
<path
|
|
400
|
+
d="M11.9961 7.26624C12.4182 7.26624 12.8014 7.505 12.9902 7.88257L16.1114 14.1291C16.3835 14.6788 16.1614 15.3451 15.6116 15.6172C15.4561 15.6949 15.2894 15.7338 15.1173 15.7338H8.87486C8.26395 15.7338 7.76411 15.234 7.76411 14.6233C7.76411 14.4511 7.80299 14.279 7.88074 14.1291L11.0019 7.88257C11.1908 7.49944 11.574 7.26069 11.9961 7.26624ZM11.9961 6.5C11.2852 6.5 10.6354 6.89978 10.3188 7.53831L7.19763 13.7848C6.73667 14.7121 7.10877 15.8337 8.03624 16.3001C8.29727 16.4278 8.58607 16.5 8.87486 16.5H15.1228C16.1558 16.5 17 15.6616 17 14.6288C17 14.3401 16.9334 14.0514 16.8001 13.7904L13.6733 7.53831C13.3567 6.89978 12.707 6.5 11.9961 6.5Z"
|
|
401
|
+
fill="white"
|
|
402
|
+
/>
|
|
403
|
+
<rect
|
|
404
|
+
x="1"
|
|
405
|
+
y="1"
|
|
406
|
+
width="22"
|
|
407
|
+
height="22"
|
|
408
|
+
rx="11"
|
|
409
|
+
stroke="black"
|
|
410
|
+
stroke-width="2"
|
|
411
|
+
v-if="stroke"
|
|
412
|
+
:class="strokeClass"
|
|
413
|
+
/>
|
|
414
|
+
<defs>
|
|
415
|
+
<linearGradient
|
|
416
|
+
:id="generateID('aurora')"
|
|
417
|
+
x1="12"
|
|
418
|
+
y1="2"
|
|
419
|
+
x2="12"
|
|
420
|
+
y2="22"
|
|
421
|
+
gradientUnits="userSpaceOnUse"
|
|
422
|
+
>
|
|
423
|
+
<stop stop-color="#8EEF6B" />
|
|
424
|
+
<stop offset="1" stop-color="#70D44B" />
|
|
425
|
+
</linearGradient>
|
|
426
|
+
</defs>
|
|
427
|
+
</svg>
|
|
428
|
+
|
|
429
|
+
<svg
|
|
430
|
+
v-else-if="chain == 250"
|
|
431
|
+
width="24"
|
|
432
|
+
height="24"
|
|
433
|
+
viewBox="0 0 24 24"
|
|
434
|
+
fill="none"
|
|
435
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
436
|
+
>
|
|
437
|
+
<rect
|
|
438
|
+
x="1"
|
|
439
|
+
y="1"
|
|
440
|
+
width="22"
|
|
441
|
+
height="22"
|
|
442
|
+
rx="11"
|
|
443
|
+
:fill="generateID('fantom', true)"
|
|
444
|
+
/>
|
|
445
|
+
<path
|
|
446
|
+
fill-rule="evenodd"
|
|
447
|
+
clip-rule="evenodd"
|
|
448
|
+
d="M12.75 10.0625L15 8.75V11.375L12.75 10.0625ZM15 15.6875L12 17.4375L9 15.6875V12.625L12 14.375L15 12.625V15.6875ZM9 8.75L11.25 10.0625L9 11.375V8.75ZM12.375 10.6875L14.625 12L12.375 13.3125V10.6875ZM11.625 13.3125L9.375 12L11.625 10.6875V13.3125ZM14.625 8.125L12 9.625L9.375 8.125L12 6.5625L14.625 8.125ZM8.25 7.875V16.0625L12 18.1875L15.75 16.0625V7.875L12 5.75L8.25 7.875Z"
|
|
449
|
+
fill="white"
|
|
450
|
+
/>
|
|
451
|
+
<rect
|
|
452
|
+
x="1"
|
|
453
|
+
y="1"
|
|
454
|
+
width="22"
|
|
455
|
+
height="22"
|
|
456
|
+
rx="11"
|
|
457
|
+
stroke="black"
|
|
458
|
+
stroke-width="2"
|
|
459
|
+
v-if="stroke"
|
|
460
|
+
:class="strokeClass"
|
|
461
|
+
/>
|
|
462
|
+
<defs>
|
|
463
|
+
<linearGradient
|
|
464
|
+
:id="generateID('fantom')"
|
|
465
|
+
x1="12"
|
|
466
|
+
y1="2"
|
|
467
|
+
x2="12"
|
|
468
|
+
y2="22"
|
|
469
|
+
gradientUnits="userSpaceOnUse"
|
|
470
|
+
>
|
|
471
|
+
<stop stop-color="#51D3FF" />
|
|
472
|
+
<stop offset="1" stop-color="#13B5EC" />
|
|
473
|
+
</linearGradient>
|
|
474
|
+
</defs>
|
|
475
|
+
</svg>
|
|
476
|
+
|
|
477
|
+
<svg
|
|
478
|
+
v-else-if="chain == 634 || chain == 63400"
|
|
479
|
+
width="24"
|
|
480
|
+
height="24"
|
|
481
|
+
viewBox="0 0 24 24"
|
|
482
|
+
fill="none"
|
|
483
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
484
|
+
>
|
|
485
|
+
<rect
|
|
486
|
+
x="1"
|
|
487
|
+
y="1"
|
|
488
|
+
width="22"
|
|
489
|
+
height="22"
|
|
490
|
+
rx="11"
|
|
491
|
+
:fill="generateID('avo', true)"
|
|
492
|
+
/>
|
|
493
|
+
<path
|
|
494
|
+
d="M11.9999 17.4052C11.9999 17.7497 12.2787 18.0322 12.6197 17.997C15.6422 17.6854 18 15.1194 18 12C18 8.88061 15.6422 6.31462 12.6197 6.00299C12.2787 5.96765 11.9999 6.25038 11.9999 6.59486V8.25799C11.9999 8.60246 12.2806 8.87521 12.6167 8.94319C14.0353 9.2307 15.1035 10.4899 15.1035 12C15.1035 13.5101 14.0353 14.7693 12.6167 15.0569C12.2806 15.1248 11.9999 15.3978 11.9999 15.7421V17.4052ZM10.1378 7.12664C10.1378 6.70254 9.7247 6.4036 9.34642 6.59132C7.36369 7.57527 6 9.62756 6 12C6 14.3725 7.36369 16.4248 9.34642 17.4087C9.7247 17.5964 10.1378 17.2975 10.1378 16.8734V7.12685V7.12664Z"
|
|
495
|
+
fill="white"
|
|
496
|
+
/>
|
|
497
|
+
<rect
|
|
498
|
+
x="1"
|
|
499
|
+
y="1"
|
|
500
|
+
width="22"
|
|
501
|
+
height="22"
|
|
502
|
+
rx="11"
|
|
503
|
+
stroke="black"
|
|
504
|
+
stroke-width="2"
|
|
505
|
+
v-if="stroke"
|
|
506
|
+
:class="strokeClass"
|
|
507
|
+
/>
|
|
508
|
+
<defs>
|
|
509
|
+
<linearGradient
|
|
510
|
+
:id="generateID('avo')"
|
|
511
|
+
x1="12"
|
|
512
|
+
y1="2"
|
|
513
|
+
x2="12"
|
|
514
|
+
y2="22"
|
|
515
|
+
gradientUnits="userSpaceOnUse"
|
|
516
|
+
>
|
|
517
|
+
<stop stop-color="#6ED578" />
|
|
518
|
+
<stop offset="1" stop-color="#4CA054" />
|
|
519
|
+
</linearGradient>
|
|
520
|
+
</defs>
|
|
521
|
+
</svg>
|
|
522
|
+
|
|
383
523
|
<template v-else>
|
|
384
524
|
<svg
|
|
385
525
|
v-bind="$attrs"
|
|
@@ -416,7 +556,7 @@
|
|
|
416
556
|
|
|
417
557
|
<script lang="ts" setup>
|
|
418
558
|
defineProps<{
|
|
419
|
-
chain: ChainId;
|
|
559
|
+
chain: ChainId | number | string;
|
|
420
560
|
stroke?: boolean;
|
|
421
561
|
}>();
|
|
422
562
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
|
|
3
|
+
const props = defineProps<{
|
|
4
|
+
metadata: any;
|
|
5
|
+
chain_id: number | string
|
|
6
|
+
}>();
|
|
7
|
+
|
|
8
|
+
const compact = inject('compact');
|
|
9
|
+
|
|
10
|
+
const toToken = asyncComputed(() =>
|
|
11
|
+
fetchTokenByAddress(props.metadata?.toToken, props.metadata?.toChainId)
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
const bridgeAmountFormatted = computed(() =>
|
|
15
|
+
formatDecimal(
|
|
16
|
+
fromWei(props.metadata?.amount, toToken?.value?.decimals).toFixed()
|
|
17
|
+
)
|
|
18
|
+
);
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<template>
|
|
22
|
+
<div v-if="!toToken" class="rounded-5 w-24 h-4 loading-box" />
|
|
23
|
+
<div
|
|
24
|
+
class="flex gap-5 items-center"
|
|
25
|
+
v-if="metadata.type === 'bridge' && toToken"
|
|
26
|
+
>
|
|
27
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
28
|
+
<span class="inline-flex gap-2.5 items-center">
|
|
29
|
+
<img width="20" height="20" class="w-5 h-5" :src="toToken.logo_url" />
|
|
30
|
+
{{ bridgeAmountFormatted }}
|
|
31
|
+
<span class="uppercase">{{ toToken?.symbol }}</span>
|
|
32
|
+
<SvgoBridge class="text-slate-400 w-4 h-4" />
|
|
33
|
+
<span class="flex items-center gap-2.5">
|
|
34
|
+
<ChainLogo class="w-5" :chain="metadata.toChainId" />
|
|
35
|
+
<span>{{ chainIdToName(metadata.toChainId) }}</span>
|
|
36
|
+
</span>
|
|
37
|
+
</span>
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
|
|
3
|
+
const props = defineProps<{
|
|
4
|
+
metadata: any;
|
|
5
|
+
chain_id: number | string
|
|
6
|
+
}>();
|
|
7
|
+
|
|
8
|
+
const compact = inject('compact');
|
|
9
|
+
|
|
10
|
+
const fromToken = asyncComputed(() => {
|
|
11
|
+
if (!props?.chain_id) return null;
|
|
12
|
+
|
|
13
|
+
return fetchTokenByAddress(
|
|
14
|
+
props.metadata?.fromToken,
|
|
15
|
+
props?.chain_id
|
|
16
|
+
);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const formattedFromAmount = computed(() =>
|
|
20
|
+
formatDecimal(
|
|
21
|
+
fromWei(props.metadata?.amount, fromToken?.value?.decimals).toFixed()
|
|
22
|
+
)
|
|
23
|
+
);
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<template>
|
|
27
|
+
<div class="h-[60px]" v-if="!fromToken">
|
|
28
|
+
<div class="rounded-5 w-24 h-4 loading-box" />
|
|
29
|
+
</div>
|
|
30
|
+
<div class="flex gap-5 flex-col" v-else>
|
|
31
|
+
<div class="flex items-center gap-5">
|
|
32
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">Cross-chain send</span>
|
|
33
|
+
<span class="inline-flex gap-2.5 items-center">
|
|
34
|
+
<img width="20" height="20" class="w-5 h-5" :src="fromToken?.logo_url" />
|
|
35
|
+
{{ formattedFromAmount }}
|
|
36
|
+
<span class="uppercase">{{ fromToken?.symbol }}</span>
|
|
37
|
+
</span>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div class="flex items-center gap-2.5">
|
|
41
|
+
<span class="flex items-center gap-2.5">
|
|
42
|
+
<ChainLogo class="w-5" :chain="chain_id" />
|
|
43
|
+
<span>{{ chainIdToName(chain_id) }}</span>
|
|
44
|
+
</span>
|
|
45
|
+
|
|
46
|
+
<SvgoArrowRight class="w-4 h-4 text-slate-400" />
|
|
47
|
+
|
|
48
|
+
<span class="flex items-center gap-2.5">
|
|
49
|
+
<ChainLogo class="w-5" :chain="metadata?.toChainId" />
|
|
50
|
+
|
|
51
|
+
<a
|
|
52
|
+
target="_blank"
|
|
53
|
+
class="text-primary"
|
|
54
|
+
:href="
|
|
55
|
+
getExplorerUrl(
|
|
56
|
+
metadata?.toChainId,
|
|
57
|
+
`/address/${metadata.receiver}`
|
|
58
|
+
)
|
|
59
|
+
"
|
|
60
|
+
>{{ shortenHash(metadata.receiver) }}</a
|
|
61
|
+
>
|
|
62
|
+
on
|
|
63
|
+
<span>{{ chainIdToName(metadata?.toChainId) }}</span>
|
|
64
|
+
</span>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
</template>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
|
|
3
|
+
const props = defineProps<{
|
|
4
|
+
metadata: any;
|
|
5
|
+
chain_id: number | string
|
|
6
|
+
}>();
|
|
7
|
+
|
|
8
|
+
const token = asyncComputed(() =>
|
|
9
|
+
fetchTokenByAddress(props.metadata?.token, props?.chain_id)
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
const compact = inject('compact');
|
|
13
|
+
|
|
14
|
+
const formattedAmount = computed(() =>
|
|
15
|
+
formatDecimal(
|
|
16
|
+
fromWei(props.metadata?.amount, token?.value?.decimals).toFixed()
|
|
17
|
+
)
|
|
18
|
+
);
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<template>
|
|
22
|
+
<div v-if="!token" class="rounded-5 w-24 h-4 loading-box" />
|
|
23
|
+
<div class="flex items-center gap-5" v-else>
|
|
24
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
25
|
+
<span class="inline-flex gap-2.5 items-center">
|
|
26
|
+
<img width="20" height="20" class="w-5 h-5" :src="token?.logo_url" />
|
|
27
|
+
{{ formattedAmount }}
|
|
28
|
+
<span class="uppercase">{{ token?.symbol }}</span>
|
|
29
|
+
<SvgoGas class="w-4 h-4 text-slate-400 mx-2" />
|
|
30
|
+
<span>{{ shortenHash(metadata.onBehalf) }}</span>
|
|
31
|
+
</span>
|
|
32
|
+
</div>
|
|
33
|
+
</template>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
|
|
3
|
+
const props = defineProps<{
|
|
4
|
+
metadata: any;
|
|
5
|
+
chain_id: number | string
|
|
6
|
+
}>();
|
|
7
|
+
|
|
8
|
+
const token = asyncComputed(() =>
|
|
9
|
+
fetchTokenByAddress(props.metadata?.token, props?.chain_id)
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
const calculateDate = (timestamp: number) => {
|
|
13
|
+
return new Date(timestamp * 1000).toLocaleString();
|
|
14
|
+
};
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<template>
|
|
18
|
+
<div v-if="!token" class="rounded-5 w-24 h-4 loading-box" />
|
|
19
|
+
<div v-else class="inline-flex items-center gap-2 flex-wrap">
|
|
20
|
+
<span>Permit2 Allowance: </span>
|
|
21
|
+
<img width="20" height="20" class="w-5 h-5" :src="token?.logo_url" />
|
|
22
|
+
<span class="capitalize">{{ token?.symbol }}</span>
|
|
23
|
+
to
|
|
24
|
+
<NuxtLink
|
|
25
|
+
class="text-primary"
|
|
26
|
+
:href="
|
|
27
|
+
getExplorerUrl(chain_id, `/address/${metadata.spender}`)
|
|
28
|
+
"
|
|
29
|
+
target="_blank"
|
|
30
|
+
external
|
|
31
|
+
>
|
|
32
|
+
{{ shortenHash(metadata.spender) }}
|
|
33
|
+
</NuxtLink>
|
|
34
|
+
|
|
|
35
|
+
<span> Expiration date at {{ calculateDate(metadata?.expiration) }}</span>
|
|
36
|
+
</div>
|
|
37
|
+
</template>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
|
|
3
|
+
const props = defineProps<{
|
|
4
|
+
metadata: any;
|
|
5
|
+
chain_id: number | string
|
|
6
|
+
}>();
|
|
7
|
+
|
|
8
|
+
const compact = inject('compact');
|
|
9
|
+
|
|
10
|
+
const buyToken = asyncComputed(() =>
|
|
11
|
+
fetchTokenByAddress(props.metadata?.buyToken, props?.chain_id)
|
|
12
|
+
);
|
|
13
|
+
const sellToken = asyncComputed(() =>
|
|
14
|
+
fetchTokenByAddress(props.metadata?.sellToken, props?.chain_id)
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
const sellAmountFormatted = computed(() =>
|
|
18
|
+
formatDecimal(
|
|
19
|
+
fromWei(props.metadata?.sellAmount, sellToken?.value?.decimals).toFixed()
|
|
20
|
+
)
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const buyAmountFormatted = computed(() =>
|
|
24
|
+
formatDecimal(
|
|
25
|
+
fromWei(props.metadata?.buyAmount, buyToken?.value?.decimals).toFixed()
|
|
26
|
+
)
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const formatProtocol = (protocol: string) => {
|
|
30
|
+
return (
|
|
31
|
+
new Map([
|
|
32
|
+
["1inch-v5", "1inch"],
|
|
33
|
+
["0x-v1", "0x"],
|
|
34
|
+
["paraswap-v5", "Paraswap"],
|
|
35
|
+
["kyber-v1", "Kyber Network"],
|
|
36
|
+
]).get(protocol) || protocol
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<template>
|
|
44
|
+
<div v-if="!sellToken || !buyToken" class="rounded-5 w-24 h-4 loading-box" />
|
|
45
|
+
<div
|
|
46
|
+
class="flex items-center gap-5"
|
|
47
|
+
v-else
|
|
48
|
+
>
|
|
49
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
50
|
+
<span class="inline-flex gap-2.5 items-center">
|
|
51
|
+
<img width="20" height="20" class="w-5 h-5" :src="sellToken?.logo_url" />
|
|
52
|
+
{{ sellAmountFormatted }}
|
|
53
|
+
<span class="uppercase">{{ sellToken?.symbol }}</span>
|
|
54
|
+
<SvgoRefresh class="w-4 h-4 text-slate-400 mx-2" />
|
|
55
|
+
<img width="20" height="20" class="w-5 h-5" :src="buyToken?.logo_url" />
|
|
56
|
+
{{ buyAmountFormatted }}
|
|
57
|
+
<span class="uppercase">{{ buyToken?.symbol }}</span>
|
|
58
|
+
<span
|
|
59
|
+
class="capitalize hidden sm:flex items-center gap-2.5"
|
|
60
|
+
v-if="metadata.protocol && !compact"
|
|
61
|
+
>
|
|
62
|
+
On <ProtocolLogo class="w-5 h-5" :name="metadata.protocol" />
|
|
63
|
+
{{ formatProtocol(metadata.protocol) }}
|
|
64
|
+
</span>
|
|
65
|
+
</span>
|
|
66
|
+
</div>
|
|
67
|
+
</template>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
|
|
3
|
+
const props = defineProps<{
|
|
4
|
+
metadata: any;
|
|
5
|
+
chain_id: number | string
|
|
6
|
+
}>();
|
|
7
|
+
|
|
8
|
+
const compact = inject('compact');
|
|
9
|
+
|
|
10
|
+
const token = asyncComputed(() => {
|
|
11
|
+
if (!props?.chain_id) return null;
|
|
12
|
+
|
|
13
|
+
return fetchTokenByAddress(
|
|
14
|
+
props.metadata?.token,
|
|
15
|
+
props?.chain_id
|
|
16
|
+
);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const formattedAmount = computed(() =>
|
|
20
|
+
formatDecimal(
|
|
21
|
+
fromWei(props.metadata?.amount, token?.value?.decimals).toFixed()
|
|
22
|
+
)
|
|
23
|
+
);
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<template>
|
|
27
|
+
<div v-if="!token" class="rounded-5 w-24 h-4 loading-box" />
|
|
28
|
+
<div class="flex items-center gap-5" v-else>
|
|
29
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
30
|
+
<span class="inline-flex gap-2.5 items-center">
|
|
31
|
+
<img width="20" height="20" class="w-5 h-5" :src="token?.logo_url" />
|
|
32
|
+
{{ formattedAmount }}
|
|
33
|
+
<span class="uppercase">{{ token?.symbol }}</span>
|
|
34
|
+
<SvgoArrowRight class="w-4 h-4 text-slate-400 mx-2" />
|
|
35
|
+
<NuxtLink
|
|
36
|
+
class="text-primary"
|
|
37
|
+
target="_blank"
|
|
38
|
+
external
|
|
39
|
+
:to="
|
|
40
|
+
getExplorerUrl(chain_id, `/address/${metadata.receiver}`)
|
|
41
|
+
"
|
|
42
|
+
>{{ shortenHash(metadata.receiver) }}
|
|
43
|
+
</NuxtLink>
|
|
44
|
+
</span>
|
|
45
|
+
</div>
|
|
46
|
+
</template>
|
package/components.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/* prettier-ignore */
|
|
3
|
+
// @ts-nocheck
|
|
4
|
+
// Generated by unplugin-vue-components
|
|
5
|
+
// Read more: https://github.com/vuejs/core/pull/3399
|
|
6
|
+
export {}
|
|
7
|
+
|
|
8
|
+
declare module 'vue' {
|
|
9
|
+
export interface GlobalComponents {
|
|
10
|
+
RouterLink: typeof import('vue-router')['RouterLink']
|
|
11
|
+
RouterView: typeof import('vue-router')['RouterView']
|
|
12
|
+
}
|
|
13
|
+
}
|