Compare commits

..
Author SHA1 Message Date
Shreerang Kale 2d3242aad3 Return boolean for new user 2025-02-10 12:24:39 +05:30
IshaVenikar 616ead7ae5 Keep auto sign-in behind flag 2025-02-10 11:03:40 +05:30
Shreerang Kale 817aa95530 Add route to auto sign in 2025-02-07 15:07:27 +05:30
16 changed files with 143 additions and 219 deletions
+1 -3
View File
@@ -1,8 +1,6 @@
REACT_APP_WALLET_CONNECT_PROJECT_ID= REACT_APP_WALLET_CONNECT_PROJECT_ID=
REACT_APP_DEFAULT_GAS_PRICE=0.025 REACT_APP_DEFAULT_GAS_PRICE=0.025
# Reference: https://github.com/cosmos/cosmos-sdk/issues/16020 # Reference: https://github.com/cosmos/cosmos-sdk/issues/16020
REACT_APP_GAS_ADJUSTMENT=2 REACT_APP_GAS_ADJUSTMENT=2
REACT_APP_LACONICD_RPC_URL=https://laconicd-sapo.laconic.com REACT_APP_LACONICD_RPC_URL=https://laconicd-sapo.laconic.com
REACT_APP_AUTH_SECRET=
REACT_APP_DEPLOY_APP_URL=
-1
View File
@@ -1 +0,0 @@
build
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "web-wallet", "name": "web-wallet",
"version": "0.1.3", "version": "0.1.2",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@cerc-io/registry-sdk": "^0.2.5", "@cerc-io/registry-sdk": "^0.2.5",
-58
View File
@@ -4,8 +4,6 @@ import { TxBody, AuthInfo } from "cosmjs-types/cosmos/tx/v1beta1/tx";
import { SignClientTypes } from "@walletconnect/types"; import { SignClientTypes } from "@walletconnect/types";
import { useNavigation } from "@react-navigation/native"; import { useNavigation } from "@react-navigation/native";
import { DirectSecp256k1Wallet } from "@cosmjs/proto-signing";
import { SigningStargateClient } from "@cosmjs/stargate";
import { import {
createStackNavigator, createStackNavigator,
StackNavigationProp, StackNavigationProp,
@@ -38,8 +36,6 @@ import styles from "./styles/stylesheet";
import { Header } from "./components/Header"; import { Header } from "./components/Header";
import { WalletEmbed } from "./screens/WalletEmbed"; import { WalletEmbed } from "./screens/WalletEmbed";
import { AutoSignIn } from "./screens/AutoSignIn"; import { AutoSignIn } from "./screens/AutoSignIn";
import { checkSufficientFunds, getPathKey, sendMessage } from "./utils/misc";
import useAccountsData from "./hooks/useAccountsData";
const Stack = createStackNavigator<StackParamsList>(); const Stack = createStackNavigator<StackParamsList>();
@@ -49,8 +45,6 @@ const App = (): React.JSX.Element => {
const { web3wallet, setActiveSessions } = useWalletConnect(); const { web3wallet, setActiveSessions } = useWalletConnect();
const { accounts, setCurrentIndex } = useAccounts(); const { accounts, setCurrentIndex } = useAccounts();
const { networksData, selectedNetwork, setSelectedNetwork } = useNetworks(); const { networksData, selectedNetwork, setSelectedNetwork } = useNetworks();
const { getAccountsData } = useAccountsData();
const [modalVisible, setModalVisible] = useState(false); const [modalVisible, setModalVisible] = useState(false);
const [toastVisible, setToastVisible] = useState(false); const [toastVisible, setToastVisible] = useState(false);
const [currentProposal, setCurrentProposal] = useState< const [currentProposal, setCurrentProposal] = useState<
@@ -225,58 +219,6 @@ const App = (): React.JSX.Element => {
}; };
}); });
useEffect(() => {
const handleCheckBalance = async (event: MessageEvent) => {
if (event.data.type !== 'CHECK_BALANCE') return;
const { chainId, amount } = event.data;
const network = networksData.find(net => net.chainId === chainId);
if (!network) {
console.error('Network not found');
throw new Error('Requested network not supported.');
}
if (network.namespace !== COSMOS) {
throw new Error('Unsupported network');
}
const accounts = await getAccountsData(chainId);
const account = accounts[0];
if (!account) {
throw new Error(`No accounts in network ${chainId}`);
}
const cosmosPrivKey = (
await getPathKey(`${network.namespace}:${chainId}`, account.index)
).privKey;
const sender = await DirectSecp256k1Wallet.fromKey(
Buffer.from(cosmosPrivKey.split('0x')[1], 'hex'),
network.addressPrefix
);
const client = await SigningStargateClient.connectWithSigner(network.rpcUrl!, sender);
const balance = await client.getBalance(
account.address,
network.nativeDenom!.toLowerCase()
);
const areFundsSufficient = checkSufficientFunds(amount, balance.amount);
sendMessage(event.source as Window, 'IS_SUFFICIENT', areFundsSufficient, event.origin);
};
window.addEventListener('message', handleCheckBalance);
return () => {
window.removeEventListener('message', handleCheckBalance);
};
}, [networksData, getAccountsData]);
const showWalletConnect = useMemo(() => accounts.length > 0, [accounts]); const showWalletConnect = useMemo(() => accounts.length > 0, [accounts]);
return ( return (
+12 -23
View File
@@ -1,9 +1,8 @@
import React, { createContext, useContext, useEffect, useState } from 'react'; import React, { createContext, useContext, useEffect, useState } from 'react';
import { NetworksDataState } from '../types'; import { NetworksDataState } from '../types';
import { retrieveNetworksData } from '../utils/accounts'; import { retrieveNetworksData, storeNetworkData } from '../utils/accounts';
import { DEFAULT_NETWORKS, EIP155 } from '../utils/constants'; import { DEFAULT_NETWORKS, EIP155 } from '../utils/constants';
import { setInternetCredentials } from '../utils/key-store';
const NetworksContext = createContext<{ const NetworksContext = createContext<{
networksData: NetworksDataState[]; networksData: NetworksDataState[];
@@ -28,38 +27,28 @@ const useNetworks = () => {
return networksContext; return networksContext;
}; };
const DEFAULT_NETWORKS_DATA = DEFAULT_NETWORKS.map((defaultNetwork, index) => (
{
...defaultNetwork,
networkId: index.toString()
})
);
const NetworksProvider = ({ children }: { children: React.ReactNode }) => { const NetworksProvider = ({ children }: { children: React.ReactNode }) => {
const [networksData, setNetworksData] = useState<NetworksDataState[]>(DEFAULT_NETWORKS_DATA); const [networksData, setNetworksData] = useState<NetworksDataState[]>([]);
const [networkType, setNetworkType] = useState<string>(EIP155); const [networkType, setNetworkType] = useState<string>(EIP155);
const [selectedNetwork, setSelectedNetwork] = useState<NetworksDataState>(); const [selectedNetwork, setSelectedNetwork] = useState<NetworksDataState>();
useEffect(() => { useEffect(() => {
const fetchData = async () => { const fetchData = async () => {
let retrievedNetworks = await retrieveNetworksData(); const retrievedNetworks = await retrieveNetworksData();
if (retrievedNetworks.length === 0) { if (retrievedNetworks.length === 0) {
setInternetCredentials( for (const defaultNetwork of DEFAULT_NETWORKS) {
'networks', await storeNetworkData(defaultNetwork);
'_',
JSON.stringify(DEFAULT_NETWORKS_DATA),
);
retrievedNetworks = DEFAULT_NETWORKS_DATA;
} }
}
setNetworksData(retrievedNetworks); const retrievedNewNetworks = await retrieveNetworksData();
setSelectedNetwork(retrievedNetworks[0]); setNetworksData(retrievedNewNetworks);
setSelectedNetwork(retrievedNewNetworks[0]);
}; };
if (networksData.length === 0) {
fetchData(); fetchData();
}, []); }
}, [networksData]);
useEffect(() => { useEffect(() => {
setSelectedNetwork(prevSelectedNetwork => { setSelectedNetwork(prevSelectedNetwork => {
-23
View File
@@ -1,23 +0,0 @@
import { useCallback } from "react";
import { retrieveAccounts } from "../utils/accounts";
import { useNetworks } from "../context/NetworksContext";
const useAccountsData = () => {
const { networksData } = useNetworks();
const getAccountsData = useCallback(async (chainId: string) => {
const targetNetwork = networksData.find(network => network.chainId === chainId);
if (!targetNetwork) {
return [];
}
const accounts = await retrieveAccounts(targetNetwork);
return accounts || [];
}, [networksData]);
return { getAccountsData };
};
export default useAccountsData;
-41
View File
@@ -1,41 +0,0 @@
import { useEffect } from "react";
import { createWallet } from "../utils/accounts";
import { sendMessage } from "../utils/misc";
import useAccountsData from "./useAccountsData";
import { useNetworks } from "../context/NetworksContext";
const useGetOrCreateAccounts = () => {
const { networksData } = useNetworks();
const { getAccountsData } = useAccountsData();
useEffect(() => {
const handleCreateAccounts = async (event: MessageEvent) => {
if (event.data.type !== 'REQUEST_CREATE_OR_GET_ACCOUNTS') return;
let accountsData = await getAccountsData(event.data.chainId);
if (accountsData.length === 0) {
console.log("Accounts not found, creating wallet...");
await createWallet(networksData);
// Re-fetch newly created accounts
accountsData = await getAccountsData(event.data.chainId);
}
sendMessage(
event.source as Window, 'WALLET_ACCOUNTS_DATA',
accountsData.map(account => account.address),
event.origin
);
};
window.addEventListener('message', handleCreateAccounts);
return () => {
window.removeEventListener('message', handleCreateAccounts);
};
}, [networksData, getAccountsData]);
};
export default useGetOrCreateAccounts;
+62 -12
View File
@@ -1,26 +1,43 @@
import React, { useEffect } from 'react'; import React, { useEffect, useCallback } from 'react';
import { createWallet, retrieveAccounts } from '../utils/accounts';
import { useNetworks } from '../context/NetworksContext'; import { useNetworks } from '../context/NetworksContext';
import { Account } from '../types';
import { signMessage } from '../utils/sign-message'; import { signMessage } from '../utils/sign-message';
import { EIP155 } from '../utils/constants'; import { EIP155 } from '../utils/constants';
import { sendMessage } from '../utils/misc';
import useAccountsData from '../hooks/useAccountsData';
import useGetOrCreateAccounts from '../hooks/useGetOrCreateAccounts';
export const AutoSignIn = () => { export const AutoSignIn = () => {
const { networksData } = useNetworks(); const { networksData } = useNetworks();
const { getAccountsData } = useAccountsData(); const getAccountsData = useCallback(async (chainId: string): Promise<Account[]> => {
const targetNetwork = networksData.find(network => network.chainId === chainId);
if (!targetNetwork) {
return [];
}
const accounts = await retrieveAccounts(targetNetwork);
if (!accounts || accounts.length === 0) {
return [];
}
return accounts
}, [networksData]);
const sendMessage = (
source: Window | null,
type: string,
data: any,
origin: string
): void => {
source?.postMessage({ type, data }, origin);
};
useEffect(() => { useEffect(() => {
const handleSignIn = async (event: MessageEvent) => { const handleSignIn = async (event: MessageEvent) => {
if (event.data.type !== 'AUTO_SIGN_IN') return; if (event.data.type !== 'AUTO_SIGN_IN') return;
if (event.origin !== process.env.REACT_APP_DEPLOY_APP_URL) {
console.log('Unauthorized app.');
return;
}
const accountsData = await getAccountsData(event.data.chainId); const accountsData = await getAccountsData(event.data.chainId);
if (!accountsData.length) { if (!accountsData.length) {
@@ -39,8 +56,41 @@ export const AutoSignIn = () => {
}; };
}, [networksData, getAccountsData]); }, [networksData, getAccountsData]);
// Custom hook for adding listener to get accounts data useEffect(() => {
useGetOrCreateAccounts(); const getAccountAddress = async (event: MessageEvent) => {
if (event.data.type !== 'GET_ACCOUNT_ADDRESS') return;
let isNewUser = false;
if (event.data.secret !== process.env.REACT_APP_AUTH_SECRET) {
console.log('Unauthorized app.');
return;
}
let accountsData = await getAccountsData(event.data.chainId);
if (accountsData.length === 0) {
console.log("Accounts not found, creating wallet...");
await createWallet(networksData);
isNewUser = true
// Re-fetch newly created accounts
accountsData = await getAccountsData(event.data.chainId);
}
if (!accountsData.length) {
return;
}
sendMessage(event.source as Window, 'ACCOUNT_ADDRESS_RESPONSE', { address: accountsData[0].address, isNewUser }, event.origin);
};
window.addEventListener('message', getAccountAddress);
return () => {
window.removeEventListener('message', getAccountAddress);
};
}, [networksData, getAccountsData]);
return ( return (
<> <>
+58 -9
View File
@@ -15,17 +15,15 @@ import {
SigningStargateClient, SigningStargateClient,
} from '@cosmjs/stargate'; } from '@cosmjs/stargate';
import { retrieveSingleAccount } from '../utils/accounts'; import { createWallet, retrieveAccounts, retrieveSingleAccount } from '../utils/accounts';
import AccountDetails from '../components/AccountDetails'; import AccountDetails from '../components/AccountDetails';
import styles from '../styles/stylesheet'; import styles from '../styles/stylesheet';
import DataBox from '../components/DataBox'; import DataBox from '../components/DataBox';
import { checkSufficientFunds, getPathKey, sendMessage } from '../utils/misc'; import { getPathKey } from '../utils/misc';
import { useNetworks } from '../context/NetworksContext'; import { useNetworks } from '../context/NetworksContext';
import TxErrorDialog from '../components/TxErrorDialog'; import TxErrorDialog from '../components/TxErrorDialog';
import { MEMO } from '../screens/ApproveTransfer'; import { MEMO } from '../screens/ApproveTransfer';
import { Account, NetworksDataState } from '../types'; import { Account, NetworksDataState } from '../types';
import useGetOrCreateAccounts from '../hooks/useGetOrCreateAccounts';
import useAccountsData from '../hooks/useAccountsData';
type TransactionDetails = { type TransactionDetails = {
chainId: string; chainId: string;
@@ -47,7 +45,38 @@ export const WalletEmbed = () => {
const txEventRef = useRef<MessageEvent | null>(null); const txEventRef = useRef<MessageEvent | null>(null);
const { networksData } = useNetworks(); const { networksData } = useNetworks();
const { getAccountsData } = useAccountsData();
const getAccountsData = useCallback(async (chainId: string): Promise<string[]> => {
const targetNetwork = networksData.find(network => network.chainId === chainId);
if (!targetNetwork) {
return [];
}
const accounts = await retrieveAccounts(targetNetwork);
if (!accounts || accounts.length === 0) {
return [];
}
return accounts.map(account => account.address);
}, [networksData]);
const sendMessage = (
source: Window | null,
type: string,
data: any,
origin: string
): void => {
source?.postMessage({ type, data }, origin);
};
const checkSufficientFunds = (amount: string, balance: string) => {
const amountBigNum = BigNumber.from(String(amount));
const balanceBigNum = BigNumber.from(balance);
return balanceBigNum.gt(amountBigNum);
};
useEffect(() => { useEffect(() => {
const handleGetAccounts = async (event: MessageEvent) => { const handleGetAccounts = async (event: MessageEvent) => {
@@ -70,8 +99,29 @@ export const WalletEmbed = () => {
}; };
}, [getAccountsData]); }, [getAccountsData]);
// Custom hook for adding listener to get accounts data useEffect(() => {
useGetOrCreateAccounts(); const handleCreateAccounts = async (event: MessageEvent) => {
if (event.data.type !== 'REQUEST_CREATE_OR_GET_ACCOUNTS') return;
let accountsData = await getAccountsData(event.data.chainId);
if (accountsData.length === 0) {
console.log("Accounts not found, creating wallet...");
await createWallet(networksData);
// Re-fetch newly created accounts
accountsData = await getAccountsData(event.data.chainId);
}
sendMessage(event.source as Window, 'WALLET_ACCOUNTS_DATA', accountsData, event.origin);
};
window.addEventListener('message', handleCreateAccounts);
return () => {
window.removeEventListener('message', handleCreateAccounts);
};
}, [networksData, getAccountsData]);
const handleTxRequested = useCallback( const handleTxRequested = useCallback(
async (event: MessageEvent) => { async (event: MessageEvent) => {
@@ -88,7 +138,6 @@ export const WalletEmbed = () => {
throw new Error('Requested network not supported.'); throw new Error('Requested network not supported.');
} }
console.log({ network, fromAddress, chainId, toAddress, amount });
const account = await retrieveSingleAccount(network.namespace, network.chainId, fromAddress); const account = await retrieveSingleAccount(network.namespace, network.chainId, fromAddress);
if (!account) { if (!account) {
throw new Error('Account not found for the requested address.'); throw new Error('Account not found for the requested address.');
@@ -293,7 +342,7 @@ export const WalletEmbed = () => {
</> </>
) : ( ) : (
<View style={styles.spinnerContainer}> <View style={styles.spinnerContainer}>
<View style={{ marginTop: 50 }}></View> <View style={{marginTop: 50}}></View>
<ActivityIndicator size="large" color="#0000ff" /> <ActivityIndicator size="large" color="#0000ff" />
</View> </View>
)} )}
+1 -3
View File
@@ -1,11 +1,9 @@
import { COSMOS_TESTNET_CHAINS } from './wallet-connect/COSMOSData'; import { COSMOS_TESTNET_CHAINS } from './wallet-connect/COSMOSData';
import { EIP155_CHAINS } from './wallet-connect/EIP155Data'; import { EIP155_CHAINS } from './wallet-connect/EIP155Data';
import { NetworksFormData } from '../types';
export const EIP155 = 'eip155'; export const EIP155 = 'eip155';
export const COSMOS = 'cosmos'; export const COSMOS = 'cosmos';
export const DEFAULT_NETWORKS = [
export const DEFAULT_NETWORKS: NetworksFormData[] = [
{ {
chainId: 'laconic-testnet-2', chainId: 'laconic-testnet-2',
networkName: 'laconicd testnet-2', networkName: 'laconicd testnet-2',
+4 -22
View File
@@ -1,11 +1,7 @@
/* Importing this library provides react native with a secure random source. /* Importing this library provides react native with a secure random source.
For more information, "visit https://docs.ethers.org/v5/cookbook/react-native/#cookbook-reactnative-security" */ For more information, "visit https://docs.ethers.org/v5/cookbook/react-native/#cookbook-reactnative-security" */
import 'react-native-get-random-values'; import 'react-native-get-random-values';
import { BigNumber } from 'ethers';
import { AccountData } from '@cosmjs/amino';
import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing';
import { stringToPath } from '@cosmjs/crypto';
import '@ethersproject/shims'; import '@ethersproject/shims';
import { import {
@@ -13,6 +9,10 @@ import {
resetInternetCredentials, resetInternetCredentials,
setInternetCredentials, setInternetCredentials,
} from './key-store'; } from './key-store';
import { AccountData } from '@cosmjs/amino';
import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing';
import { stringToPath } from '@cosmjs/crypto';
import { EIP155 } from './constants'; import { EIP155 } from './constants';
import { NetworksDataState } from '../types'; import { NetworksDataState } from '../types';
@@ -149,28 +149,10 @@ const resetKeyServers = async (namespace: string) => {
}); });
}; };
const sendMessage = (
source: Window | null,
type: string,
data: any,
origin: string
): void => {
source?.postMessage({ type, data }, origin);
};
const checkSufficientFunds = (amount: string, balance: string) => {
const amountBigNum = BigNumber.from(String(amount));
const balanceBigNum = BigNumber.from(balance);
return balanceBigNum.gte(amountBigNum);
};
export { export {
getMnemonic, getMnemonic,
getPathKey, getPathKey,
updateAccountIndices, updateAccountIndices,
getHDPath, getHDPath,
resetKeyServers, resetKeyServers,
sendMessage,
checkSufficientFunds,
}; };
+2 -6
View File
@@ -3,7 +3,6 @@ For more information, "visit https://docs.ethers.org/v5/cookbook/react-native/#c
import 'react-native-get-random-values'; import 'react-native-get-random-values';
import '@ethersproject/shims'; import '@ethersproject/shims';
import { fromBech32 } from '@cosmjs/encoding';
import { Wallet } from 'ethers'; import { Wallet } from 'ethers';
import { SignDoc } from 'cosmjs-types/cosmos/tx/v1beta1/tx'; import { SignDoc } from 'cosmjs-types/cosmos/tx/v1beta1/tx';
@@ -25,7 +24,7 @@ const signMessage = async ({
case EIP155: case EIP155:
return await signEthMessage(message, accountId, chainId); return await signEthMessage(message, accountId, chainId);
case COSMOS: case COSMOS:
return await signCosmosMessage(message, path.path, path.address); return await signCosmosMessage(message, path.path);
default: default:
throw new Error('Invalid wallet type'); throw new Error('Invalid wallet type');
} }
@@ -52,13 +51,10 @@ const signEthMessage = async (
const signCosmosMessage = async ( const signCosmosMessage = async (
message: string, message: string,
path: string, path: string,
cosmosAddress: string,
): Promise<string | undefined> => { ): Promise<string | undefined> => {
try { try {
const mnemonic = await getMnemonic(); const mnemonic = await getMnemonic();
const addressPrefix = fromBech32(cosmosAddress).prefix const cosmosAccount = await getCosmosAccounts(mnemonic, path);
const cosmosAccount = await getCosmosAccounts(mnemonic, path, addressPrefix);
const address = cosmosAccount.data.address; const address = cosmosAccount.data.address;
const cosmosSignature = await cosmosAccount.cosmosWallet.signAmino( const cosmosSignature = await cosmosAccount.cosmosWallet.signAmino(
address, address,
@@ -9,7 +9,6 @@ import {
StdFee, StdFee,
MsgSendEncodeObject MsgSendEncodeObject
} from '@cosmjs/stargate'; } from '@cosmjs/stargate';
import { fromBech32 } from '@cosmjs/encoding';
import { EncodeObject } from '@cosmjs/proto-signing'; import { EncodeObject } from '@cosmjs/proto-signing';
import { LaconicClient } from '@cerc-io/registry-sdk'; import { LaconicClient } from '@cerc-io/registry-sdk';
import { Buffer } from 'buffer'; import { Buffer } from 'buffer';
@@ -20,7 +19,6 @@ import { Account } from '../../types';
import { getMnemonic, getPathKey } from '../misc'; import { getMnemonic, getPathKey } from '../misc';
import { getCosmosAccounts } from '../accounts'; import { getCosmosAccounts } from '../accounts';
import { COSMOS_METHODS } from './COSMOSData'; import { COSMOS_METHODS } from './COSMOSData';
import { COSMOS } from '../constants';
interface EthSendTransaction { interface EthSendTransaction {
type: 'eth_sendTransaction'; type: 'eth_sendTransaction';
@@ -82,13 +80,7 @@ export async function approveWalletConnectRequest(
const path = (await getPathKey(`${namespace}:${chainId}`, account.index)) const path = (await getPathKey(`${namespace}:${chainId}`, account.index))
.path; .path;
const mnemonic = await getMnemonic(); const mnemonic = await getMnemonic();
const cosmosAccount = await getCosmosAccounts(mnemonic, path);
let addressPrefix: string | undefined
if (namespace === COSMOS) {
addressPrefix = fromBech32(account.address).prefix
}
const cosmosAccount = await getCosmosAccounts(mnemonic, path, addressPrefix);
const address = account.address; const address = account.address;
switch (request.method) { switch (request.method) {
@@ -10,7 +10,6 @@ services:
CERC_DEFAULT_GAS_PRICE: ${CERC_DEFAULT_GAS_PRICE:-0.025} CERC_DEFAULT_GAS_PRICE: ${CERC_DEFAULT_GAS_PRICE:-0.025}
CERC_GAS_ADJUSTMENT: ${CERC_GAS_ADJUSTMENT:-2} CERC_GAS_ADJUSTMENT: ${CERC_GAS_ADJUSTMENT:-2}
CERC_LACONICD_RPC_URL: ${CERC_LACONICD_RPC_URL:-https://laconicd.laconic.com} CERC_LACONICD_RPC_URL: ${CERC_LACONICD_RPC_URL:-https://laconicd.laconic.com}
CERC_DEPLOY_APP_URL: ${CERC_DEPLOY_APP_URL}
command: ["bash", "/scripts/run.sh"] command: ["bash", "/scripts/run.sh"]
volumes: volumes:
- ../config/app/run.sh:/scripts/run.sh - ../config/app/run.sh:/scripts/run.sh
@@ -10,14 +10,12 @@ echo "WALLET_CONNECT_ID: ${WALLET_CONNECT_ID}"
echo "CERC_DEFAULT_GAS_PRICE: ${CERC_DEFAULT_GAS_PRICE}" echo "CERC_DEFAULT_GAS_PRICE: ${CERC_DEFAULT_GAS_PRICE}"
echo "CERC_GAS_ADJUSTMENT: ${CERC_GAS_ADJUSTMENT}" echo "CERC_GAS_ADJUSTMENT: ${CERC_GAS_ADJUSTMENT}"
echo "CERC_LACONICD_RPC_URL: ${CERC_LACONICD_RPC_URL}" echo "CERC_LACONICD_RPC_URL: ${CERC_LACONICD_RPC_URL}"
echo "CERC_DEPLOY_APP_URL: ${CERC_DEPLOY_APP_URL}"
# Build with required env # Build with required env
REACT_APP_WALLET_CONNECT_PROJECT_ID=$WALLET_CONNECT_ID \ REACT_APP_WALLET_CONNECT_PROJECT_ID=$WALLET_CONNECT_ID \
REACT_APP_DEFAULT_GAS_PRICE=$CERC_DEFAULT_GAS_PRICE \ REACT_APP_DEFAULT_GAS_PRICE=$CERC_DEFAULT_GAS_PRICE \
REACT_APP_GAS_ADJUSTMENT=$CERC_GAS_ADJUSTMENT \ REACT_APP_GAS_ADJUSTMENT=$CERC_GAS_ADJUSTMENT \
REACT_APP_LACONICD_RPC_URL=$CERC_LACONICD_RPC_URL \ REACT_APP_LACONICD_RPC_URL=$CERC_LACONICD_RPC_URL \
REACT_APP_DEPLOY_APP_URL=$CERC_DEPLOY_APP_URL \
yarn build yarn build
# Define the directory and file path # Define the directory and file path
@@ -63,10 +63,6 @@ Instructions for running the `laconic-wallet-web` using [laconic-so](https://git
# RPC endpoint of laconicd node (default: https://laconicd.laconic.com) # RPC endpoint of laconicd node (default: https://laconicd.laconic.com)
CERC_LACONICD_RPC_URL= CERC_LACONICD_RPC_URL=
# Deploy app URL used for checking origin of the messages for auto-sign-in route
# Deploy app repo: https://git.vdb.to/cerc-io/snowballtools-base
CERC_DEPLOY_APP_URL=
``` ```
## Start the deployment ## Start the deployment