|
Deepak Thakur Oodles

Deepak Thakur (Backend-Sr. Lead Development)

Experience:5+ yrs

Deepak is an accomplished backend developer who specializes in Mean technology. He is highly skilled in a variety of technologies including Javascript, Node.js, Express.js, MongoDB, Postgres, MySQL, DynamoDB, Redis, AWS Lambda, Solidity, WEB3.0 and EVM based blockchains. He has worked on several successful projects such as Onchain Index - a crypto investment platform, Distinct-NFT - an NFT marketplace, SWAPPER - a decentralized marketplace, GAMAVRS- a poker NFT marketplace, Moments- a poker NFT marketplace, Hydra- an automated market making system, Bakestarter- an IDO launchpad, Cognito, Safecamz- a CCTV management suite, and many others. With his vast knowledge and expertise, he is capable of handling complex tasks and delivering high-quality solutions to meet the needs of his clients.

Deepak Thakur Oodles
Deepak Thakur
(Sr. Lead Development)

Deepak is an accomplished backend developer who specializes in Mean technology. He is highly skilled in a variety of technologies including Javascript, Node.js, Express.js, MongoDB, Postgres, MySQL, DynamoDB, Redis, AWS Lambda, Solidity, WEB3.0 and EVM based blockchains. He has worked on several successful projects such as Onchain Index - a crypto investment platform, Distinct-NFT - an NFT marketplace, SWAPPER - a decentralized marketplace, GAMAVRS- a poker NFT marketplace, Moments- a poker NFT marketplace, Hydra- an automated market making system, Bakestarter- an IDO launchpad, Cognito, Safecamz- a CCTV management suite, and many others. With his vast knowledge and expertise, he is capable of handling complex tasks and delivering high-quality solutions to meet the needs of his clients.

LanguageLanguages

DotEnglish

Fluent

DotHindi

Fluent

Skills
Skills

Dotzk-SNARK

80%

DotChainlink

80%

DotSolana

80%

DotTruffle

80%

DotCoinbase API

80%

DotSmart Contract

100%

DotThe Graph

60%

DotJavascript

80%

DotSensors/IoT

80%

DotEthereum

100%

DotMetaMask

80%

DotUniswap

80%

DotAngular/AngularJS

40%

DotNode Js

100%

DotDocker

60%

DotSolidity

100%

DotHardhat

80%

DotPostgres

80%

DotBlockchain

80%

DotVyper

60%

DotTON Blockchain

80%

DotDyanmoDB

80%

DotRemix IDE

80%

DotTelegram Bot

60%

DotNestJS

100%

DotGnosis Safe

80%

DotIPFS

80%

DotOpenZeppelin

80%

DotEtherscan

80%

DotERC-721

60%

Dotweb4.js

100%

DotERC-1155

80%
ExpWork Experience / Trainings / Internship

Mar 2020-Present

Senior Lead Development

Well done Tech Park Sec-48 Gurugram


Oodles Technologies

Well done Tech Park Sec-48 Gurugram

Mar 2020-Present

EducationEducation

2015-2019

Dot

Guru Gobind Singh Indraprastha University

B.TECH-E.C.E

Top Blog Posts
How to Implement a Merkle Tree for Secure Data Verification

What is a Merkle Tree?

 

A Merkle Tree is a binary tree structure where each node contains a hash. Leaf nodes hold hashes of individual data blocks, while non-leaf nodes contain hashes formed by combining the hashes of their children. The Merkle root is at the top of the tree, a single hash representing the entire dataset's integrity. For more related to blockchain and smart contracts, visit our smart contract development services

 

To illustrate, a simple Merkle Tree with four transactions (A, B, C, D) might look like this:

 

            Root
           /    \
       HashAB   HashCD
       /    \    /    \
     HashA  HashB  HashC  HashD 

 

  • Each leaf node (HashA, HashB, etc.) is derived from hashing individual transactions.
  • Each non-leaf node is derived by hashing the concatenated values of its child nodes.
  • The Merkle root is the final hash, summarizing the entire tree.

     

    Merkle Trees are widely used in blockchain, where they help prove data integrity without requiring all data to be present.

 

You may also like | How to Write and Deploy Modular Smart Contracts

 

