Feat/103 deposits (#143)
* add web3 provider using web3-react package
* add env setup, add guard for incorrect chain id
* add lib for web3-provider
* make wallet and ethereum connect dialogs look more consistent
* add setup tests file for jest-dom
* remove chain id config and just use appChainId prop, add disconnect button to invalid chainId state
* switch handling of connect dialog state to the consuming app
* rename web3-provider package to just web3
* envs for each environment so we can specify chainId
* make web3container enforce connection before rendering childen
* add web3 provider using web3-react package
* make web3container enforce connection before rendering childen
* add container for getting network params
* Move ethereum config query to web3 container
* add basic deposit form elements
* add queries required for deposits, add asset default
* add bridge contract and deposit transaction
* break txhash
* restrict etherscan link props, use etherscan link in transaction dialogs
* use smart-contracts-sdk
* split hooks and components into different files, fix find deposit logic, add styles and progress for tx dialogs
* fix text colors for dark mode
* improve tx dialogs, rename deposit query
* position use buttons, fix select validation
* fix type errors after not being in strict mode, add allowance checking
* add deposit-limits component, fix types now that strict mode is enabled
* make contract hooks have a single instance
* split out dialogs into separate files, fix icon alignment
* improve error types for use transaction hook, add number save min and max for the amount input
* add validation for ethereum and vega addresses
* add unit test for deposit form component
* add icons and shared dialog styles so it better matches order transaction dialog
* fix underline class, reset finalized deposit
* fix type imports, use i18n function, regen types
* only pass contract address to token contract hook
* add vega env, refactor so retrieving asset contract address logic isn't duplicated
* add faucet functionality, combine dialogs into single transaction-dialog
* combine rendering logic into single func of transaction dialog, rever contract hooks to just useMemo
* use to field rather than connected key
* fix props and imports in deposit form test
* share faucetable condition, pass it to token contract
* pass contracts in as params to hooks to avoid multiple contract instances
* refetch balance in wallet after deposit, add comments
* use hook state for tracking deposit via partyid, add test for use ethereum transaction hook
* add deposits lib
* add last smart contract sdk package
* fix asset import in test
* tidy up ts-ignores
* pass arg for faucetable token contract
* add provider url to env vars and use in place of infura id, also update web3-connector to only allow the chain permitted by the app
* add type guard for erc20 assets
* fix intent shadow helper function, use arrow function for isEthereumError
* update etherscan link to use env vars for url base
* rename deposit related hooks to indicate read vs write calls
* move ethereum error class and helpers to react-helpers
* add use-ethereum-read-contract hook to contain fetch logic
* remove unused import
* move validation to lib, add hex check for vega public key
* use map for transaction modal states, pass confirmed prop to transaction dialog for deposits
* remove unused import for classnames
2022-04-06 17:34:51 +00:00
|
|
|
import { gql, useSubscription } from '@apollo/client';
|
|
|
|
import type {
|
|
|
|
DepositEvent,
|
|
|
|
DepositEventVariables,
|
|
|
|
DepositEvent_busEvents_event_Deposit,
|
|
|
|
} from './__generated__/DepositEvent';
|
|
|
|
import { DepositStatus } from '@vegaprotocol/types';
|
|
|
|
import { useState } from 'react';
|
2022-04-12 18:41:07 +00:00
|
|
|
import { remove0x, useEthereumTransaction } from '@vegaprotocol/react-helpers';
|
Feat/103 deposits (#143)
* add web3 provider using web3-react package
* add env setup, add guard for incorrect chain id
* add lib for web3-provider
* make wallet and ethereum connect dialogs look more consistent
* add setup tests file for jest-dom
* remove chain id config and just use appChainId prop, add disconnect button to invalid chainId state
* switch handling of connect dialog state to the consuming app
* rename web3-provider package to just web3
* envs for each environment so we can specify chainId
* make web3container enforce connection before rendering childen
* add web3 provider using web3-react package
* make web3container enforce connection before rendering childen
* add container for getting network params
* Move ethereum config query to web3 container
* add basic deposit form elements
* add queries required for deposits, add asset default
* add bridge contract and deposit transaction
* break txhash
* restrict etherscan link props, use etherscan link in transaction dialogs
* use smart-contracts-sdk
* split hooks and components into different files, fix find deposit logic, add styles and progress for tx dialogs
* fix text colors for dark mode
* improve tx dialogs, rename deposit query
* position use buttons, fix select validation
* fix type errors after not being in strict mode, add allowance checking
* add deposit-limits component, fix types now that strict mode is enabled
* make contract hooks have a single instance
* split out dialogs into separate files, fix icon alignment
* improve error types for use transaction hook, add number save min and max for the amount input
* add validation for ethereum and vega addresses
* add unit test for deposit form component
* add icons and shared dialog styles so it better matches order transaction dialog
* fix underline class, reset finalized deposit
* fix type imports, use i18n function, regen types
* only pass contract address to token contract hook
* add vega env, refactor so retrieving asset contract address logic isn't duplicated
* add faucet functionality, combine dialogs into single transaction-dialog
* combine rendering logic into single func of transaction dialog, rever contract hooks to just useMemo
* use to field rather than connected key
* fix props and imports in deposit form test
* share faucetable condition, pass it to token contract
* pass contracts in as params to hooks to avoid multiple contract instances
* refetch balance in wallet after deposit, add comments
* use hook state for tracking deposit via partyid, add test for use ethereum transaction hook
* add deposits lib
* add last smart contract sdk package
* fix asset import in test
* tidy up ts-ignores
* pass arg for faucetable token contract
* add provider url to env vars and use in place of infura id, also update web3-connector to only allow the chain permitted by the app
* add type guard for erc20 assets
* fix intent shadow helper function, use arrow function for isEthereumError
* update etherscan link to use env vars for url base
* rename deposit related hooks to indicate read vs write calls
* move ethereum error class and helpers to react-helpers
* add use-ethereum-read-contract hook to contain fetch logic
* remove unused import
* move validation to lib, add hex check for vega public key
* use map for transaction modal states, pass confirmed prop to transaction dialog for deposits
* remove unused import for classnames
2022-04-06 17:34:51 +00:00
|
|
|
import type { VegaErc20Bridge } from '@vegaprotocol/smart-contracts-sdk';
|
|
|
|
|
|
|
|
const DEPOSIT_EVENT_SUB = gql`
|
|
|
|
subscription DepositEvent($partyId: ID!) {
|
|
|
|
busEvents(partyId: $partyId, batchSize: 0, types: [Deposit]) {
|
|
|
|
event {
|
|
|
|
... on Deposit {
|
|
|
|
id
|
|
|
|
txHash
|
|
|
|
status
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
|
|
|
export const useSubmitDeposit = (
|
|
|
|
contract: VegaErc20Bridge | null,
|
|
|
|
confirmations: number
|
|
|
|
) => {
|
|
|
|
const [confirmationEvent, setConfirmationEvent] =
|
|
|
|
useState<DepositEvent_busEvents_event_Deposit | null>(null);
|
|
|
|
// Store public key from contract arguments for use in the subscription,
|
|
|
|
// NOTE: it may be different from the users connected key
|
|
|
|
const [partyId, setPartyId] = useState<string | null>(null);
|
|
|
|
|
|
|
|
const transaction = useEthereumTransaction<{
|
|
|
|
assetSource: string;
|
|
|
|
amount: string;
|
|
|
|
vegaPublicKey: string;
|
|
|
|
}>((args) => {
|
|
|
|
if (!contract) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
// New deposit started clear old confirmation event and start
|
|
|
|
// tracking deposits for the new public key
|
|
|
|
setConfirmationEvent(null);
|
|
|
|
setPartyId(args.vegaPublicKey);
|
|
|
|
|
|
|
|
return contract.depositAsset(
|
|
|
|
args.assetSource,
|
|
|
|
args.amount,
|
|
|
|
args.vegaPublicKey
|
|
|
|
);
|
|
|
|
}, confirmations);
|
|
|
|
|
|
|
|
useSubscription<DepositEvent, DepositEventVariables>(DEPOSIT_EVENT_SUB, {
|
2022-04-12 18:41:07 +00:00
|
|
|
variables: { partyId: partyId ? remove0x(partyId) : '' },
|
Feat/103 deposits (#143)
* add web3 provider using web3-react package
* add env setup, add guard for incorrect chain id
* add lib for web3-provider
* make wallet and ethereum connect dialogs look more consistent
* add setup tests file for jest-dom
* remove chain id config and just use appChainId prop, add disconnect button to invalid chainId state
* switch handling of connect dialog state to the consuming app
* rename web3-provider package to just web3
* envs for each environment so we can specify chainId
* make web3container enforce connection before rendering childen
* add web3 provider using web3-react package
* make web3container enforce connection before rendering childen
* add container for getting network params
* Move ethereum config query to web3 container
* add basic deposit form elements
* add queries required for deposits, add asset default
* add bridge contract and deposit transaction
* break txhash
* restrict etherscan link props, use etherscan link in transaction dialogs
* use smart-contracts-sdk
* split hooks and components into different files, fix find deposit logic, add styles and progress for tx dialogs
* fix text colors for dark mode
* improve tx dialogs, rename deposit query
* position use buttons, fix select validation
* fix type errors after not being in strict mode, add allowance checking
* add deposit-limits component, fix types now that strict mode is enabled
* make contract hooks have a single instance
* split out dialogs into separate files, fix icon alignment
* improve error types for use transaction hook, add number save min and max for the amount input
* add validation for ethereum and vega addresses
* add unit test for deposit form component
* add icons and shared dialog styles so it better matches order transaction dialog
* fix underline class, reset finalized deposit
* fix type imports, use i18n function, regen types
* only pass contract address to token contract hook
* add vega env, refactor so retrieving asset contract address logic isn't duplicated
* add faucet functionality, combine dialogs into single transaction-dialog
* combine rendering logic into single func of transaction dialog, rever contract hooks to just useMemo
* use to field rather than connected key
* fix props and imports in deposit form test
* share faucetable condition, pass it to token contract
* pass contracts in as params to hooks to avoid multiple contract instances
* refetch balance in wallet after deposit, add comments
* use hook state for tracking deposit via partyid, add test for use ethereum transaction hook
* add deposits lib
* add last smart contract sdk package
* fix asset import in test
* tidy up ts-ignores
* pass arg for faucetable token contract
* add provider url to env vars and use in place of infura id, also update web3-connector to only allow the chain permitted by the app
* add type guard for erc20 assets
* fix intent shadow helper function, use arrow function for isEthereumError
* update etherscan link to use env vars for url base
* rename deposit related hooks to indicate read vs write calls
* move ethereum error class and helpers to react-helpers
* add use-ethereum-read-contract hook to contain fetch logic
* remove unused import
* move validation to lib, add hex check for vega public key
* use map for transaction modal states, pass confirmed prop to transaction dialog for deposits
* remove unused import for classnames
2022-04-06 17:34:51 +00:00
|
|
|
skip: !partyId,
|
|
|
|
onSubscriptionData: ({ subscriptionData }) => {
|
|
|
|
if (!subscriptionData.data?.busEvents?.length) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const matchingDeposit = subscriptionData.data.busEvents.find((e) => {
|
|
|
|
if (e.event.__typename !== 'Deposit') {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
e.event.txHash === transaction.txHash &&
|
|
|
|
// Note there is a bug in data node where the subscription is not emitted when the status
|
|
|
|
// changes from 'Open' to 'Finalized' as a result the deposit UI will hang in a pending state right now
|
|
|
|
// https://github.com/vegaprotocol/data-node/issues/460
|
|
|
|
e.event.status === DepositStatus.Finalized
|
|
|
|
) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
if (matchingDeposit && matchingDeposit.event.__typename === 'Deposit') {
|
|
|
|
setConfirmationEvent(matchingDeposit.event);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
return {
|
|
|
|
...transaction,
|
|
|
|
confirmationEvent,
|
|
|
|
};
|
|
|
|
};
|