@instadapp/avocado-base 0.0.0-dev.e76fab2 → 0.0.0-dev.eda2183

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.
Files changed (58) hide show
  1. package/abi/forwarder.json +8 -8
  2. package/assets/images/icons/arrow-left.svg +5 -0
  3. package/assets/images/icons/arrow-right.svg +5 -0
  4. package/assets/images/icons/avocado.svg +4 -0
  5. package/assets/images/icons/bridge-2.svg +3 -0
  6. package/assets/images/icons/bridge.svg +7 -0
  7. package/assets/images/icons/calendar.svg +8 -0
  8. package/assets/images/icons/check-circle.svg +4 -0
  9. package/assets/images/icons/chevron-down.svg +4 -0
  10. package/assets/images/icons/clipboard.svg +7 -0
  11. package/assets/images/icons/clock-circle.svg +5 -0
  12. package/assets/images/icons/copy.svg +5 -0
  13. package/assets/images/icons/error-circle.svg +6 -0
  14. package/assets/images/icons/exclamation-circle.svg +13 -0
  15. package/assets/images/icons/exclamation-octagon.svg +13 -0
  16. package/assets/images/icons/exclamation-triangle.svg +5 -0
  17. package/assets/images/icons/external-link.svg +6 -0
  18. package/assets/images/icons/eye.svg +4 -0
  19. package/assets/images/icons/flowers.svg +8 -0
  20. package/assets/images/icons/gas-emoji.svg +193 -0
  21. package/assets/images/icons/gas.svg +7 -0
  22. package/assets/images/icons/gift.svg +153 -0
  23. package/assets/images/icons/globe.svg +110 -0
  24. package/assets/images/icons/hamburger.svg +6 -0
  25. package/assets/images/icons/logout.svg +3 -0
  26. package/assets/images/icons/moon.svg +3 -0
  27. package/assets/images/icons/network.svg +13 -0
  28. package/assets/images/icons/options.svg +5 -0
  29. package/assets/images/icons/plus.svg +5 -0
  30. package/assets/images/icons/power-off-bg.svg +24 -0
  31. package/assets/images/icons/power-off.svg +19 -0
  32. package/assets/images/icons/power-on.svg +19 -0
  33. package/assets/images/icons/qr.svg +20 -0
  34. package/assets/images/icons/question-circle.svg +14 -0
  35. package/assets/images/icons/refresh.svg +6 -0
  36. package/assets/images/icons/search.svg +12 -0
  37. package/assets/images/icons/sun.svg +3 -0
  38. package/assets/images/icons/wave.svg +214 -0
  39. package/assets/images/icons/x.svg +5 -0
  40. package/components/ActionMetadata.vue +50 -0
  41. package/components/ChainLogo.vue +1 -1
  42. package/components/metadata/Bridge.vue +37 -0
  43. package/components/metadata/CrossTransfer.vue +65 -0
  44. package/components/metadata/GasTopup.vue +31 -0
  45. package/components/metadata/Permit2.vue +37 -0
  46. package/components/metadata/Swap.vue +66 -0
  47. package/components/metadata/Transfer.vue +43 -0
  48. package/components.d.ts +13 -0
  49. package/contracts/Forwarder.ts +4 -4
  50. package/contracts/factories/Forwarder__factory.ts +8 -8
  51. package/nuxt.config.ts +17 -1
  52. package/package.json +6 -3
  53. package/utils/avocado.ts +2 -0
  54. package/utils/bignumber.ts +20 -0
  55. package/utils/metadata.ts +207 -166
  56. package/utils/network.ts +1 -1
  57. package/utils/services.ts +14 -0
  58. package/utils/utils.d.ts +12 -0
@@ -535,7 +535,7 @@ const _abi = [
535
535
  },
536
536
  {
537
537
  internalType: "uint256",
538
- name: "validUntil",
538
+ name: "gasPrice",
539
539
  type: "uint256",
540
540
  },
541
541
  {
@@ -545,7 +545,7 @@ const _abi = [
545
545
  },
546
546
  {
547
547
  internalType: "uint256",
548
- name: "gasPrice",
548
+ name: "validUntil",
549
549
  type: "uint256",
550
550
  },
551
551
  ],
@@ -788,7 +788,7 @@ const _abi = [
788
788
  },
789
789
  {
790
790
  internalType: "uint256",
791
- name: "validUntil",
791
+ name: "gasPrice",
792
792
  type: "uint256",
793
793
  },