Why Use a Merkle Tree in Blockchain?

 

Merkle Trees play a fundamental role in blockchain networks. They offer several advantages:

 

  1. Efficient Verification: Verifying data integrity can be done by checking only a subset of hashes rather than the whole dataset.
  2. Data Privacy: With a Merkle Tree, individual blocks or transactions can be verified without revealing their content.
  3. Efficient Storage: Only the Merkle root needs to be stored on-chain, reducing storage requirements.

 

Also, Read | ERC 4337 : Account Abstraction for Ethereum Smart Contract Wallets

 

Implementing a Merkle Tree in Solidity

 

Let's dive into a Solidity implementation. In this example, we'll create a simple Merkle Tree contract where users can verify whether a specific data entry is part of a dataset represented by a Merkle root.

 

Step 1: Setting Up the Contract

 

We'll start by defining a contract and importing OpenZeppelin's MerkleProof library, which provides helper functions for verifying proofs.

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

contract MerkleTreeExample {
    bytes32 public merkleRoot;

    constructor(bytes32 _root) {
        merkleRoot = _root;
    }

    function verify(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }
}

 

  1. Merkle Root: The contract stores a merkleRoot, which represents the root hash of the Merkle Tree.
  2. Constructor: When deploying the contract, we pass a merkleRoot representing the tree's top-level hash.
  3. Verify Function: The verify function takes a proof (array of sibling hashes) and a leaf node. It then uses OpenZeppelin MerkleProof.verify to check if the leaf is part of the Merkle Tree represented by merkleRoot.

 

Also, Explore | How to Create Play-to-Earn Gaming Smart Contracts

 

Step 2: Generating Proofs

 

A Merkle proof is required to verify that a data block is in the tree. A Merkle proof is an array of hashes that helps trace a path from a leaf to the root. Off-chain tools or scripts are typically used to generate Merkle proofs. Here's an example in JavaScript for generating a proof:

 

const { MerkleTree } = require('merkletreejs');
const keccak256 = require('keccak256');

// Sample data
const leaves = ['A', 'B', 'C', 'D'].map(x => keccak256(x));
const tree = new MerkleTree(leaves, keccak256, { sortPairs: true });
const root = tree.getRoot().toString('hex');

// Get proof for leaf 'A'
const leaf = keccak256('A');
const proof = tree.getProof(leaf).map(x => x.data.toString('hex'));

console.log("Merkle Root:", root);
console.log("Proof for 'A':", proof);

 

Also, Read | How to Create a Smart Contract for Lottery System

 

Step 3: Verifying Proofs On-Chain

 

Once a Merkle proof is generated, it can be passed to our Solidity contract to verify membership. The verify function will only return true if the proof successfully traces the leaf to the Merkle root.

 

Here's how it works:

 

  1. Input: Pass the proof (array of sibling hashes) and leaf (hash of data block) to the verify function.
  2. Result: The function returns true if the leaf can be traced to the merkleRoot using the proof, confirming that the data is part of the tree.

 

Example Scenario

 

Imagine you want to verify whether a transaction 0xabc123... is part of a dataset. Here's how it would look on-chain:

 

  1. Generate a proof for 0xabc123... off-chain.
  2. Call verify(proof, leaf) on the contract with the proof and leaf.
  3. The function returns true if the transaction is part of the dataset.

     

    Practical Use Cases

 

Merkle Trees are powerful tools in various blockchain applications:

 

  • Token Airdrops: Use a Merkle Tree to verify wallet eligibility for an airdrop without storing the entire list on-chain.
  • Zero-Knowledge Proofs: Efficiently verify membership in a set while preserving privacy.
  • File Storage Verification: Services like IPFS can use Merkle Trees to prove that file chunks haven't been tampered with.
  • Voting Systems: Merkle Trees can validate votes securely without disclosing vote details, ensuring privacy.

 

Also, Check | How to Create a Smart Contract for Lottery System

 

Conclusion

 

In conclusion, Merkle Trees are indispensable in blockchain technology, providing efficient and secure ways to verify data integrity without storing or revealing entire datasets. By hashing and organizing data into a tree structure, they allow users to verify specific data entries with minimal storage requirements and strong cryptographic security. This makes them ideal for diverse applications, such as token airdrops, file storage verification, and privacy-preserving voting systems. Implementing Merkle Trees in Solidity enables seamless on-chain data verification, enhancing trust and security within decentralized ecosystems. If you have a blockchain-powered vision that you want to bring into reality, connect with our skilled solidity developers to get started. 

