From 06de92e354a0ceaf1a1c64f3a9838b636a4668eb Mon Sep 17 00:00:00 2001
From: josemarinas <36479864+josemarinas@users.noreply.github.com>
Date: Mon, 10 Jul 2023 17:23:32 +0200
Subject: [PATCH] Fix: Token not showing on proposals with underlying token
 (#249)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* fix parseToken function

* update version

* add parseToken tests

* Updating the changelog

---------

Co-authored-by: Jør∂¡ <4456749+brickpop@users.noreply.github.com>
---
 modules/client/CHANGELOG.md                   |  4 +
 modules/client/package.json                   |  2 +-
 .../client/src/tokenVoting/internal/utils.ts  | 26 ++++++-
 modules/client/src/tokenVoting/types.ts       |  1 +
 .../utils.test.ts"                            | 78 +++++++++++++++++++
 5 files changed, 107 insertions(+), 4 deletions(-)
 create mode 100644 "modules/client/test/unit/tokenVoting-client\302\240 /utils.test.ts"

diff --git a/modules/client/CHANGELOG.md b/modules/client/CHANGELOG.md
index 7ad8f3fe8..2cda9be2e 100644
--- a/modules/client/CHANGELOG.md
+++ b/modules/client/CHANGELOG.md
@@ -18,6 +18,10 @@ TEMPLATE:
 
 ## [UPCOMING]
 ### Changed
+- Amended an issue that would prevent details from the underlying token to be returned in `parseToken()`
+
+## [1.9.5]
+### Changed
 - Added a timeout to `getDaos()` and `getProposals()`, so that an individual lengthy fetch doesn't block everything indefinitely
 - Improve the PR template
 
diff --git a/modules/client/package.json b/modules/client/package.json
index 4712ca370..83c767c7f 100644
--- a/modules/client/package.json
+++ b/modules/client/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@aragon/sdk-client",
   "author": "Aragon Association",
-  "version": "1.9.5",
+  "version": "1.9.6",
   "license": "MIT",
   "main": "dist/index.js",
   "module": "dist/sdk-client.esm.js",
diff --git a/modules/client/src/tokenVoting/internal/utils.ts b/modules/client/src/tokenVoting/internal/utils.ts
index 36071d796..a6409c7ff 100644
--- a/modules/client/src/tokenVoting/internal/utils.ts
+++ b/modules/client/src/tokenVoting/internal/utils.ts
@@ -7,6 +7,7 @@ import {
 } from "../../client-common";
 import {
   Erc20TokenDetails,
+  Erc20WrapperTokenDetails,
   Erc721TokenDetails,
   MintTokenParams,
   TokenVotingMember,
@@ -19,6 +20,7 @@ import {
   ContractTokenVotingInitParams,
   SubgraphContractType,
   SubgraphErc20Token,
+  SubgraphErc20WrapperToken,
   SubgraphErc721Token,
   SubgraphTokenVotingMember,
   SubgraphTokenVotingProposal,
@@ -213,10 +215,13 @@ export function tokenVotingInitParamsToContract(
   ];
 }
 
-function parseToken(
-  subgraphToken: SubgraphErc20Token | SubgraphErc721Token,
+export function parseToken(
+  subgraphToken:
+    | SubgraphErc20Token
+    | SubgraphErc721Token
+    | SubgraphErc20WrapperToken,
 ): Erc20TokenDetails | Erc721TokenDetails | null {
-  let token: Erc721TokenDetails | Erc20TokenDetails | null = null;
+  let token: Erc721TokenDetails | Erc20TokenDetails| Erc20WrapperTokenDetails | null = null;
   if (subgraphToken.__typename === SubgraphContractType.ERC20) {
     token = {
       address: subgraphToken.id,
@@ -232,6 +237,21 @@ function parseToken(
       name: subgraphToken.name,
       type: TokenType.ERC721,
     };
+  } else if (subgraphToken.__typename === SubgraphContractType.ERC20_WRAPPER) {
+    token = {
+      address: subgraphToken.id,
+      symbol: subgraphToken.symbol,
+      name: subgraphToken.name,
+      decimals: subgraphToken.decimals,
+      type: TokenType.ERC20,
+      underlyingToken: {
+        address: subgraphToken.underlyingToken.id,
+        symbol: subgraphToken.underlyingToken.symbol,
+        name: subgraphToken.underlyingToken.name,
+        decimals: subgraphToken.underlyingToken.decimals,
+        type: TokenType.ERC20,
+      },
+    };
   }
   return token;
 }
diff --git a/modules/client/src/tokenVoting/types.ts b/modules/client/src/tokenVoting/types.ts
index ebb5c8f69..f9419affb 100644
--- a/modules/client/src/tokenVoting/types.ts
+++ b/modules/client/src/tokenVoting/types.ts
@@ -64,6 +64,7 @@ export type Erc20TokenDetails = TokenBaseDetails & {
   decimals: number;
   type: TokenType.ERC20;
 };
+
 export type Erc721TokenDetails = TokenBaseDetails & {
   type: TokenType.ERC721;
 };
diff --git "a/modules/client/test/unit/tokenVoting-client\302\240 /utils.test.ts" "b/modules/client/test/unit/tokenVoting-client\302\240 /utils.test.ts"
new file mode 100644
index 000000000..202958b0b
--- /dev/null
+++ "b/modules/client/test/unit/tokenVoting-client\302\240 /utils.test.ts"	
@@ -0,0 +1,78 @@
+import { TokenType } from "@aragon/sdk-client-common";
+import { SubgraphContractType } from "../../../src/tokenVoting/internal/types";
+import { parseToken } from "../../../src/tokenVoting/internal/utils";
+
+describe("tokenVoting-client utils", () => {
+  describe("parseToken", () => {
+    it("should return ERC721", () => {
+      const token = parseToken({
+        __typename: SubgraphContractType.ERC721,
+        id: "0x1234567890123456789012345678901234567890",
+        name: "TestToken",
+        symbol: "TT",
+      });
+      expect(token).toEqual({
+        address: "0x1234567890123456789012345678901234567890",
+        name: "TestToken",
+        symbol: "TT",
+        type: TokenType.ERC721,
+      });
+    });
+    it("should return ERC20", () => {
+      const token = parseToken({
+        __typename: SubgraphContractType.ERC20,
+        id: "0x1234567890123456789012345678901234567890",
+        name: "TestToken",
+        symbol: "TT",
+        decimals: 18,
+      });
+      expect(token).toEqual({
+        address: "0x1234567890123456789012345678901234567890",
+        name: "TestToken",
+        symbol: "TT",
+        decimals: 18,
+        type: TokenType.ERC20,
+      });
+    });
+    it("should return ERC20Wrapper", () => {
+      const token = parseToken({
+        __typename: SubgraphContractType.ERC20_WRAPPER,
+        id: "0x1234567890123456789012345678901234567890",
+        name: "TestToken",
+        symbol: "TT",
+        decimals: 18,
+        underlyingToken: {
+          __typename: SubgraphContractType.ERC20,
+          id: "0x1234567890123456789012345678901234567890",
+          name: "TestToken",
+          symbol: "TT",
+          decimals: 18,
+        },
+      });
+      expect(token).toEqual({
+        address: "0x1234567890123456789012345678901234567890",
+        name: "TestToken",
+        symbol: "TT",
+        decimals: 18,
+        type: TokenType.ERC20,
+        underlyingToken: {
+          address: "0x1234567890123456789012345678901234567890",
+          name: "TestToken",
+          symbol: "TT",
+          decimals: 18,
+          type: TokenType.ERC20,
+        },
+      });
+    });
+    it("should return null", () => {
+        const token = parseToken({
+            // @ts-ignore
+            __typename: "Other",
+            id: "0x1234567890123456789012345678901234567890",
+            name: "TestToken",
+            symbol: "TT",
+        });
+        expect(token).toEqual(null);
+    });
+  });
+});