This project is a Node.js-based Express application designed to facilitate interactions with an Ethereum smart contract. It provides a simple and secure RESTful API that allows users to deposit Ether or tokens into the contract by sending a POST request to a designated endpoint. The application is built to handle various deposit options and manages the entire transaction process on the Ethereum blockchain.
-
Express Framework:
- The application is built using the Express framework, providing a lightweight and flexible structure for handling HTTP requests and responses.
- JSON parsing middleware is used to process incoming request bodies.
-
Ethers.js:
- Ethers.js is utilized to connect to the Ethereum blockchain and interact with the smart contract. This library provides an easy and secure way to manage wallet credentials and execute transactions.
- The application uses a JSON-RPC provider (e.g., Infura) to connect to the Ethereum network and a wallet private key to sign transactions.
-
Smart Contract Interaction:
- The smart contract's ABI (Application Binary Interface) is loaded from a JSON file (
abi.json
), enabling the application to call the contract'sdeposit
function. - The contract address is sourced from environment variables, ensuring flexibility in deploying the application to different environments.
- The smart contract's ABI (Application Binary Interface) is loaded from a JSON file (
-
Environment Configuration:
- Environment variables, stored in a
.env
file, are used to configure critical parameters like the contract address, Infura URL, and wallet private key. This ensures that sensitive information is not hard-coded and can be easily managed across different environments.
- Environment variables, stored in a
-
Deposit Functionality:
- The application handles deposits in two modes:
- Ether Deposit: When
depositOption
is set to0
, the user deposits Ether directly into the contract. The amount is specified in Ether, and the application handles the conversion usingethers.utils.parseEther()
. - Token Deposit: For other
depositOption
values, the application allows token deposits. The amount is specified in token units, and the conversion is handled usingethers.utils.parseUnits()
with 18 decimals (commonly used for ERC-20 tokens).
- Ether Deposit: When
- The transaction is sent to the blockchain, and the application waits for its confirmation before sending a response back to the client.
- The application handles deposits in two modes:
-
Error Handling:
- The application performs basic validation on incoming requests, ensuring that the
depositOption
is a number and that anamount
is provided. - It includes comprehensive error handling to catch and log any issues that occur during the transaction process, providing detailed feedback to the client via the API response.
- The application performs basic validation on incoming requests, ensuring that the
-
Deployment:
- The application listens on a port defined in the environment variables (
PORT
) and can be easily deployed to any Node.js-compatible server environment. - It is designed to be secure and performant, with the ability to scale as needed for higher transaction volumes.
- The application listens on a port defined in the environment variables (
This project is ideal for developers looking to integrate Ethereum smart contract interactions into their applications, offering a clear and extendable starting point for building blockchain-enabled APIs.
The TransferToken
contract is a Solidity-based smart contract designed for handling deposits in both Ether (ETH) and ERC-20 tokens. This contract facilitates the distribution of deposited funds across three different addresses: a pool address, a fees address, and a maintenance address. The contract supports deposits in ETH as well as in a specified ERC-20 token (e.g., USDT). It is built on the Ethereum blockchain using Solidity and leverages the OpenZeppelin library for interacting with ERC-20 tokens.
-
State Variables:
poolAddress
: This address receives 90% of the deposited amount, acting as the main recipient of the funds.feesAddress
: This address receives 7.5% of the deposited amount, likely to cover transaction fees or other operational costs.maintenanceAddress
: This address receives 2.5% of the deposited amount, likely designated for maintenance or other specific purposes.tokenContract
: An instance of theIERC20
interface, representing the ERC-20 token contract that theTransferToken
contract interacts with. This allows the contract to transfer tokens on behalf of the user.
-
Constructor:
- The constructor initializes the contract with the addresses for the pool, fees, maintenance, and the ERC-20 token contract.
- The parameters
_poolAddress
,_feesAddress
,_maintenanceAddress
, and_contractAddress
are passed during deployment to set the respective state variables.
-
Deposit Function (
deposit
):- The
deposit
function is the core feature of the contract, allowing users to deposit either ETH or a specified ERC-20 token. - The function accepts two parameters:
_depositOption
: Auint256
that determines whether the deposit is in ETH or an ERC-20 token. A value of0
indicates an ETH deposit, while any other value indicates a token deposit.amount
: Auint256
representing the amount of the deposit. For ETH deposits, this parameter is ignored asmsg.value
(the amount of ETH sent with the transaction) is used instead.
ETH Deposits (
_depositOption == 0
):- When the deposit option is
0
, the contract expects an ETH deposit. - The function requires that
msg.value
(the amount of ETH sent) is greater than zero, ensuring that the deposit is not empty. - The deposited ETH is divided into three portions:
90%
is transferred to thepoolAddress
.7.5%
is transferred to thefeesAddress
.2.5%
is transferred to themaintenanceAddress
.
- The ETH transfers are executed using the
call
method, which is a low-level function to send ETH. Each transfer checks for success, and if any transfer fails, the transaction is reverted.
Token Deposits (
_depositOption != 0
):- For non-ETH deposits, the contract interacts with the specified ERC-20 token.
- The function checks that the sender has a sufficient balance of the token by comparing
amount
to the sender's token balance using thebalanceOf
method. - The token amount is divided similarly:
90%
of the tokens are transferred to thepoolAddress
.7.5%
of the tokens are transferred to thefeesAddress
.2.5%
of the tokens are transferred to themaintenanceAddress
.
- The
transferFrom
method is used to move tokens from the sender to each of the specified addresses. This method requires that the sender has approved the contract to spend their tokens beforehand.
- The
-
Security and Error Handling:
- The contract uses
require
statements to enforce conditions and ensure that errors are caught early. This includes checking for sufficient ETH or token balances and ensuring that transfers succeed. - Each transfer is followed by a success check. If any transfer fails (e.g., due to an out-of-gas error or insufficient balance), the entire transaction is reverted, and all changes are undone.
- The contract uses
-
External Libraries:
- The contract imports
IERC20
from the OpenZeppelin library, which provides a standard interface for interacting with ERC-20 tokens. This ensures that the contract can work with any ERC-20 token that adheres to the standard.
- The contract imports
-
Multi-Party Payment Distribution: The
TransferToken
contract is ideal for scenarios where deposits need to be split across multiple recipients. For example, a decentralized application (dApp) could use this contract to distribute user payments to a main pool, cover transaction fees, and allocate funds for maintenance. -
Supporting Multiple Payment Methods: The contract's ability to handle both ETH and ERC-20 tokens makes it versatile for different types of payments. Users can choose to deposit in either ETH or a supported token like USDT, depending on their preference or the dApp's requirements.
- Approval for Token Transfers:
Before using the
deposit
function for ERC-20 tokens, users must approve theTransferToken
contract to spend their tokens using theapprove
function provided by the token contract.
This contract is a robust solution for managing and distributing funds across multiple addresses in a blockchain-based application.
The App
component is a React application that provides a user interface for interacting with the TransferToken
smart contract deployed on the Ethereum blockchain. This interface allows users to deposit either Ether (ETH) or an ERC-20 token (e.g., USDT) into the smart contract via a simple web form. The application is built using React and Axios for making HTTP requests to a backend server that interacts with the blockchain.
-
State Management:
- The application uses React's
useState
hook to manage the component's state:depositOption
: Tracks the selected deposit option, where0
represents ETH and1
represents the ERC-20 token.amount
: Holds the amount of ETH or tokens the user wishes to deposit.response
: Stores the response message from the server after attempting to make a deposit.
- The application uses React's
-
Form Elements:
- The application provides a simple form with two main inputs:
- Deposit Option: A dropdown (select element) that allows the user to choose between depositing ETH or an ERC-20 token. The options correspond to the contract's handling logic, where
0
is for ETH and1
is for the ERC-20 token. - Amount: A text input field where the user enters the amount of ETH or tokens they want to deposit.
- Deposit Option: A dropdown (select element) that allows the user to choose between depositing ETH or an ERC-20 token. The options correspond to the contract's handling logic, where
- The application provides a simple form with two main inputs:
-
Handle Deposit Function (
handleDeposit
):- The
handleDeposit
function is an asynchronous function that is triggered when the user clicks the "Deposit" button. - This function prepares the data payload (including the selected deposit option and amount) and sends it to the backend server using Axios, which makes a POST request to the
/deposit
endpoint. - On a successful deposit, the transaction hash returned by the server is displayed to the user as a confirmation of success.
- If an error occurs (e.g., insufficient funds, failed transaction), the error message is captured and displayed to the user.
- The
-
Axios for HTTP Requests:
- Axios is used to send HTTP POST requests to the backend server running on
http://localhost:5000/deposit
. This server is responsible for interacting with the Ethereum smart contract. - The request payload includes the
depositOption
andamount
, which are passed to the server and used to interact with theTransferToken
contract.
- Axios is used to send HTTP POST requests to the backend server running on
-
User Feedback:
- The application provides real-time feedback to the user based on the response from the server. This feedback is crucial for informing the user about the success or failure of their deposit attempt.
- The
response
state is updated with either the transaction hash (on success) or an error message (on failure), which is then displayed in the UI.
- The user interface is designed to be straightforward and user-friendly:
- Title: A heading (
<h2>
) indicates the purpose of the page: "Deposit to TransferToken Contract". - Form Elements:
- A dropdown for selecting the deposit option (ETH or ERC-20 token).
- An input field for entering the amount to be deposited.
- Action Button: A "Deposit" button triggers the
handleDeposit
function when clicked. - Response Display: If a response is available (whether success or error), it is displayed below the form.
- Title: A heading (
-
User Interaction:
- The user selects the deposit option (ETH or USDT) from the dropdown menu.
- The user enters the desired amount in the text input field.
- The user clicks the "Deposit" button to submit the form.
-
Backend Communication:
- The
handleDeposit
function captures the form data and sends it to the backend server. - The server processes the request by interacting with the
TransferToken
smart contract on the Ethereum blockchain, either transferring ETH or tokens as specified by the user.
- The
-
Transaction Feedback:
- If the transaction is successful, the server responds with a transaction hash, confirming that the deposit was processed on the blockchain. This hash is then displayed to the user.
- If there is an error (e.g., insufficient funds or a failed transfer), the error message is displayed to the user, allowing them to understand what went wrong.
-
Network Configuration:
- The application assumes that the backend server is running locally on
http://localhost:5000
. In a production environment, this URL would need to be updated to point to the appropriate server hosting the backend.
- The application assumes that the backend server is running locally on
-
Token Approval:
- For ERC-20 token deposits, the user must have previously approved the
TransferToken
contract to spend their tokens via the token contract'sapprove
function.
- For ERC-20 token deposits, the user must have previously approved the
-
Error Handling:
- The application includes basic error handling, capturing and displaying errors from the backend. However, additional validation (e.g., ensuring the amount is a positive number) could be added to improve the user experience.
This React component serves as a front-end interface for interacting with the TransferToken
smart contract, providing a simple and effective way for users to make deposits and receive feedback on their transactions.