794
794
  {
@@ -798,7 +798,7 @@ const _abi = [
798
798
  },
799
799
  {
800
800
  internalType: "uint256",
801
- name: "gasPrice",
801
+ name: "validUntil",
802
802
  type: "uint256",
803
803
  },
804
804
  ],
@@ -1122,7 +1122,7 @@ const _abi = [
1122
1122
  },
1123
1123
  {
1124
1124
  internalType: "uint256",
1125
- name: "validUntil",
1125
+ name: "gasPrice",
1126
1126
  type: "uint256",
1127
1127
  },
1128
1128
  {
@@ -1132,7 +1132,7 @@ const _abi = [
1132
1132
  },
1133
1133
  {
1134
1134
  internalType: "uint256",
1135
- name: "gasPrice",
1135
+ name: "validUntil",
1136
1136
  type: "uint256",
1137
1137
  },
1138
1138
  ],
@@ -1393,7 +1393,7 @@ const _abi = [
1393
1393
  },
1394
1394
  {
1395
1395
  internalType: "uint256",
1396
- name: "validUntil",
1396
+ name: "gasPrice",
1397
1397
  type: "uint256",
1398
1398
  },
1399
1399
  {
@@ -1403,7 +1403,7 @@ const _abi = [
1403
1403
  },
1404
1404
  {
1405
1405
  internalType: "uint256",
1406
- name: "gasPrice",
1406
+ name: "validUntil",
1407
1407
  type: "uint256",
1408
1408
  },
1409
1409
  ],
package/nuxt.config.ts CHANGED
@@ -1,4 +1,20 @@
1
1
  // https://nuxt.com/docs/api/configuration/nuxt-config