Category: Blockchain
How to Create a Compressed NFT on Solana

In the rapidly evolving world of digital assets, NFT development has emerged as a groundbreaking way to represent ownership and authenticity of unique items on the blockchain. Among the myriad of platforms for blockchain app development with NFTs, Solana stands out for its high speed and low transaction costs. But what if we could make these digital collectibles even more efficient? Enter compressed NFTs—an innovative approach that leverages Solana's capabilities to create more scalable and cost-effective NFTs. In this guide, explore how to create compressed NFTs on Solana, unlocking new possibilities for artists, collectors, and businesses alike.

 

Also, Check | How to Setup and Run a Solana RPC Node

 

Creating a Compressed NFT on Solana

 

What You Will Need:

 

  • Prior experience with Solana NFTs
  • Node.js (version 16.15 or higher)
  • Proficiency in TypeScript
  • Access to a QuickNode endpoint with a DAS Add-on installed

     

Dependencies: 

 

- @metaplex-foundation/digital-asset-standard-api 

- @metaplex-foundation/umi 

- @metaplex-foundation/umi-bundle-defaults 

- @metaplex-foundation/mpl-bubblegum 

- @metaplex-foundation/mpl-token-metadata 

- @solana/spl-account-compression 

- @solana/spl-token 

- @solana/web3.js 

 

Key Concepts: 

 

 - Hashing: Converting data into fixed-size strings

 - Merkle Trees: Efficient storage and verification of extensive datasets 

 

You may also like | A Detailed Guide to NFT Minting on Solana using Metaplex API

 

Steps: 1.) Create a Merkel tree

 

const maxDepthSizePair: ValidDepthSizePair = { maxDepth: 14, maxBufferSize: 64, }; 
const canopyDepth = maxDepthSizePair.maxDepth - 5; const payer = Keypair.generate(); 
const treeKeypair = Keypair.generate(); 
const tree = await createTree(connection, payer, treeKeypair, maxDepthSizePair, canopyDepth); 
async function createTree( connection: Connection, payer: Keypair, treeKeypair: Keypair, maxDepthSizePair: ValidDepthSizePair, canopyDepth: number = 0, ) { 
	// derive the tree's authority (PDA), owned by Bubblegum 
	const [treeAuthority, _bump] = PublicKey.findProgramAddressSync( [treeKeypair.publicKey.toBuffer()], BUBBLEGUM_PROGRAM_ID, ); // allocate the tree's account on chain with the space 
	
	// NOTE: this will compute the space needed to store the tree on chain (and the lamports required to store it) 
	const allocTreeIx = await createAllocTreeIx( connection, treeKeypair.publicKey, payer.publicKey, maxDepthSizePair, canopyDepth, ); // create the instruction to actually create the tree 
	
	const createTreeIx = createCreateTreeInstruction( 
	{ payer: payer.publicKey, treeCreator: payer.publicKey, treeAuthority, merkleTree: treeKeypair.publicKey, compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, logWrapper: SPL_NOOP_PROGRAM_ID, }, 
	{ maxBufferSize: maxDepthSizePair.maxBufferSize, maxDepth: maxDepthSizePair.maxDepth, public: false, }, 
	BUBBLEGUM_PROGRAM_ID, ); 
	
	try { 
	 	// create and send the transaction to initialize the tree 
	 	const tx = new Transaction().add(allocTreeIx).add(createTreeIx); 
	 	tx.feePayer = payer.publicKey; // send the transaction 
	 	await sendAndConfirmTransaction( connection, tx, // ensuring the treeKeypair PDA and the payer are BOTH signers 
	 	[treeKeypair, payer], { 
	 		commitment: "confirmed", skipPreflight: true, 
	 	}, ); 
	 	console.log("\nMerkle tree created successfully!"); 
	 	return { treeAuthority, treeAddress: treeKeypair.publicKey }; 
	 } catch (err: any) { 
	 	console.error("\nFailed to create merkle tree:", err); throw err; 
	 } 
} 

 

