@instadapp/avocado-base 0.0.34 → 0.0.36
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/components/ActionMetadata.vue +4 -1
- package/components/metadata/Bridge.vue +4 -2
- package/components/metadata/CrossTransfer.vue +3 -1
- package/components/metadata/GasTopup.vue +3 -1
- package/components/metadata/Swap.vue +3 -2
- package/components/metadata/Transfer.vue +8 -5
- package/package.json +1 -1
- package/utils/metadata.ts +192 -178
|
@@ -5,6 +5,8 @@ const props = defineProps<{
|
|
|
5
5
|
chain_id: number | string
|
|
6
6
|
}>();
|
|
7
7
|
|
|
8
|
+
const compact = inject('compact');
|
|
9
|
+
|
|
8
10
|
const toToken = asyncComputed(() =>
|
|
9
11
|
fetchTokenByAddress(props.metadata?.toToken, props.metadata?.toChainId)
|
|
10
12
|
);
|
|
@@ -22,12 +24,12 @@ const bridgeAmountFormatted = computed(() =>
|
|
|
22
24
|
class="flex gap-5 items-center"
|
|
23
25
|
v-if="metadata.type === 'bridge' && toToken"
|
|
24
26
|
>
|
|
25
|
-
<span class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
27
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
26
28
|
<span class="inline-flex gap-2.5 items-center">
|
|
27
29
|
<img width="20" height="20" class="w-5 h-5" :src="toToken.logo_url" />
|
|
28
30
|
{{ bridgeAmountFormatted }}
|
|
29
31
|
<span class="uppercase">{{ toToken?.symbol }}</span>
|
|
30
|
-
<SvgoBridge class="text-slate-400 w-
|
|
32
|
+
<SvgoBridge class="text-slate-400 w-4 h-4" />
|
|
31
33
|
<span class="flex items-center gap-2.5">
|
|
32
34
|
<ChainLogo class="w-5" :chain="metadata.toChainId" />
|
|
33
35
|
<span>{{ chainIdToName(metadata.toChainId) }}</span>
|
|
@@ -5,6 +5,8 @@ const props = defineProps<{
|
|
|
5
5
|
chain_id: number | string
|
|
6
6
|
}>();
|
|
7
7
|
|
|
8
|
+
const compact = inject('compact');
|
|
9
|
+
|
|
8
10
|
const fromToken = asyncComputed(() => {
|
|
9
11
|
if (!props?.chain_id) return null;
|
|
10
12
|
|
|
@@ -27,7 +29,7 @@ const formattedFromAmount = computed(() =>
|
|
|
27
29
|
</div>
|
|
28
30
|
<div class="flex gap-5 flex-col" v-else>
|
|
29
31
|
<div class="flex items-center gap-5">
|
|
30
|
-
<span class="capitalize text-xs sm:text-sm">Cross-chain send</span>
|
|
32
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">Cross-chain send</span>
|
|
31
33
|
<span class="inline-flex gap-2.5 items-center">
|
|
32
34
|
<img width="20" height="20" class="w-5 h-5" :src="fromToken?.logo_url" />
|
|
33
35
|
{{ formattedFromAmount }}
|
|
@@ -9,6 +9,8 @@ const token = asyncComputed(() =>
|
|
|
9
9
|
fetchTokenByAddress(props.metadata?.token, props?.chain_id)
|
|
10
10
|
);
|
|
11
11
|
|
|
12
|
+
const compact = inject('compact');
|
|
13
|
+
|
|
12
14
|
const formattedAmount = computed(() =>
|
|
13
15
|
formatDecimal(
|
|
14
16
|
fromWei(props.metadata?.amount, token?.value?.decimals).toFixed()
|
|
@@ -19,7 +21,7 @@ const formattedAmount = computed(() =>
|
|
|
19
21
|
<template>
|
|
20
22
|
<div v-if="!token" class="rounded-5 w-24 h-4 loading-box" />
|
|
21
23
|
<div class="flex items-center gap-5" v-else>
|
|
22
|
-
<span class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
24
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
23
25
|
<span class="inline-flex gap-2.5 items-center">
|
|
24
26
|
<img width="20" height="20" class="w-5 h-5" :src="token?.logo_url" />
|
|
25
27
|
{{ formattedAmount }}
|
|
@@ -5,6 +5,7 @@ const props = defineProps<{
|
|
|
5
5
|
chain_id: number | string
|
|
6
6
|
}>();
|
|
7
7
|
|
|
8
|
+
const compact = inject('compact');
|
|
8
9
|
|
|
9
10
|
const buyToken = asyncComputed(() =>
|
|
10
11
|
fetchTokenByAddress(props.metadata?.buyToken, props?.chain_id)
|
|
@@ -45,7 +46,7 @@ const formatProtocol = (protocol: string) => {
|
|
|
45
46
|
class="flex items-center gap-5"
|
|
46
47
|
v-else
|
|
47
48
|
>
|
|
48
|
-
<span class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
49
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
49
50
|
<span class="inline-flex gap-2.5 items-center">
|
|
50
51
|
<img width="20" height="20" class="w-5 h-5" :src="sellToken?.logo_url" />
|
|
51
52
|
{{ sellAmountFormatted }}
|
|
@@ -56,7 +57,7 @@ const formatProtocol = (protocol: string) => {
|
|
|
56
57
|
<span class="uppercase">{{ buyToken?.symbol }}</span>
|
|
57
58
|
<span
|
|
58
59
|
class="capitalize hidden sm:flex items-center gap-2.5"
|
|
59
|
-
v-if="metadata.protocol"
|
|
60
|
+
v-if="metadata.protocol && !compact"
|
|
60
61
|
>
|
|
61
62
|
On <ProtocolLogo class="w-5 h-5" :name="metadata.protocol" />
|
|
62
63
|
{{ formatProtocol(metadata.protocol) }}
|
|
@@ -5,6 +5,7 @@ const props = defineProps<{
|
|
|
5
5
|
chain_id: number | string
|
|
6
6
|
}>();
|
|
7
7
|
|
|
8
|
+
const compact = inject('compact');
|
|
8
9
|
|
|
9
10
|
const token = asyncComputed(() => {
|
|
10
11
|
if (!props?.chain_id) return null;
|
|
@@ -25,19 +26,21 @@ const formattedAmount = computed(() =>
|
|
|
25
26
|
<template>
|
|
26
27
|
<div v-if="!token" class="rounded-5 w-24 h-4 loading-box" />
|
|
27
28
|
<div class="flex items-center gap-5" v-else>
|
|
28
|
-
<span class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
29
|
+
<span v-if="!compact" class="capitalize text-xs sm:text-sm">{{ metadata.type }}</span>
|
|
29
30
|
<span class="inline-flex gap-2.5 items-center">
|
|
30
31
|
<img width="20" height="20" class="w-5 h-5" :src="token?.logo_url" />
|
|
31
32
|
{{ formattedAmount }}
|
|
32
33
|
<span class="uppercase">{{ token?.symbol }}</span>
|
|
33
34
|
<SvgoArrowRight class="w-4 h-4 text-slate-400 mx-2" />
|
|
34
|
-
<
|
|
35
|
+
<NuxtLink
|
|
35
36
|
class="text-primary"
|
|
36
|
-
|
|
37
|
+
target="_blank"
|
|
38
|
+
external
|
|
39
|
+
:to="
|
|
37
40
|
getExplorerUrl(chain_id, `/address/${metadata.receiver}`)
|
|
38
41
|
"
|
|
39
|
-
>{{ shortenHash(metadata.receiver) }}
|
|
40
|
-
|
|
42
|
+
>{{ shortenHash(metadata.receiver) }}
|
|
43
|
+
</NuxtLink>
|
|
41
44
|
</span>
|
|
42
45
|
</div>
|
|
43
46
|
</template>
|
package/package.json
CHANGED
package/utils/metadata.ts
CHANGED
|
@@ -242,191 +242,205 @@ export const encodeMultipleActions = (...actionData: string[]) => {
|
|
|
242
242
|
return ethers.utils.defaultAbiCoder.encode(multiMetadataTypes, [actionData]);
|
|
243
243
|
};
|
|
244
244
|
|
|
245
|
-
export const
|
|
245
|
+
export const decodeData = (data: string) => {
|
|
246
246
|
try {
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
if (
|
|
273
|
-
executeDataV3.params_.metadata === "0x" ||
|
|
274
|
-
!executeDataV3.params_.metadata
|
|
275
|
-
) {
|
|
276
|
-
return null;
|
|
277
|
-
} else {
|
|
278
|
-
metadata = executeDataV3.params_.metadata;
|
|
279
|
-
}
|
|
247
|
+
const metadata = getMetadataFromData(data) || "0x";
|
|
248
|
+
|
|
249
|
+
return parseMetadata(metadata);
|
|
250
|
+
} catch (e) {
|
|
251
|
+
// console.log(e);
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
export const decodeMetadata = (metadata: string) => {
|
|
257
|
+
try {
|
|
258
|
+
return parseMetadata(metadata);
|
|
259
|
+
} catch (e) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
const getMetadataFromData = (data: string) => {
|
|
265
|
+
const iface = Forwarder__factory.createInterface();
|
|
266
|
+
let metadata = "0x";
|
|
267
|
+
|
|
268
|
+
if (data.startsWith("0x18e7f485")) {
|
|
269
|
+
const executeData = iface.decodeFunctionData("execute", data);
|
|
270
|
+
if (executeData.metadata_ === "0x" || !executeData.metadata_) {
|
|
271
|
+
return null;
|
|
280
272
|
} else {
|
|
281
|
-
|
|
282
|
-
"executeMultisigV3",
|
|
283
|
-
data
|
|
284
|
-
);
|
|
285
|
-
if (
|
|
286
|
-
executeDataMultisigV3.params_.metadata === "0x" ||
|
|
287
|
-
!executeDataMultisigV3.params_.metadata
|
|
288
|
-
) {
|
|
289
|
-
return null;
|
|
290
|
-
} else {
|
|
291
|
-
metadata = executeDataMultisigV3.params_.metadata;
|
|
292
|
-
}
|
|
273
|
+
metadata = executeData.metadata_;
|
|
293
274
|
}
|
|
275
|
+
} else if (data.startsWith("0x14f80a8d")) {
|
|
276
|
+
const executeDataV2 = iface.decodeFunctionData("executeV2", data);
|
|
277
|
+
if (
|
|
278
|
+
executeDataV2.params_.metadata === "0x" ||
|
|
279
|
+
!executeDataV2.params_.metadata
|
|
280
|
+
) {
|
|
281
|
+
return null;
|
|
282
|
+
} else {
|
|
283
|
+
metadata = executeDataV2.params_.metadata;
|
|
284
|
+
}
|
|
285
|
+
} else if (data.startsWith("0x85114d53")) {
|
|
286
|
+
const executeDataV3 = iface.decodeFunctionData("executeV3", data);
|
|
287
|
+
if (
|
|
288
|
+
executeDataV3.params_.metadata === "0x" ||
|
|
289
|
+
!executeDataV3.params_.metadata
|
|
290
|
+
) {
|
|
291
|
+
return null;
|
|
292
|
+
} else {
|
|
293
|
+
metadata = executeDataV3.params_.metadata;
|
|
294
|
+
}
|
|
295
|
+
} else {
|
|
296
|
+
const executeDataMultisigV3 = iface.decodeFunctionData(
|
|
297
|
+
"executeMultisigV3",
|
|
298
|
+
data
|
|
299
|
+
);
|
|
300
|
+
if (
|
|
301
|
+
executeDataMultisigV3.params_.metadata === "0x" ||
|
|
302
|
+
!executeDataMultisigV3.params_.metadata
|
|
303
|
+
) {
|
|
304
|
+
return null;
|
|
305
|
+
} else {
|
|
306
|
+
metadata = executeDataMultisigV3.params_.metadata;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
294
309
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
310
|
+
return metadata;
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
const parseMetadata = (metadata: string) => {
|
|
314
|
+
const metadataArr = [];
|
|
315
|
+
let payload = {};
|
|
316
|
+
|
|
317
|
+
const [decodedMultiMetadata = []] =
|
|
318
|
+
(ethers.utils.defaultAbiCoder.decode(
|
|
319
|
+
multiMetadataTypes,
|
|
320
|
+
metadata
|
|
321
|
+
) as string[]) || [];
|
|
322
|
+
|
|
323
|
+
for (let metadata of decodedMultiMetadata) {
|
|
324
|
+
const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
|
|
325
|
+
metadataTypes,
|
|
326
|
+
metadata
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
const type = ethers.utils.parseBytes32String(
|
|
330
|
+
decodedMetadata.type
|
|
331
|
+
) as keyof typeof actionMetadataTypes;
|
|
332
|
+
|
|
333
|
+
const decodedData = ethers.utils.defaultAbiCoder.decode(
|
|
334
|
+
actionMetadataTypes[type],
|
|
335
|
+
decodedMetadata.data
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
switch (type) {
|
|
339
|
+
case "transfer":
|
|
340
|
+
payload = {
|
|
341
|
+
type,
|
|
342
|
+
token: decodedData.token,
|
|
343
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
344
|
+
receiver: decodedData.receiver,
|
|
345
|
+
};
|
|
346
|
+
break;
|
|
347
|
+
case "bridge":
|
|
348
|
+
payload = {
|
|
349
|
+
type,
|
|
350
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
351
|
+
receiver: decodedData.receiver,
|
|
352
|
+
toToken: decodedData.toToken,
|
|
353
|
+
fromToken: decodedData.fromToken,
|
|
354
|
+
toChainId: decodedData.toChainId
|
|
355
|
+
? decodedData.toChainId.toString()
|
|
356
|
+
: null,
|
|
357
|
+
bridgeFee: toBN(decodedData.bridgeFee).toFixed(),
|
|
358
|
+
};
|
|
359
|
+
break;
|
|
360
|
+
case "swap":
|
|
361
|
+
payload = {
|
|
362
|
+
type,
|
|
363
|
+
buyAmount: toBN(decodedData.buyAmount).toFixed(),
|
|
364
|
+
sellAmount: toBN(decodedData.sellAmount).toFixed(),
|
|
365
|
+
buyToken: decodedData.buyToken,
|
|
366
|
+
sellToken: decodedData.sellToken,
|
|
367
|
+
receiver: decodedData.receiver,
|
|
368
|
+
protocol: utils.parseBytes32String(decodedData?.protocol || ""),
|
|
369
|
+
};
|
|
370
|
+
break;
|
|
371
|
+
case "upgrade":
|
|
372
|
+
payload = {
|
|
373
|
+
type,
|
|
374
|
+
version: utils.parseBytes32String(decodedData?.version || ""),
|
|
375
|
+
walletImpl: decodedData?.walletImpl,
|
|
376
|
+
};
|
|
377
|
+
break;
|
|
378
|
+
case "gas-topup":
|
|
379
|
+
payload = {
|
|
380
|
+
type,
|
|
381
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
382
|
+
token: decodedData.token,
|
|
383
|
+
onBehalf: decodedData.onBehalf,
|
|
384
|
+
};
|
|
385
|
+
break;
|
|
386
|
+
case "dapp":
|
|
387
|
+
payload = {
|
|
388
|
+
type,
|
|
389
|
+
name: decodedData?.name,
|
|
390
|
+
url: decodedData?.url,
|
|
391
|
+
};
|
|
392
|
+
break;
|
|
393
|
+
case "deploy":
|
|
394
|
+
payload = {
|
|
395
|
+
type,
|
|
396
|
+
};
|
|
397
|
+
break;
|
|
398
|
+
|
|
399
|
+
case "permit2":
|
|
400
|
+
payload = {
|
|
401
|
+
type,
|
|
402
|
+
token: decodedData.token,
|
|
403
|
+
spender: decodedData.spender,
|
|
404
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
405
|
+
expiration: decodedData.expiration,
|
|
406
|
+
};
|
|
407
|
+
break;
|
|
408
|
+
|
|
409
|
+
case "cross-transfer":
|
|
410
|
+
payload = {
|
|
411
|
+
type,
|
|
412
|
+
fromToken: decodedData.fromToken,
|
|
413
|
+
toToken: decodedData.toToken,
|
|
414
|
+
toChainId: decodedData.toChainId
|
|
415
|
+
? decodedData.toChainId.toString()
|
|
416
|
+
: null,
|
|
417
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
418
|
+
receiver: decodedData.receiver,
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
break;
|
|
422
|
+
case "auth":
|
|
423
|
+
payload = {
|
|
424
|
+
type: decodedData.remove ? "remove-authority" : "add-authority",
|
|
425
|
+
address: decodedData.address,
|
|
426
|
+
chainId: decodedData.chainId ? decodedData.chainId.toString() : null,
|
|
427
|
+
remove: decodedData.remove,
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
break;
|
|
431
|
+
case "instadapp-pro":
|
|
432
|
+
payload = {
|
|
433
|
+
type,
|
|
434
|
+
castDetails: decodedData.castDetails,
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
break;
|
|
423
438
|
}
|
|
424
439
|
|
|
425
|
-
|
|
426
|
-
} catch (e) {
|
|
427
|
-
// console.log(e);
|
|
428
|
-
return null;
|
|
440
|
+
metadataArr.push(payload);
|
|
429
441
|
}
|
|
442
|
+
|
|
443
|
+
return metadataArr;
|
|
430
444
|
};
|
|
431
445
|
|
|
432
446
|
/**
|