Skip to content

Commit

Permalink
STUD-298: wallet updates (#708)
Browse files Browse the repository at this point in the history
* implements DexHunter integration component

* minor formatting update to disconnect wallet button

* updates disconnect wallet ui

* adds env vars for github workflows

* updates marketplace recaptcha endpoint map

* updates @newm.io/cardano-dapp-wallet-connector package

* displays newm balance in wallet ui

* implements usd conversion amounts for marketplace wallet

* updates studio auth/recaptcha header logic

* updates wallet ui for all apps

* removes unnecessary env vars from workflows

* resolves linting error

* gets tests passing

* updates dexhunter tools env var

* updates passed dexhunter swap modal props

* removes errant code

* reverts marketplace local port

* minor update to swap modal

* misc updates

* resolves linting error
  • Loading branch information
scandycuz authored Aug 12, 2024
1 parent d3d5b51 commit 5ffda6a
Show file tree
Hide file tree
Showing 48 changed files with 21,150 additions and 12,936 deletions.
3 changes: 3 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ VITE_FACEBOOK_CLIENT_ID=
VITE_GOOGLE_CLIENT_ID=
VITE_LINKEDIN_CLIENT_ID=
VITE_APPLE_CLIENT_ID=
VITE_DEXHUNTER_STUDIO_PARTNER_CODE=
VITE_RECAPTCHA_SITE_KEY_STAGING=
VITE_ENV=

NEXT_PUBLIC_FACEBOOK_CLIENT_ID=
NEXT_PUBLIC_GOOGLE_CLIENT_ID=
NEXT_PUBLIC_LINKEDIN_CLIENT_ID=
NEXT_PUBLIC_APPLE_CLIENT_ID=
NEXT_PUBLIC_DEXHUNTER_MARKETPLACE_PARTNER_CODE=
NEXT_PUBLIC_DEXHUNTER_TOOLS_CODE=
NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING=
NEXT_PUBLIC_ENV=

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
- name: Deploy marketplace
run: |
npm install --prefix .github/workflows/cdk
APPNAME=marketplace APPID=Marketplace QUALIFIER=Studio NEXT_PUBLIC_ENV=production NEXT_PUBLIC_RECAPTCHA_SITE_KEY_PROD=${{ secrets.RECAPTCHA_SITE_KEY_PROD }} npm run --prefix .github/workflows/cdk cdk:deploy deploy -- --require-approval never
APPNAME=marketplace APPID=Marketplace QUALIFIER=Studio NEXT_PUBLIC_ENV=production NEXT_PUBLIC_RECAPTCHA_SITE_KEY_PROD=${{ secrets.RECAPTCHA_SITE_KEY_PROD }} NEXT_PUBLIC_DEXHUNTER_MARKETPLACE_PARTNER_CODE=${{ secrets.DEXHUNTER_MARKETPLACE_PARTNER_CODE }} npm run --prefix .github/workflows/cdk cdk:deploy deploy -- --require-approval never
- name: Send update to slack
id: slack
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
run: |
npm install --prefix .github/workflows/cdk
sed -i 's|const nextConfig = .*|const nextConfig = { basePath: "/wallet-connect", |' apps/mobile-wallet-connector/next.config.js
APPNAME=mobile-wallet-connector APPID=MobileWalletConnector QUALIFIER=Studio NEXT_PUBLIC_ENV=production NEXT_PUBLIC_RECAPTCHA_SITE_KEY_PROD=${{ secrets.RECAPTCHA_SITE_KEY_PROD }} npm run --prefix .github/workflows/cdk cdk:deploy deploy -- --require-approval never
APPNAME=mobile-wallet-connector APPID=MobileWalletConnector QUALIFIER=Studio NEXT_PUBLIC_ENV=production NEXT_PUBLIC_RECAPTCHA_SITE_KEY_PROD=${{ secrets.RECAPTCHA_SITE_KEY_PROD }} NEXT_PUBLIC_DEXHUNTER_TOOLS_PARTNER_CODE=${{ secrets.DEXHUNTER_TOOLS_PARTNER_CODE }} npm run --prefix .github/workflows/cdk cdk:deploy deploy -- --require-approval never
- name: Send update to slack
id: slack
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ jobs:
VITE_GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
VITE_GA_STUDIO_ID: ${{ secrets.GA_STUDIO_ID }}
VITE_RECAPTCHA_SITE_KEY_PROD: ${{ secrets.RECAPTCHA_SITE_KEY_PROD }}
VITE_DEXHUNTER_STUDIO_PARTNER_CODE: ${{ secrets.DEXHUNTER_STUDIO_PARTNER_CODE }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
VITE_ENV: production

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ jobs:
- name: Deploy to Lambda Function
run: |
npm install --prefix .github/workflows/cdk
APPNAME=marketplace APPID=Marketplace QUALIFIER=Garage NEXT_PUBLIC_ENV=staging NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING=${{ secrets.RECAPTCHA_SITE_KEY_STAGING }} npm run --prefix .github/workflows/cdk cdk:deploy deploy -- --require-approval never
APPNAME=marketplace APPID=Marketplace QUALIFIER=Garage NEXT_PUBLIC_ENV=staging NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING=${{ secrets.RECAPTCHA_SITE_KEY_STAGING }} NEXT_PUBLIC_DEXHUNTER_MARKETPLACE_PARTNER_CODE=${{ secrets.DEXHUNTER_MARKETPLACE_PARTNER_CODE }} npm run --prefix .github/workflows/cdk cdk:deploy deploy -- --require-approval never
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ jobs:
run: |
npm install --prefix .github/workflows/cdk
sed -i 's|const nextConfig = .*|const nextConfig = { basePath: "/wallet-connect", |' apps/mobile-wallet-connector/next.config.js
APPNAME=mobile-wallet-connector APPID=MobileWalletConnector QUALIFIER=Garage NEXT_PUBLIC_ENV=staging NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING=${{ secrets.RECAPTCHA_SITE_KEY_STAGING }} npm run --prefix .github/workflows/cdk cdk:deploy deploy -- --require-approval never
APPNAME=mobile-wallet-connector APPID=MobileWalletConnector QUALIFIER=Garage NEXT_PUBLIC_ENV=staging NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING=${{ secrets.RECAPTCHA_SITE_KEY_STAGING }} NEXT_PUBLIC_DEXHUNTER_TOOLS_PARTNER_CODE=${{ secrets.DEXHUNTER_TOOLS_PARTNER_CODE }} npm run --prefix .github/workflows/cdk cdk:deploy deploy -- --require-approval never
1 change: 1 addition & 0 deletions .github/workflows/aws-hosting-merge-deploy-newm-studio.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ jobs:
VITE_GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
VITE_GA_STUDIO_ID: ${{ secrets.GA_STUDIO_ID }}
VITE_RECAPTCHA_SITE_KEY_STAGING: ${{ secrets.RECAPTCHA_SITE_KEY_STAGING }}
VITE_DEXHUNTER_STUDIO_PARTNER_CODE: ${{ secrets.DEXHUNTER_STUDIO_PARTNER_CODE }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
VITE_ENV: staging
- name: Configure AWS credentials
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:
- name: Deploy to Lambda Function
run: |
npm install --prefix .github/workflows/cdk
APPNAME=marketplace QUALIFIER=${{ github.event.pull_request.number }} npm run --prefix .github/workflows/cdk cdk:preview deploy -- --require-approval never
APPNAME=marketplace QUALIFIER=${{ github.event.pull_request.number }} NEXT_PUBLIC_DEXHUNTER_MARKETPLACE_PARTNER_CODE=${{ secrets.DEXHUNTER_MARKETPLACE_PARTNER_CODE }} npm run --prefix .github/workflows/cdk cdk:preview deploy -- --require-approval never
- name: Get preview url
id: previewurl
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
- name: Deploy to Lambda Function
run: |
npm install --prefix .github/workflows/cdk
APPNAME=mobile-wallet-connector QUALIFIER=${{ github.event.pull_request.number }} NEXT_PUBLIC_ENV=staging NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING=${{ secrets.RECAPTCHA_SITE_KEY_STAGING }} npm run --prefix .github/workflows/cdk cdk:preview deploy -- --require-approval never
APPNAME=mobile-wallet-connector QUALIFIER=${{ github.event.pull_request.number }} NEXT_PUBLIC_ENV=staging NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING=${{ secrets.RECAPTCHA_SITE_KEY_STAGING }} NEXT_PUBLIC_DEXHUNTER_TOOLS_PARTNER_CODE=${{ secrets.DEXHUNTER_TOOLS_PARTNER_CODE }} npm run --prefix .github/workflows/cdk cdk:preview deploy -- --require-approval never
- name: Get preview url
id: previewurl
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/aws-hosting-pull-request-newm-studio.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ jobs:
VITE_GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
VITE_GA_STUDIO_ID: ${{ secrets.GA_STUDIO_ID }}
VITE_RECAPTCHA_SITE_KEY_STAGING: ${{ secrets.RECAPTCHA_SITE_KEY_STAGING }}
VITE_DEXHUNTER_STUDIO_PARTNER_CODE: ${{ secrets.DEXHUNTER_STUDIO_PARTNER_CODE }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
VITE_ENV: staging
- name: Configure AWS credentials
Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/cdk/bin/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import { Tags } from "aws-cdk-lib";
const appName = process.env.APPNAME || "APPNAME";
const appId = process.env.APPID || "APPID";
const qualifier = process.env.QUALIFIER || "UNDEFINED";
const dexHunterMarketplacePartnerCode =
process.env.NEXT_PUBLIC_DEXHUNTER_MARKETPLACE_PARTNER_CODE || "";
const dexHunterToolsPartnerCode =
process.env.NEXT_PUBLIC_DEXHUNTER_TOOLS_PARTNER_CODE || "";
const recaptchaKeyProd = process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY_PROD || "";
const recaptchaKeyStaging =
process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING || "";
Expand All @@ -26,6 +30,9 @@ class WebDeployStack extends cdk.Stack {
{
code: lambda.DockerImageCode.fromImageAsset(rootDir, {
buildArgs: {
NEXT_PUBLIC_DEXHUNTER_MARKETPLACE_PARTNER_CODE:
dexHunterMarketplacePartnerCode,
NEXT_PUBLIC_DEXHUNTER_TOOLS_PARTNER_CODE: dexHunterToolsPartnerCode,
NEXT_PUBLIC_ENV: appEnv,
NEXT_PUBLIC_RECAPTCHA_SITE_KEY_PROD: recaptchaKeyProd,
NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING: recaptchaKeyStaging,
Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/cdk/bin/preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ const appName = process.env.APPNAME || "APPNAME";
const appNameAbbr = appName.replace(/-/g, "");
const qualifier = process.env.QUALIFIER || "UNDEFINED";
const recaptchaKey = process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING || "";
const dexHunterMarketplacePartnerCode =
process.env.NEXT_PUBLIC_DEXHUNTER_MARKETPLACE_PARTNER_CODE || "";
const dexHunterToolsPartnerCode =
process.env.NEXT_PUBLIC_DEXHUNTER_TOOLS_PARTNER_CODE || "";
const appEnv = process.env.NEXT_PUBLIC_ENV || "";
const rootDir = path.resolve(__dirname, "..", "..", "..", "..");

Expand All @@ -22,6 +26,9 @@ class WebPreviewStack extends cdk.Stack {
{
code: lambda.DockerImageCode.fromImageAsset(rootDir, {
buildArgs: {
NEXT_PUBLIC_DEXHUNTER_MARKETPLACE_PARTNER_CODE:
dexHunterMarketplacePartnerCode,
NEXT_PUBLIC_DEXHUNTER_TOOLS_PARTNER_CODE: dexHunterToolsPartnerCode,
NEXT_PUBLIC_ENV: appEnv,
NEXT_PUBLIC_RECAPTCHA_SITE_KEY_STAGING: recaptchaKey,
},
Expand Down
2 changes: 2 additions & 0 deletions apps/marketplace/src/api/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
export const recaptchaEndpointActionMap: Record<string, string> = {
generateOrder: "generate_order_amount",
generateTransaction: "generate_order_transaction",
getAdaUsdConversionRate: "get_ada_price",
getArtist: "get_artist",
getArtists: "get_artists",
getMarketplaceClientConfig: "marketplace_config",
getNewmUsdConversionRate: "get_newm_price",
getSale: "get_sale",
getSales: "get_sales",
};
4 changes: 3 additions & 1 deletion apps/marketplace/src/api/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import { recaptchaEndpointActionMap } from "./constants";
*/
export const getRecaptchaHeaders = async (api: BaseQueryApi) => {
const { endpoint } = api;
const action = recaptchaEndpointActionMap[endpoint] || endpoint;
const action = recaptchaEndpointActionMap[endpoint];

if (!action) return {};

return {
"g-recaptcha-platform": "Web",
Expand Down
3 changes: 3 additions & 0 deletions apps/marketplace/src/common/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ export const NEWM_MARKETPLACE_TERMS_OF_SERVICE_URL = "";
export const NEWM_SUPPORT_EMAIL = "[email protected]";
export const NEWM_TELEGRAM_URL = "https://t.me/NEWMofficial";
export const NEWM_X_URL = "https://twitter.com/projectNEWM";
export const NEWM_POLICY_ID =
"682fe60c9918842b3323c43b5144bc3d52a23bd2fb81345560d73f63";
export const NEWM_ASSET_NAME = "4e45574d";

/**
* Map of grid column size for displaying artists based
Expand Down
49 changes: 42 additions & 7 deletions apps/marketplace/src/components/header/ConnectWallet.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { useConnectWallet } from "@newm.io/cardano-dapp-wallet-connector";
import currency from "currency.js";
import { FunctionComponent, useEffect, useState } from "react";
import {
DisconnectWalletButton,
Expand All @@ -8,14 +7,33 @@ import {
} from "@newm-web/components";
import { Button } from "@newm-web/elements";
import { Grid } from "@mui/material";
import { getIsWalletEnvMismatch } from "@newm-web/utils";
import { LOVELACE_CONVERSION, getIsWalletEnvMismatch } from "@newm-web/utils";
import { DEXHUNTER_MARKETPLACE_PARTNER_CODE } from "@newm-web/env";
import {
useGetAdaUsdConversionRateQuery,
useGetNewmUsdConversionRateQuery,
} from "../../modules/wallet/api";
import { NEWM_ASSET_NAME, NEWM_POLICY_ID } from "../../common";

const ConnectWallet: FunctionComponent = () => {
const defaultUsdPrice = { usdPrice: 0 };

const [walletAddress, setWalletAddress] = useState("");
const [walletBalance, setWalletBalance] = useState("");
const [walletAdaBalance, setWalletAdaBalance] = useState(0);
const [walletNewmBalance, setWalletNewmBalance] = useState(0);
const [isWalletModalOpen, setisWalletModalOpen] = useState(false);
const [isWalletEnvModalOpen, setIsWalletEnvModalOpen] = useState(false);
const { wallet, getBalance, getAddress } = useConnectWallet();

const { wallet, getBalance, getAddress, getTokenBalance } =
useConnectWallet();
const { data: { usdPrice: adaUsdPrice } = defaultUsdPrice } =
useGetAdaUsdConversionRateQuery();
const { data: { usdPrice: newmUsdPrice } = defaultUsdPrice } =
useGetNewmUsdConversionRateQuery();

const adaUsdBalance = (adaUsdPrice * walletAdaBalance) / LOVELACE_CONVERSION;
const newmUsdBalance =
(newmUsdPrice * walletNewmBalance) / LOVELACE_CONVERSION;

const handleConnectWallet = async () => {
if (!wallet) return;
Expand All @@ -41,12 +59,24 @@ const ConnectWallet: FunctionComponent = () => {
useEffect(() => {
if (wallet) {
getBalance((value) => {
const adaBalance = currency(value, { symbol: "" }).format();
setWalletBalance(adaBalance);
setWalletAdaBalance(value);
});
}
}, [wallet, getBalance]);

/**
* Gets the NEWM balance from the wallet and updates the state.
*/
useEffect(() => {
const callback = (value: number) => {
setWalletNewmBalance(value);
};

if (wallet) {
getTokenBalance(NEWM_POLICY_ID, callback, NEWM_ASSET_NAME);
}
}, [wallet, getTokenBalance]);

/**
* Gets an address from the wallet and updates the state.
*/
Expand All @@ -73,8 +103,13 @@ const ConnectWallet: FunctionComponent = () => {

{ wallet ? (
<DisconnectWalletButton
adaBalance={ walletAdaBalance }
adaUsdBalance={ adaUsdBalance }
address={ walletAddress }
balance={ walletBalance }
newmBalance={ walletNewmBalance }
newmUsdBalance={ newmUsdBalance }
partnerCode={ DEXHUNTER_MARKETPLACE_PARTNER_CODE }
partnerName="NEWMMarketplace"
onDisconnect={ handleDisconnectWallet }
/>
) : (
Expand Down
56 changes: 56 additions & 0 deletions apps/marketplace/src/modules/wallet/api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import {
GetAdaUsdConversionResponse,
GetNewmUsdConversionResponse,
} from "@newm-web/types";
import { newmApi } from "../../api";
import { setToastMessage } from "../../modules/ui";

export const extendedApi = newmApi.injectEndpoints({
endpoints: (build) => ({
getAdaUsdConversionRate: build.query<GetAdaUsdConversionResponse, void>({
async onQueryStarted(body, { dispatch, queryFulfilled }) {
try {
await queryFulfilled;
} catch (error) {
dispatch(
setToastMessage({
message: "An error occurred fetching ADA/USD conversion rate",
severity: "error",
})
);
}
},

query: (body) => ({
method: "GET",
url: "/v1/cardano/prices/ada",
}),
}),
getNewmUsdConversionRate: build.query<GetNewmUsdConversionResponse, void>({
async onQueryStarted(body, { dispatch, queryFulfilled }) {
try {
await queryFulfilled;
} catch (error) {
dispatch(
setToastMessage({
message: "An error occurred fetching NEWM/USD conversion rate",
severity: "error",
})
);
}
},

query: (body) => ({
method: "GET",
url: "/v1/cardano/prices/newm",
}),
}),
}),
});

export const {
useGetAdaUsdConversionRateQuery,
useGetNewmUsdConversionRateQuery,
} = extendedApi;

export default extendedApi;
Loading

0 comments on commit 5ffda6a

Please sign in to comment.