2.) Create collection 

 

// Define the metadata to be used for creating the NFT collection 
const collectionMetadataV3: CreateMetadataAccountArgsV3 = { // ...The usual metadata of an NFT }; 
const collection = await createCollection(connection, payer, collectionMetadataV3);
async function createCollection( connection: Connection, payer: Keypair, metadataV3: CreateMetadataAccountArgsV3, ) { 
	const mint = await createMint( connection, payer, payer.publicKey, payer.publicKey, 0, ); 
	
	const tokenAccount = await createAccount( connection, payer, mint, payer.publicKey, ); 
	
	await mintTo( connection, payer, mint, tokenAccount, payer, 1, [], undefined, TOKEN_PROGRAM_ID, ); 
	
	const [metadataAccount, _bump] = PublicKey.findProgramAddressSync( [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], TOKEN_METADATA_PROGRAM_ID, ); 
				   	 
	const createMetadataIx = createCreateMetadataAccountV3Instruction( 
		{ metadata: metadataAccount, mint: mint, mintAuthority: payer.publicKey, payer: payer.publicKey, updateAuthority: payer.publicKey, }, 
		{ createMetadataAccountArgsV3: metadataV3, }, 
	); 
	
	const [masterEditionAccount, _bump2] = PublicKey.findProgramAddressSync( [ Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), Buffer.from("edition"), 		
	], TOKEN_METADATA_PROGRAM_ID, ); 
	
	const createMasterEditionIx = createCreateMasterEditionV3Instruction( 
		{ edition: masterEditionAccount, mint: mint, mintAuthority: payer.publicKey, payer: payer.publicKey, updateAuthority: payer.publicKey, metadata: metadataAccount, }, 
		{ createMasterEditionArgs: { maxSupply: 0, }, }, 
	); 
	const collectionSizeIX = createSetCollectionSizeInstruction( 
		{ collectionMetadata: metadataAccount, collectionAuthority: payer.publicKey, collectionMint: mint, }, 
		{ setCollectionSizeArgs: { size: 10000 }, }, 
	); 
	try { 
		const tx = new Transaction() .add(createMetadataIx) .add(createMasterEditionIx) .add(collectionSizeIX); 
		tx.feePayer = payer.publicKey; 
		await sendAndConfirmTransaction(connection, tx, [payer], { 
			commitment: "confirmed", skipPreflight: true, }); 
		} catch (err) { 
			console.error("\nFailed to create collection:", err); 
			throw err; 
		} return { mint, tokenAccount, metadataAccount, masterEditionAccount };
	} 

 

3.) Mint Compressed NFTs into the collection. 

 