2
+ import ViteComponents from "unplugin-vue-components/vite";
3
+
2
4
  export default defineNuxtConfig({
3
- modules: ["@nuxtjs/tailwindcss"],
5
+ modules: ["@nuxtjs/tailwindcss", "nuxt-svgo", "@vueuse/nuxt"],
6
+ svgo: {
7
+ defaultImport: "component",
8
+ autoImportPath: "./assets/images/icons",
9
+ svgoConfig: {
10
+ plugins: ["prefixIds"],
11
+ },
12
+ },
13
+ vite: {
14
+ plugins: [
15
+ ViteComponents({
16
+ dts: true,
17
+ }),
18
+ ],
19
+ },
4
20
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instadapp/avocado-base",
3
- "version": "0.0.0-dev.e76fab2",
3
+ "version": "0.0.0-dev.eda2183",
4
4
  "type": "module",
5
5
  "main": "./nuxt.config.ts",
6
6
  "types": "global.d.ts",
@@ -16,11 +16,14 @@
16
16
  "@instadapp/avocado-dev": "npm:@instadapp/avocado@dev",
17
17
  "@nuxtjs/tailwindcss": "^6.6.5",
18
18
  "@typechain/ethers-v5": "^10.2.0",
19
- "nuxt": "^3.3.3",
19
+ "nuxt": "^3.6.1",
20
+ "nuxt-svgo": "^3.1.0",
20
21
  "rimraf": "^3.0.2",
21
- "typechain": "^8.1.1"
22
+ "typechain": "^8.1.1",
23
+ "unplugin-vue-components": "^0.25.1"
22
24
  },
23
25
  "dependencies": {
26
+ "@vueuse/nuxt": "^10.2.0",
24
27
  "bignumber.js": "^9.1.1",
25
28
  "ethers": "^5.7.2"
26
29
  }
package/utils/avocado.ts CHANGED
@@ -20,3 +20,5 @@ export const AVO_STAGING_DEPOSIT_ADDRESS =
20
20
  export const AVO_PROD_RPC_URL = "https://rpc.avocado.instadapp.io";
21
21
 
22
22
  export const AVO_STAGING_RPC_URL = "https://rpc.avocado.instad.app";
23
+
24
+ export const blockQueryURL = "https://blockquery.instadapp.io";
@@ -1,6 +1,8 @@
1
1
  import { BigNumber } from "bignumber.js";
2
2
  import { BigNumber as BN } from "ethers";
3
3
 
4
+ type CombinedBigNumber = BigNumber | string | number;
5
+
4
6
  export const toBN = (value: BigNumber.Value | BN) =>
5
7
  new BigNumber(BN.isBigNumber(value) ? value.toString() : value);
6
8
  export const isZero = (value: BigNumber.Value | BN) => toBN(value).isZero();
@@ -29,3 +31,21 @@ export const ensureValue = (value: any) => {
29
31
  export const max = (...args: BigNumber.Value[]) => {
30
32
  return BigNumber.max(...args);
31
33
  };
34
+
35
+ export function pow(value: CombinedBigNumber, exponent: string | number) {
36
+ return toBN(value).pow(toBN(exponent));
37
+ }
38
+
39
+ export function toWei(val: CombinedBigNumber, decimals: number): string {
40
+ const num = toBN(val);
41
+ const multiplier = pow(10, decimals);
42
+ return times(num, multiplier).toFixed(0);
43
+ }
44
+
45
+ export function fromWei(val: CombinedBigNumber, decimal = 18) {
46
+ return toBN(val).div(new BigNumber(10).pow(decimal));
47
+ }
48
+
49
+ export function abs(value: CombinedBigNumber) {
50
+ return toBN(value).abs();
51
+ }
package/utils/metadata.ts CHANGED
@@ -42,7 +42,7 @@ const actionMetadataTypes = {
42
42
  "uint160 amount",
43
43
  "uint48 expiration",
44
44
  ],
45
- castDetails: ["string castDetails"],
45
+ "instadapp-pro": ["string castDetails"],
46
46
  };
47
47
 
48
48
  const encodeMetadata = (props: MetadataProps) => {
@@ -242,176 +242,217 @@ export const encodeMultipleActions = (...actionData: string[]) => {
242
242
  return ethers.utils.defaultAbiCoder.encode(multiMetadataTypes, [actionData]);
243
243
  };
244
244
 
245
- export const decodeMetadata = (data: string) => {
245
+ export const decodeData = (data: string) => {
246
246
  try {
247
- const iface = Forwarder__factory.createInterface();
248
- let metadata = "0x";
249
- let payload = {};
250
-
251
- if (!data) return payload;
252
-
253
- if (data.startsWith("0x18e7f485")) {
254
- const executeData = iface.decodeFunctionData("execute", data);
255
- if (executeData.metadata_ === "0x" || !executeData.metadata_) {
256
- return null;
257
- } else {
258
- metadata = executeData.metadata_;
259
- }
260
- } else if (data.startsWith("0x14f80a8d")) {
261
- const executeDataV2 = iface.decodeFunctionData("executeV2", data);
262
- if (
263
- executeDataV2.params_.metadata === "0x" ||
264
- !executeDataV2.params_.metadata
265
- ) {
266
- return null;
267
- } else {
268
- metadata = executeDataV2.params_.metadata;
269
- }
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;
270
272
  } else {
271
- const executeDataV3 = iface.decodeFunctionData("executeV3", data);
272
- if (
273
- executeDataV3.params_.metadata === "0x" ||
274
- !executeDataV3.params_.metadata
275
- ) {
276
- return null;
277
- } else {
278
- metadata = executeDataV3.params_.metadata;
279
- }
273
+ metadata = executeData.metadata_;
280
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
+ }
281
309
 
282
- const metadataArr = [];
283
-
284
- const [decodedMultiMetadata = []] =
285
- (ethers.utils.defaultAbiCoder.decode(
286
- multiMetadataTypes,
287
- metadata
288
- ) as string[]) || [];
289
-
290
- for (let metadata of decodedMultiMetadata) {
291
- const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
292
- metadataTypes,
293
- metadata
294
- );
295
-
296
- const type = ethers.utils.parseBytes32String(
297
- decodedMetadata.type
298
- ) as keyof typeof actionMetadataTypes;
299
-
300
- const decodedData = ethers.utils.defaultAbiCoder.decode(
301
- actionMetadataTypes[type],
302
- decodedMetadata.data
303
- );
304
-
305
- switch (type) {
306
- case "transfer":
307
- payload = {
308
- type,
309
- token: decodedData.token,
310
- amount: toBN(decodedData.amount).toFixed(),
311
- receiver: decodedData.receiver,
312
- };
313
- break;
314
- case "bridge":
315
- payload = {
316
- type,
317
- amount: toBN(decodedData.amount).toFixed(),
318
- receiver: decodedData.receiver,
319
- toToken: decodedData.toToken,
320
- fromToken: decodedData.fromToken,
321
- toChainId: decodedData.toChainId
322
- ? decodedData.toChainId.toString()
323
- : null,
324
- bridgeFee: toBN(decodedData.bridgeFee).toFixed(),
325
- };
326
- break;
327
- case "swap":
328
- payload = {
329
- type,
330
- buyAmount: toBN(decodedData.buyAmount).toFixed(),
331
- sellAmount: toBN(decodedData.sellAmount).toFixed(),
332
- buyToken: decodedData.buyToken,
333
- sellToken: decodedData.sellToken,
334
- receiver: decodedData.receiver,
335
- protocol: utils.parseBytes32String(decodedData?.protocol || ""),
336
- };
337
- break;
338
- case "upgrade":
339
- payload = {
340
- type,
341
- version: utils.parseBytes32String(decodedData?.version || ""),
342
- walletImpl: decodedData?.walletImpl,
343
- };
344
- break;
345
- case "gas-topup":
346
- payload = {
347
- type,
348
- amount: toBN(decodedData.amount).toFixed(),
349
- token: decodedData.token,
350
- onBehalf: decodedData.onBehalf,
351
- };
352
- break;
353
- case "dapp":
354
- payload = {
355
- type,
356
- name: decodedData?.name,
357
- url: decodedData?.url,
358
- };
359
- break;
360
- case "deploy":
361
- payload = {
362
- type,
363
- };
364
- break;
365
-
366
- case "permit2":
367
- payload = {
368
- type,
369
- token: decodedData.token,
370
- spender: decodedData.spender,
371
- amount: toBN(decodedData.amount).toFixed(),
372
- expiration: decodedData.expiration,
373
- };
374
- break;
375
-
376
- case "cross-transfer":
377
- payload = {
378
- type,
379
- fromToken: decodedData.fromToken,
380
- toToken: decodedData.toToken,
381
- toChainId: decodedData.toChainId
382
- ? decodedData.toChainId.toString()
383
- : null,
384
- amount: toBN(decodedData.amount).toFixed(),
385
- receiver: decodedData.receiver,
386
- };
387
-
388
- break;
389
- case "auth":
390
- payload = {
391
- type: decodedData.remove ? "remove-authority" : "add-authority",
392
- address: decodedData.address,
393
- chainId: decodedData.chainId
394
- ? decodedData.chainId.toString()
395
- : null,
396
- remove: decodedData.remove,
397
- };
398
-
399
- break;
400
- case "castDetails":
401
- payload = {
402
- type,
403
- castDetails: decodedData.castDetails,
404
- };
405
-
406
- break;
407
- }
408
-
409
- metadataArr.push(payload);
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;
410
438
  }
411
439
 
412
- return metadataArr;
413
- } catch (e) {
414
- console.log(e);
415
- return null;
440
+ metadataArr.push(payload);
416
441
  }
442
+
443
+ return metadataArr;
444
+ };
445
+
446
+ /**
447
+ * Replaces hyphens with spaces and capitalizes the first letter of each word in a sentence.
448
+ * @param {string} txType - The input sentence to modify
449
+ *
450
+ * @returns {string} - The modified sentence with hyphens replaced with spaces and the first letter of each word capitalized.
451
+ */
452
+ export const formatTxType = (txType: string) => {
453
+ const finalSentence = txType
454
+ .replace("-", " ")
455
+ .replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase());
456
+
457
+ return finalSentence;
417
458
  };
package/utils/network.ts CHANGED
@@ -4,7 +4,7 @@ export const bridgeDisabledNetworks = [1101];
4
4
 
5
5
  export const networks: Network[] = [
6
6
  {
7
- name: "Mainnet",
7
+ name: "Ethereum",
8
8
  debankName: "eth",
9
9
  ankrName: "eth",
10
10
  zerionName: "ethereum",
@@ -0,0 +1,14 @@
1
+ export const fetchTokenByAddress = async (
2
+ address: string,
3
+ chainId: string | number
4
+ ) => {
5
+ if (!address || !chainId) return null;
6
+ const [token] = (await $fetch(`${blockQueryURL}/${chainId}/tokens`, {
7
+ params: {
8
+ sparkline: false,
9
+ "addresses[]": [address],
10
+ },
11
+ })) as ITokenPrice[];
12
+
13
+ return token;
14
+ };
package/utils/utils.d.ts CHANGED
@@ -116,3 +116,15 @@ type MetadataProps = {
116
116
  encodedData: string;
117
117
  version?: string;
118
118
  };
119
+
120
+ interface ITokenPrice {
121
+ address: string;
122
+ chain_id: string;
123
+ name: string;
124
+ symbol: string;
125
+ decimals: number;
126
+ logo_url: string;
127
+ price: string;
128
+ coingecko_id: string;
129
+ sparkline_price_7d: number[];
130
+ }