NFT Development Lesson #3: Introduction to Solidity Programming Part 1
Hemang: I’m the junior blockchain developer at TokenMinds, and I’ve been a part part of this company since one year now and now let’s go to our lesson so to those of you who are who have joined for the first time in the webinar I would like to give you a little overview about what happened in our last webinars so we went to we saw how to add metamask wallet that is a web3 wallet by using which we can call the decent plus functions and after adding the metamask wallet we also saw how to enable the test networks on it and by doing that we were able to enable test networks such as goli after that we went on to an Ethereum test net that was the same goli test net and we saw how to interact with smart context exactly on the test net where we saw many sections such as read contract, write contract transactions, and we saw how to check the addresses and then we went on learn a little bit about harded it was just an overview guys so there was no over depth about it and if you’re afraid that we covered all these things and then it was a theoretical and then we at the end we ended our lesson by learning about node providers which were Alchemy Morales and inferior and again that was also the theoretical part so in today’s webinars actually mostly going to be focused on the practical portion, so let’s move in. Remix ID, so let’s first understand the term id stands for integrated development environment which is a software for building applications that combines one developer tools into a single graphical user interface so if any one of you might have done a coding or might have known a little bit about the coding that you have heard about vs code right, so remix is also an ID similar to vs code but the main difference between this is that remix is solely focused for smart contract development and it is open source and it is used for blockchain development purposes where you can use solidity and viper languages also remix variety is used like I just I just said is used for the entire Journey smart contact development, and it also provides to help and deploy, debug and administer and the good thing is that it requires no setup foster fire development cycle and it has a rich set of plugins with intuitive GIS so let’s as I just said it is going to be more practical side so let’s go and see more about remix ID on remix itself. So we’ll go and type here remix ID and on the remix ID you just need to click on the first link over here which will open the page for the remix ID there you need to scroll down a bit and open this one because this one is going to create an online web-based development environment for you, if you want to download the desktop you can but it’s advisable to do with the online one because for desktop we will be able we will be setting up the local environment on vs code itself so yeah let’s do it on the online portion, so when you click on this just remember that only this link leads to this if any other link is going to lead to the remix one then it’s a fake one because there are many farts happening with the remix ID and now when you come here you will see this default workspace where you will see some contracts and the I mean these are by default here it’s not the one that I made any new user will see this one and then you can also see scripts which say deploy with ether dot TSO this is all by default you can create your own blanks workspace also which are going to do in a second and first let’s see about and first let’s go around the ID so on the top right here you can see it is it says workspace so workspace is nothing but the thing that I just defined on the search you will be able to search something which will return the code like if I search number in the code related with the number will come on the this section is for the compiling. So this is nothing but the compiler Versions, the latest one which you’re using is 0.8.17 and the compiler is actually has already started from 0.1.0 and it is widely Developing, and since we are and the latest one is 0.8.17 right now that we are using so and by using this you can compile your smart contact and it won’t be compiled right now because it is on auto compile but when I click on, but when I remove and compile then it will be compiled and also it is compiled right now also but it is on auto compiler. Let’s move to this section so it shows about the deployment of your contract where you will be provided with some environment so what is this environment exactly, so this environment is nothing but the virtual environment that is provided by the remix you can also change it to your local environment by let’s say we add a metamask here the Metamask, okay so my address is already connected so I’ll disconnect and connect it again to let the viewers know about how to edit exactly so yeah let’s go here and let’s connect it again, and some pop-up will come like this where you have to sign the transaction and you make to make sure that you are connected here and the account address is same that comes when you click on the metamask and which is your account wallet that is this address it is your public address and you won’t be afraid to share this address anyone because no one can do with anything with your address unless until they have your private key moving on let’s see, let’s try to deploy the contract and see what happens so when you deploy the contract your gas fees is going to be costed and then your contact will be deployed but it is really hard to find ethereum faucets so what we are going to do is we are going to use the environment that is provided by remix itself now what is the benefit of that you will you get several addresses with 100 ethers each now don’t get excited these are not really these are faucets these are fake keys and I mean you can you can they are only use further development purposes you cannot buy or sell anything from these so by using this when I’ll deploy the contract one thing that you can notice is that some amount has been deducted from your wallet and this amount is in the form of actually what gas fees so and this here is the transaction hash this is the world that you have used and these are the guests so let’s why not try to make our own coontract and deploy one rather than the default one which is here right so we’ll go here and we’ll create a new workspace for us which will be a blank workspace because we don’t want all of these right now and we’ll give it a name say P.M tutorial, let’s remove this and create it, click on ok and ta-da we have our 10 to 12 workspace here blend blank and clean, and simple over here the first thing we can do is create a new folders are the same folders that we use in our day-to-day life in our laptop and our computer so it’s not any much big deal so let’s create a folder or when it hangs yeah all right so we create a folder let’s say and over here we create we will create a file and if you are new to programming then I would say it’s a rule to always get a Hello World program and if you’re old to programming then you know what I’m referring to let’s create a hello world programming so now in if it was some other ID you will have to write here the type of the file that you are making for example if you’re using if you’re making a c+ profile then you would have to write CPP dot CBP but here if I click enter it will automatically create a hello world dot sole why because it is mostly focus on the solidity so that’s why and we can clearly see there are two warnings right here so one of the warning is going to be for the spdx license identifier now what is this aspects license identifier so the spdx license identifier actually stands for software package data exchange and it is a list of commonly found licenses and exceptions used in free and open source and other collaborative software or documentation so basically this is just a warning your program is not going to cost then it’s not an error and but why to do anything right so let’s try to remove this error and I’ll show you how to remove this error so for this write spds license identifier and in front of it give it the name of the license that you’re using so in this case we are going to use MIT license so let’s write and Michael license now let’s write the first code of our contract and let’s start with the real programming for the solidity so the first letter we are going to write is p and then we are going to type pragma now what is this program so pragma is generally the first line of code within any solidity file and pragma is the directive that specifies the compiler version to be used for the current solidity file right it’s just as the way I showed you before that there are several others compiler use and if you are going to write any compiler version here so it is going to tell the compiler to use that compiler version so in front of pragma we’re going to write solidity and here we are going to give it a compiler version so let’s say we write 0.8.7 and we end it with a semicolon now it is a good practice to always use the version above 0.8 right now because it is a current version and if you are going to use version below this then you might be end up using older libraries and you might find yourself behind as those libraries are exactly included in the 0.8.7 so yeah let’s go with 0.0 and it is also not advisable to use the latest version because there might be some error with that let’s use some version in the between so we are using 0.817 and you see it has automatically updated 0.817 on the compiler itself so let’s go and write our first program is correct hello world to create a contract hello world and this is it dot soul end it so in this tutorial I’ll be going to add errors By intention because error helps us learning in and the most best manner I believe so now you can see there is an error here so why it is showing an error because you cannot use dot while defining a contract you can use seven in it maybe and it I mean humble or you can even use this but you cannot use anything like plus it will show an error or pull in or a semicolon so you cannot use that basically let’s remove this and keep it as it is also it is a very good practice to give your same to name your file name as the contract name it is not necessary you can keep it anything but it is good practice since if some other developers are going to work on your file then they should know what have you I mean what are doing so it’s basically for the community the thing that we do for the community so now let’s write our first program that is for that hello world is we are going to output hello world on the screen so hello world is what a string right and what is a string anything that is not a number no but we can also say string is something that have alphabets words numbers or I mean it’s a combination of everything right so we write string, and then we write public, and then we write statement, and statement which is equal to in inverted commas hello world, so let’s ignore visibly public right now I’ll be explaining you in a bit, and let’s try to understand the other statements out there so what I’ve done is I’ve written here solidity, I’ve written here string all right which I’ve explained you already and I’ve written your statement, so what is statement, it’s nothing but my user defined name so it can be anything I can even write I mean it can be anything I can write remix in in place of it or I can write anything that I want in this hello world is what that is stored in this, that is stored in this statement and I’m going to call this function when I’m going to do deploy this contract and when I call on the statement then I’ll see Hello World so let’s go and deploy it will come here and we’ll deploy our contract and to deploy our contract, we’ll select the helloworld.sole contract which is the only right now here I will click on deploy and there are two transition recorded and in the contract we see statement here so as I told you earlier that I’ll be explaining public visibility in a while so what is this public it is visibility now what did this visibility do is it makes this checkbox right here with where users can interact with if I have not given any visibility then there wouldn’t have been any box like here. So it is important to give visibility when you want that variables that function to be visible and read or write by the users so that’s why we give it the public visibility and let’s see and but where is Hello World right so to output the hello world we need to call the statement and when we do we see a hello world and it’s not necessary that you need to give us any formal thing you can also write like anything that I just said earlier so let’s say maybe you can write CR7, ps5, fifa is coming so why not give CR7 here and in the statement we can write so let’s deploy this once again and when you did under this one so when you are going to call this one it is only going to show hello world because it is already deployed right and this is one of the property of the smart contracts that is it is immutable, so once it is deployed you cannot change it but right now but here you can you will be able to see it is CR7 so and when you call CR7 it shows to so yeah man like we are interacting with CR7 now. So it’s cool pretty much okay so yeah let’s move on to the next section that is okay so it also forms these metadata and artifacts but we don’t really need to see these right now the only thing which we need to see is that it creates a file that is hello world.sol and it’s better to close them to give you a clean and proper perspective now let’s see about the value types so for the value types let’s move on to a little bit Theory guys and let’s see what are the value types in solidity so types so there are let’s go and see the data types in the solidity. So now there are two kinds of data types in solidity which are value types and the reference type so what are value types so in our previous webinar I mentioned that solidity is statically typed so I’ll explain this to those of you who are come here for the first time now statically typed it means that for each variable there must be specified at compile time the variables can only be can only accept the data for which they were designed by a developer and they cannot be altered dynamically like in contrast to this python is a dynamically typed so the difference between data types and solidity and those of other programming languages are very subtle but significant enough that main developers find this topic to be a bit confusing right so a value type stores in the data directly in the memory it owns now available of these types are duplicated whenever they appear in function or the assignments just the way we see I mean we saw so a value type will maintain an independent copy of any duplicated variable, therefore a change in the value of a duplicated variable will not affect the original variable, and similarly what is the reference type? So solidity reference types differ from value types in that they do not store value directly on their own, instead reference type stores the address of the data’s location and don’t directly share the data so that’s the difference between value type and reference type now let’s see what are I mean how many value types are there and how many different types are there so value types are of generally six types sign unsigned Boolean address enums bytes and reference types are also fixed size arrays dynamic size array bytes arrays string arrays structs and mappings. Now let’s see one by one what they do mean we’ll be covering value types in this webinar because for reference type each of them deserved a different webinar and for enums also we are going to cover announcement structs in the in the same webinar and if we cover all of them then it is going to be along two or three hours webinar. So yeah let’s see the value type now what are the values now what are the signed integers so a sign integer is declared with the int keyword INT in keyword and is a value data type that can be used to store either positive or negative values in smart contract. So basically when we write Int, so int is an abbreviation of int 256, which has a range of minus 2 to the power 252 2 to the power I mean 255 to 2 to the power 255 minus 1. so this value types takes up to around 32 bytes by default but we can also make it smaller by specifying number of bits in steps of it for example we can write int 8 into 16 int 32, and now let’s come to the unsigned integer so what is an Unchained integer an unstained integer is declared with the uint keyword is a value data type that must be non-negative that is I mean its value is greater than or equal to 0. Remember in int and in signed integers the value can be negative but in unsigned it can only be positive or equal to zero so similarly to uint, uint is I mean similar to Intuit is an abbreviation of uint 256 and just like sand integers this value data type also takes up 32 bytes by default and again for we can make it smaller by specifying the number of bits in steps of 8. Also these integers are restricted to the range based on their size for example uint 8 will have a range of 0 to The Power 8 minus 1 and U in 256 will have a range of 2 to the power I mean 0 to 2 to the power 256 minus 1. Now let’s see, what are Booleans? So Booleans are really cool they just have two values either true or false so they are the value data type which is using solidity to illustrate cases that have binary results and I mean just I said a Boolean has two fixed values that is true or false with mostly the false being the default so this data types only takes up one bytes of storage and it supports and it’s already suppose all kinds of standard Boolean operations which are listed in front of you that is exclamation mark equal which we don’t do not call it exclamation mark equal we call it not equal so whenever in programming language you see in exclamation marks, it is actually equal to not. So the first one defines inequality and the second one is equal that defines equality and third one is logical negation that I just said not so if I say it is not like we if I want to write 4 is not equal to 3 then we may write it as the following, if I want to write then I can write it as 4 is not equal to 3, so this one makes sense right so yeah that’s about the not, and then we also see negation and then we’ll see logical conjunction which is and operator and we also see logical dysfunctions in which is our operator so we saw the theory but as I promised it is going to be practical so let’s move it and see the Practical also on this perform a practical also on this so we’ll go here and we’ll create a new file and we’ll name it let’s say value types value types and we won’t write dot solve because when we enter dot when we enter it, it automatically creates a DOT solve file and we’ll copy the first line actually we can copy the two lines from this, we’ll keep it we will paste it here and the first line removes our warning for the spdx license identifier and second line defines the compiler version, so now let’s write a contract and as I’ve said earlier it’s better to use the same value in the same name which is defined on the top as the contract name also, so we’ll write the contract name, so now let’s flow and write our first value types that is sine integer we will like ink and then we’ll write what a visibility that I explained earlier, so we’ll give it a public because why we because we are testing it right now and we want to see what is happening so we’ll write public so that we can interact with it and let’s give it a name see h and we’ll give it a value 34 that’s not my age though and now let’s go and see let’s type int again and since I told you it is a range from both negative to positive and let’s see that if that if the negative I mean it can show negative value or not so age and then let’s write anything like temp which is equal to minus 78 and it compiled I mean it compiled any and that means there are no errors now let’s see a second one that is uint now. Remember I told you uint can only take positive values but what if we write it negative values because we want to mess around, so let’s try to give it a negative value and we’ll write mess around and we’ll give it minus 20 12, and here solidity is completed of rules, it won’t let us write negative value because you know okay so maybe we also forget yeah. So solidity is completely full of rules it won’t let us write a negative value in unit and hence we have to store it in a positive way now let’s move forward and let’s write another data that is bull so we define it with bool and we will also give it public and we’ll give angry that I’m angry or not, and let’s give it two so something is also wrong right so I’ve also explained this in the first one that solidity is a case sensitive so we need to write true as the weight is stored in the library so it should be capital no, it should also be small gaps so and similarly way you can also write rule angry equal to false so and I’m not given in any public so let’s also give it public okay so by the way when you write two slash in front of any line then it means it is committed out and it won’t be read by the compiler so you can write basically anything here one more thing that is address so let’s write address give it public and we need to have some address so why not we copy our addresses that is provided by the remix by, and when you click this button here it copies an address and we give it wallet name and we write the address here India, there is one more left that is bytes, so for the bytes I do there needs to be a hexadecimal string or you can say anything of the length 32 bytes and you need to enter it here, so we’ll give it also public and we’ll write blend and equal to okay let’s see what will happen if we pass a default value for the bytes so first what we can do is triple first of all we will delete all the other transactions and now we’ll deploy a value type contract which is already here, and we click on deploy and so it is deployed and once deployed you can see all these functions are write all these variables are right here value types right here and when you will click on this, age angry length is this so I told you that I’m going to keep it I think so when you give something when you when you’re not giving any value so it takes the default value and in case of the bytes the default value is a 32 byte long this the zero address and when we click on mess around it will say 12 when we click on temp it’s a minus 78 I’m going to click on wallet it says it gives the following address that we have used now you may wondering so we use public everywhere so what if we want to use something which is not public then what will happen so let’s remove the visibility from mess around and deploy the contract again and we’ll deploy it, and it is deployed below this. And you notice that there is no mess around and that’s why it is important to give public when you are trying to know more about the functions so yeah that’s so, that’s about the value types, now let’s again move to the AH theory part which is the functions in solidity so yeah so before explaining about the function in solidity what exactly is the function so a function is a block of code or a collection of statements compartmentalized together to perform a specific task so it takes an input does some processing and produces an output in solidity we can declare a function by using the function keyword like this and then we can use the function name followed by the function mean and the set of function parameters wrapped inside the brackets and then we add the scope we add the return statement depending if it needs a return statement or not but let’s understand how we can write a function properly in the remix ID so before doing everything let’s first delete all the deployments here so that we don’t get confused at the end then move to the workspace let’s create a new file and let’s give it a name function row function bro plugin copy the first two statements and here we go and we’ll and now we are going to write our first function for the program for the solidity program so let’s start with the one of the most basic one that is a function contract a function add so let’s so first we will define now contract with the same name as a file name function intro not writing soul definitely and then we’ll maybe we are first let’s define a state variable so let’s say uint we won’t like to give it an invisibility for now and give it a name something let’s just say number and equal to 55, and then we write a function. So to write a function as I’ve just said you first write the function name and then first you add the function word then you are going to write the function name so you are going to write a function name to add two numbers so it is a good practice to always begin the function emitter smaller letter followed by the different word with a capital letter so we write add two numbers and as I’ve said that it takes some parameters so we are going to give it some parameters and in solidity we can give anything as a parameters such as end unit address so for now we are going to give a unit as one of the parameter and we’re going to write we are going to give a dash in front of it and then underscore in front of it and give a name X, let’s say and right so I’ll explain it a little bit later and now we’ll write public we write public and we want to return the value so we will write returns so just make sure you write returns because if another programming language there is you write return, we’ll also use return but we but a little bit further and in in front of return you write the value the value type that is going to be returned, so in this case since it is easy to guess that both of our input is going to be unit, so our return is also going to be wind we open our basic and then we get into the function so here we are in the function and we write the first line of our function that is return X Plus y so as I’ve told you earlier that why we use underscore X we use underscore X because again it is a good practice to always write the parameters in X because other developers are going to work on your code should know what you have written so it’s a practice that the government is following now we see a compiler is showing a little warning here so and that warning is going to be that since the unit number that we have defined here is not going to is not getting used here right so and unit number is what it is a state variable in the contract all right and when a state variable is not used not read not written then we can write a visibility modifier here and that will say it should write a pure so let’s go and write pure, and we can see there is no warning now. So let’s go and deploy this contract and see what we can do here so now remember earlier we were just clicking on the buttons and we were showing the outputs that we used and here we now we can input our own values for example let’s add something 23 and 39 and call it 62, right so Bravo we just made our first function give yourself a pat and let’s move forward so let’s delete no let’s not delete this and yeah one more thing you can create several functions several contracts into contracts in a single contract now let’s create another contract with some other name so let’s say I gave it the name a function intro all right so now we are going to use this number somewhere in the program so what we can do is we can maybe we can increment this number so we’ll write a function to First increment the number and for that we’ll write increment number will we won’t be passing anything because the number is already defined we’ll give it public and since we are already since we are going to read the state variable so we don’t need to provide it with the pure function with the per mutability and we’ll write number plus equal to one now what does this line do plus equal to 1 will increase the value of the number now how to check this number because we haven’t given it any visibility right so we’ll also write a function to x what is the value of the function after we increment the number so to check that we write click number and we don’t really need to give anything in the Scorpio so we’ll write public, and stuff so here we are we are going to be introduced with another immutability which I’ll explain you in a minute let’s write return and since the value that is going to be incremented it has to be returned into the function so we’ll return a value here and with this in this case obviously going to be the unit and we’ll write you in check the number so it will return the number will enter semicolon and as I said that it is going to show some warning and what is this warning so this warning is about to add a mutability called View what does this view does so this view is something which say that okay so this number is so we so you are using the state variable but you’re not doing anything to it you are not modifying it so it’s good to go with the view to go with the view mutability now let’s go here and we’ll deploy this contact again now in this case word contact which container we are going to deploy a function.intro, now you can see there is function.intro, and a function.inter also. So we will deploy a function.intro, and it is deployed here, and so let’s first check the number hs55 it is calling the number from here it is saying 55, and then okay so it is calling the number here visiting the number from here which is the value is right now 55. Now when you are going to click on increment this number value is going to be passed into this function and the number will be incremented two plus one so 55 plus equal to 1 is equal to is similar to The Way We you can write 55 plus 1, which is equal to 56 so if it shows 56 here and then you are going to check the number again because increment is not returning anything right, you can see that it is not returning anything, so if it shows the number 56 here after clicking on this function then that means our contact is working correct, so now let’s go and increment a number we have incremented the number and how we can be make sure about that because whenever you click here it creates a transaction, and the transaction costs gas so I mean yeah well the code is expensive, and every condition and boom we see 56 here so our contract worked now let’s create one more function in this and a little advanced one where we are going to take the number which are used again and add that add those two numbers because here we are taking the value from the users right so we’ll create one more function here and let’s start with that so we’ll again copy this whole code and okay we’ll click on B contract function intro and here we want to take this function value from the user both of these so let’s say we’ll also going to define a unit now in this case we will define a u and a public panel number and we won’t be giving it any value we’ll keep it as default and this number function increment number is incremented here so here what we are going to do is we are going to call this function into this one right so we will remove the number from here and let’s say we take the number we write final number okay final number is going to be equal to number plus why, and let’s see what it shows and then we’ll also return the value, return final number okay and we need to change the visibility for this because since we are using the state variables that I explained you earlier and when we are not using the state variables we had to add the state variables here so since now we are using variables we have removed that and let’s deploy this one again so for this we’ll deploy this contract and we’ll deploy it will add two numbers which is let’s add two number so yeah you’ve added the number four and you can check your number 55 file number 59. 55 plus 59 I mean 55 plus 4 is equal to 59 so 55 was a number and you can also increment a number so now second number it is become 56 you can add maybe 10 to this item number and then qualify number it becomes 66. So yeah this is pretty much it so now if you are following through this then it’s good it’s because you now know how to create the basic functions and yeah so we would like to end this here today and let’s see what so this is the end of a lesson so today in our lesson we learned about the valued hit data types we saw how to create functions we have created two functions we saw the visibility pure immutabilities and we have also created our own function to add two numbers where in the first one we took both the numbers from the users and the second function we used the state variables which were declared inside the function so that’s it for today and let’s see you in the next session.
Neal: OkaHey thank you for that very in-depth discussion sir, and well personally I believe I recalled all my programming subjects by then but for our for our audience we are now open for your questions if you have any questions or maybe feedback about the discussion you may now you may now speak up or chat or type your questions in our events chat
Hemang: Yeah, please go ahead like it will be really grateful and let’s go ahead and see some discussions.
Neal: So that we would know what clarifications you need regarding the discussion for today.
Hemang: We can also write something that you would want to see in the future that we would like to cover.
Neal: Okay, Vermont is taking his time writing his question maybe this is this is a hard one. Okay, how does the smart contract activate in the network?
Hemang: So actually in the remix ID, so this is that I explained earlier so it in this it is inbuilt that your smart contact is directly going to get deployed on the blockchain, but when you’re going to use your local environments, there you have to set up your own deployments and you will have to do it by your own, so that’s why for the beginners and also for the experts, it is recommended to start by using remix ID, remix ID is actually free, you can go there and I mean it is free for you, for all of you and you can see.
Neal: How about for the offline version, can we, will we be able to download it for free?
Hemang: Yeah, you will be able to download it for free, but it is advisable to use online version because you know online version has been going around since a very long time and it has more communities attempts and I haven’t tried with the remix ID offline because you know when you want to move to offline you it is profitable to use some other local environments so we’ll also be covering that to how to use other local environments but it’s advisable to use only online one because you are not wasting any space in your local and it works just to find as it as it would in the offline one yeah okay, and plus all your all your codes are going to be stored when you once you I mean once you exit from it.
Neal: And it will be the updated one, right, whenever we use the online one?
Hemang: Yeah, exactly.
Neal: So any other questions from our audience? Is it also connected sir with regards to because there are projects where when you mint them they’ll just give you a placeholder and then they will set a like a reveal date for that so is that also included in in the programming of the nft projects or the nft itself like there they’ll just be in in placeholders and then there will be time when everything will be revealed like the true art of the nft will be revealed is it connected in in programming?
Hemang: Well yeah you can do it certainly but if you are asking that we can do it solely on remix then well it depends on the fashion you develop your contract with so for example if someone wants to reveal it early then they can reveal it, but solely on the smart contact side it’s not possible, you will need to integrate many other versions of the web like you might need react and you might need an XCS to do that stuffs also so it is all it is basically a mingle of all the technologies, so for the smart contact side it’s when you’re going to, it is actually the back end portion, so you will be able to see what the core functionalities of nfts are doing, how the nft is being shown and the reveal purpose and all of these stuffs those are much about the front-end part and yeah oh okay I understand now so do we have more question from the audience.
Neal: Guys maybe you have some clarifications or suggestions on what topics we will we will you will want to hear or you want sir to cover for the remaining or succeeding sessions. Okay say it seems like we don’t have any for now but if you all if you have you may drop your suggestions in our suggestions channels so that we would be able to talk to the speakers with regardless of whether it is for nfts for marketing or for the Discord discussions you may suggest all those things okay so I guess okay we thank you sir and we thank TokenMinds for providing these free discussions and webinars for the additional knowledge that the community will have with web3 and we thank you for that we’re grateful for it sir so see you in there thank you.
Hemang: Thank you sir and thank you all of you for having me today, and it was such a great experience here and for the next session we are going to cover modifiers, we are going to cover enums constructs, so if you have any friends out here you can also go and tell them that in the next session they that modifiers will be going to be covered some more advanced function so we can do that.
Neal: Okay sorry okay guys you heard sir, you might as well invite people in here so that we would have more audience and we could help more people with our free webinars okay so thank you sir, thank you sir Anchor, thank you to all of you for listening for being here and we wish you all the best see you on the next session