const compressedNFTMetadata: MetadataArgs = { // The usual NFT Metadata }; 
const receiver = Keypair.generate(); 
await mintCompressedNFT( connection, payer, treeKeypair.publicKey, collection.mint, collection.metadataAccount, collection.masterEditionAccount, compressedNFTMetadata, receiver.publicKey, ); 
async function mintCompressedNFT( connection: Connection, payer: Keypair, treeAddress: PublicKey, collectionMint: PublicKey, collectionMetadata: PublicKey, collectionMasterEditionAccount: PublicKey, compressedNFTMetadata: MetadataArgs, receiverAddress: PublicKey, ) { 
	const treeAuthority = PublicKey.findProgramAddressSync( [treeAddress.toBuffer()], BUBBLEGUM_PROGRAM_ID, )[0];
	const bubblegumSigner = PublicKey.findProgramAddressSync( [Buffer.from("collection_cpi")], BUBBLEGUM_PROGRAM_ID, )[0]; 
	const metadataArgs = Object.assign(compressedNFTMetadata, { collection: { key: collectionMint, verified: false }, }); 
	const mintIx: TransactionInstruction = createMintToCollectionV1Instruction( 
		{ payer: payer.publicKey, merkleTree: treeAddress, treeAuthority, treeDelegate: payer.publicKey, leafOwner: receiverAddress, leafDelegate: receiverAddress, 	 
		collectionAuthority: payer.publicKey, collectionAuthorityRecordPda: BUBBLEGUM_PROGRAM_ID, collectionMint: collectionMint, collectionMetadata: collectionMetadata, 
		editionAccount: collectionMasterEditionAccount, compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, logWrapper: SPL_NOOP_PROGRAM_ID, bubblegumSigner: bubblegumSigner, 
		tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, }, { metadataArgs, }, ); 
	
	try { 
		const tx = new Transaction().add(mintIx); 
		tx.feePayer = payer.publicKey; 
		const txSignature = await sendAndConfirmTransaction(connection, tx, [payer], { commitment: "confirmed", skipPreflight: true, }); 
		return txSignature; 
	} catch (err) { 
		console.error("\nFailed to mint compressed NFT:", err); 
		throw err; 
	} 
}

 

Execution: -

 

Check Costs:

 

Evaluate the expenses associated with initializing a Merkle Tree for a specific number of compressed NFTs.

 

Create Merkle Tree: 

 

Generate the Merkle Tree and configure its parameters. 

 

Create collection: 

 

Mint NFTs into a collection. 

 

Read also | A Complete Guide on How to Create SPL Tokens on Solana

 

Conclusion 

 

This blog guide demonstrates the successful minting and retrieving of compressed NFTs on Solana using Merkle trees, optimizing storage and verification processes. Connect with our blockchain developers today if you have similar projects in mind.

 

Above Blog References List: (Check the below links)

 

Category: Blockchain
A Thorough Analysis of AMM_Automated Market Maker

Introduction

 

The automated market-making concept came into crypto very recently. It aims at highlighting coins by increasing their price drastically and the whole trading of the coins is automated or we can say done through bots.


 

How it works

 

As we know the prices are very volatile so to make huge profits and highlight your token in the market we use bots and this whole process is called automated market making.

Things you need to make your bot:

 

  1. Strategies: It is basically telling the bot when and how the trading should take place.

 

  1. Exchange: Specify the exchange you are targeting i.e uni swap, pancake, sushi or all

 

  1. Wallets: Create wallets for trading

 

  1. Scripts: These are basically the piece of code that will be interacting with the functions of exchange and help us do the trading


 

Let's deep dive into it and understand these concepts through coding

 

a.) Mention  strategy

 

Let's say our strategy is to buy when the price goes down 5% in one hour

Sell: When price increases by 5% in one hour


 

b.) Exchange

 

Let's say we choose platform  pancake

So we will need the contract addresses of router contract, factory contract, and their abis as well


c.)  Wallet 

 

We can create wallets by using the web3 library and let's say we want to create wallets for Binance smart chain


let account = web3.eth.accounts.create()

This account object will be holding the public and private keys of the wallet


d.) Scripts 

 

  • To buy tokens on pancake swap through BNB

 

swapExactETHForTokens(slippageAmount, path, publicKey, deadline)

 

slippageAmount: It is basically the minimum amount of token you need in exchange for x amount of BNB

 

path: It is an array of token addresses you want to swap

 

publicKey: wallet address at which you want to receive tokens

 

deadline: Maximum time it should take to execute this transaction


 

  • To sell tokens on pancake swap 

 

swapExactTokensForETHSupportingFeeOnTransferTokens(tokenSpent, slippageAmount, path, wallet.publicKey, deadline)

 

tokenSpent: Amount of token you want to swap

 

slippageAmount:  It is basically the minimum amount of bnb you need in exchange for x amount of token

 

path: It is an array of token addresses you want to swap

 

publicKey: wallet address at which you want to receive tokens

 

deadline: Maximum time it should take to execute this transaction

 

Understanding Essentials of BSC Binance Smart Chain

As you all know that to get the transaction details or listen to the events that are registered on the blockchain corresponding to your smart contract we need four things

 

1.) Contract address

2.) Abi of the contract

3.) Web3 library

4.) Http provider

 

We can get the above three no problem in that but for the provider we can go with two options either we can go for the third party provider like mentioned below or we can use the provider provided by the bsc.

 

1.) Ankr

For reference: https://www.ankr.com/

2.) Quik

For reference : https://www.quicknode.com/login

3.) Unmarshal

For reference : https://unmarshal.io/

 

But the problem with these third parties are 

 

a.) You may need to pay to use their apis

b.) Most of them do not provide data for bsc test net and that can cause problem in testing

 

To solve the above mentioned issues we can use the http provider provided by the bsc below are the details for that

 

Main network 

Network Name:Smart chain

New RPC URL: https : //bsc-dataseed.binance.org/

Chain ID: 56

mark: BNB

Block the resource manager URL: https : //bscscan.com

 

Test network

Network Name:Smart chain-TestNet

New RPC URL: https : //data-seed-prebsc-1-s1.binance.org : 8545/

Chain ID: 97

mark: BNB

Block the resource manager URL: https : //testnet.bscscan.com

For more information refer to the below url

https://docs.binance.org/

 

You will need just the rpc url corresponding to your environment and provide this rpc url in the provider .

Below is the code for the same

 

const Web3 = require('web3')

const binanceProvider="https://data-seed-prebsc-1-s1.binance.org:8545/";

const web3Object = {

web3Rpc: function () {

const provider = new Web3.providers.HttpProvider(binanceProvider)

const web3 = new Web3(provider)

return web3

},

}

module.exports = web3Object

A Brief Overview of the Solstarter Platform for Solana

This article provides a concise overview of Solstarter, an IDO (Initial DEX Offering) platform developed on the Solana blockchain. It delves into how this platform facilitates projects in raising liquidity within a decentralized and equitable ecosystem. Additionally, it explores the role of Solana blockchain development within Solstarter's framework and more.

 

Solstarter

 

It is the first IDO platform to be built on Solana. It will be a launchpad for the projects which can help them in raising liquidity in a fair and decentralized manner.

 

Suggested Read | A Guide to Counter DApp Development on Solana Blockchain

 

Solana

 

Solana is a fast, secure, and censorship-resistant blockchain providing scalability and low cost. It is a blockchain development platform and uses C, C++, and Rust as a programming language. The major key benefits it offers are: 

 

  • Low fees
  • Speed (less time for confirmations)

 

Also, Discover | What Makes Solana Blockchain Development Stand Out

 

Difference between Solstarter and Polkastarter

 

Solstarter is much like what we have seen in Polkastarter the only key difference is that it is built on Solana whereas the Polkastarter is built on a substrate. Additionally, Solstarter uses a tier-based system for guaranteed allocation to each participant in a pool whereas Polkastarter offers token sales of types of public and private. 

 

Also, Visit | Top 5 Compelling Solana Blockchain Use Cases

 

Distribution and Allocation in Solstarter

 

The distribution and allocation process is mentioned below:

 

Distribution: It is fairly simple and carried out based on sos token a user has (pool weight).

 

Allocation: the amount of sos token the user has staked determines the pool weight of allocation of a given user.

 

It is divided into four tiers:

 

Tier1:Moon- 7% POOL WEIGHT
5000 STAKED SOS

 

Tier2:Planet- 15% POOL WEIGHT
9000 STAKED SOS

 

Tier3:Red giant- 28% POOL WEIGHT
16000 STAKED SOS

 

Tier4:SuperNova- 50% POOL WEIGHT
25000 STAKED SOS

 

Explore More | Exploring the Potential of Solana Smart Contract Development

 

Conclusion 

 

Solstarter claims to give fair and accessible capital for everyone. Various IDO platform tries to provide the same but it is mainly seen that heavy investors or bots buy most of the tokens which leaves less space for other buyers to participate.

 

Solstarter claims to provide:

 

  • Fair distribution
  • Guaranteed allocation
  • Fully decentralized

 

There is not much information given on their website it's just the basic information they have shared but they have created a lot of hype in the market.

 

Have a Solana project in mind? Connect with our Solana blockchain developers to get started. 

Exploring the Development Fundamentals of Sushiswap

Before going any further, let's first understand what swap means.

So as the name suggests swap means exchange so in blockchain terminology swapping means exchanging token. So, swap comes in two parts-

 

1.) Swapping your token for another one

 

2.) Swapping with a liquidity pool holding for the tokens you want.

 

Introduction

 

Sushiswap is an example of Defi exchange as unlike central exchanges like Binance or Coinbase it does not maintain order books instead it allows traders to swap tokens with one another directly from their crypto wallet.

 

It is software running on ethereum that rewards a network of users who operates on the platform for their exchange.

 

It is a fork(clone) of Uniswap the only major difference lies in the fact that SushiSwap's creator Chef Nomi forked Uniswap so as to introduce the SUSHI token as an additional reward for liquidity providers and farmers.

 

How are SUSHI rewards distributed?

 

Users who provide liquidity to specific Uniswap pools, take part in its distribution. After that, they become eligible to deposit their Uniswap LP tokens into the SushiSwap staking contracts. It helps them to start earning SUSHI.

 

Initially, these Uniswap pools were:

 

  • USDT-ETH
  • USDC-ETH
  • DAI-ETH
  • USD-ETH
  • COMP-ETH
  • LEND-ETH
  • SNX-ETH
  • UMA-ETH
  • LINK-ETH
  • BAND-ETH
  • AMPL-ETH
  • YFI-ETH
  • SUSHI-ETH

 

To promote the provision of liquidity for the SUSHI market, the SUSHI-ETH pool pays out double rewards.

 

Uniswap vs Sushiswap

 

Majorly it works the same as Uniswap below are the points which are the key difference between the two:

 

  • SushiSwap rewards liquidity providers with 0.25% of pool fees + 0.05% paid to SUSHI token holders.
  • SUSHI yield farming remains alive and well. Rewards in some pools reach as high as 80% APY. Uniswap closed its UNI token farming period.
  • Different Ui experience

 

Besides these differences related to how rewards are generated and slight usability differences, the rest of the things are quite similar. 

 

 

Angular Material Dialog Implementation

If we are getting to say Angular Material, we tend to initially need to discuss Material style. Material style is that the soul and temperament of Angular Material and Angular Material is that the wonderful execution of that vision. All my further points are stock-still within the principles place forth by Material style.

 

The material style could be a powerful specification created by Google that facilitates the same expertise across multiple devices notwithstanding type issue or input technique. To attain this goal, Angular Material enforced is an unbelievably intuitive and straightforward layout system. The material style has additionally supported a group of principles that close to provide a fashionable and compelling visual expertise for the user.

 

The goal of fabric style was to supply expertise wherever the UI components provided a tactile reality in however they were superimposed and titled. there's a refined sense of dimension once operating with Material style that indicates intent and relation. If you were to appear at a cloth interface and conclude that it had been virtually like observing paper components stack on high of every different, you'd be correct. This can be intentional. To strengthen the idea of intention, each motion at intervals Material style is to convey which means and clarify context at intervals the appliance. The net total of those principles could be a foundation during which making stunning interfaces is that the default.

 

Also Read: Data Binding in Angular

 

Nowadays uses of Angular material style in Angular application is increasing quickly. Angular Material provides you nice intrinsical options to style a seamless UI. during this diary, I will be able to make a case regarding the Dialog implementation of Angular Material.

 

So let’s act, I'm forward that you simply are already running an Angular application with an Angular Material. 

To make  things simpler, we will follow the below step one by one and below that code, a snippet is provided for reference:

1.) Install angular material using the below-mentioned command

npm I angular-material

2.) Create a ts file to import all the angular material component that is needed in your project and name it material.module.ts

3.) Pass the reference of this file to app.module.ts i.e import the same

4.) Call the dialog component from your source file in our case we have source file-login.component.ts and dialog -forgot password

5.) From the dialog component set, its height and width from its corresponding and call the function as per the task you want to execute.

 

Also Read: Pipes in Angular

 

Source File =>login.component.ts

 

 

 

Dialog Component file => ForgotPassword.component.ts

 

 

Also Read: Angular Components And Their Working Methodologies

 

Dialog Component Html file => forgotPassword.html

 

 

Reference: https://material.angular.io/components/dialog/overview

 

Turn To Our SaaS App Development Services

 

We are a 360-degree software development company that provides cross-platform SaaS app development services to address varied software project requirements. We have an experienced team of Java, PHP, and Python developers who use advanced frameworks, tools, and SDKs to build scalable web and mobile applications with custom features. For more detail, reach us out at [email protected].

Banner

Don't just hire talent,
But build your dream team

Our experience in providing the best talents in accordance with diverse industry demands sets us apart from the rest. Hire a dedicated team of experts to build & scale your project, achieve delivery excellence, and maximize your returns. Rest assured, we will help you start and launch your project, your way – with full trust and transparency!