Afrikaans
Akan
Albanian
Amharic
Arabic
Armenian
Azerbaijani
Basque
Belarusian
Bemba
Bengali
Bihari
Bosnian
Breton
Bulgarian
Cambodian
Catalan
Cebuano
Cherokee
Chichewa
Chinese (Simplified)
Chinese (Traditional)
Corsican
Croatian
Czech
Danish
Dutch
English
Esperanto
Estonian
Ewe
Faroese
Filipino
Finnish
French
Frisian
Ga
Galician
Georgian
German
Greek
Guarani
Gujarati
Haitian Creole
Hausa
Hawaiian
Hebrew
Hindi
Hmong
Hungarian
Icelandic
Igbo
Indonesian
Interlingua
Irish
Italian
Japanese
Javanese
Kannada
Kazakh
Kinyarwanda
Kirundi
Kongo
Korean
Krio (Sierra Leone)
Kurdish
Kurdish (Soranรฎ)
Kyrgyz
Laothian
Latin
Latvian
Lingala
Lithuanian
Lozi
Luganda
Luo
Luxembourgish
Macedonian
Malagasy
Malay
Malayalam
Maltese
Maori
Marathi
Mauritian Creole
Moldavian
Mongolian
Myanmar (Burmese)
Montenegrin
Nepali
Nigerian Pidgin
Northern Sotho
Norwegian
Norwegian (Nynorsk)
Occitan
Oriya
Oromo
Pashto
Polish
Portuguese (Brazil)
Portuguese (Portugal)
Punjabi
Quechua
Romanian
Romansh
Runyakitara
Russian
Samoan
Scots Gaelic
Serbian
Serbo-Croatian
Sesotho
Setswana
Seychellois Creole
Shona
Sindhi
Sinhalese
Slovak
Slovenian
Somali
Spanish
Spanish (Latin American)
Sundanese
Swahili
Swedish
Tajik
Tamil
Tatar
Telugu
Thai
Tigrinya
Tonga
Tshiluba
Tumbuka
Turkish
Turkmen
Twi
Uighur
Ukrainian
Urdu
Uzbek
Vietnamese
Welsh
Wolof
Xhosa
Yiddish
Yoruba
Zulu
welcome to the ultimate solidity smart
contract web 3 blockchain developer
course Foundry Edition previously we've
done two other massive courses and
tutorials like this one of them with
JavaScript and one of them with python
and then now one in pure solidity and
combined those two videos have over 5
million views making them the most
watched blockchain developer educational
material on the planet and we're looking
to do it all over again we've learned a
ton for making those first two courses
and we've taken all of those learnings
from those two courses wrapped them up
into this one to make this one the best
one yet if you're more interested in
full stack development and working with
JavaScript the hard hat one is still a
phenomenal resource for you to get
started however this one has a ton of
advancements in it making it the most
Cutting Edge web3 developer course
period having done one of these videos
every year for the past 3 years I've
been reached out to by countless
Developers ERS who are now full-time
developers in the web 3 space making a
living doing well and contributing to
web 3 and there are thousands that I
have not met who have left comments or
left me notes and I know we're going to
do it again with this video If you're
looking to become a web 3 solidity smart
contract or blockchain developer or any
of those terms this is the course for
you and this course is for anybody and
everybody no matter your blockchain or
developer experience level and
additionally we're going to be using
artificial intelligence to accelerate
our learning progress and I'm going to
teach you not only how to become a
blockchain developer but how to work
with AI tools to make you a 10x
developer if you have a little bit of
developer experience before this this
course will be even easier to get
through but again don't worry if you've
never coded before and for those of you
who are already familiar with blockchain
and smart contract development feel free
to jump around the different modules and
different sections and grab the
learnings that you want I promise
there's a lot of cutting edge
information in here and maybe you need
to brush up so no matter if you're brand
new to coding brand new to blockchain or
you're an experienced smart contract
engineer you're in the right place
welcome to the edge of the rabbit hole
let's get froggy for those of you who
don't know me my name is Patrick Collins
I'm a smart contract engineer security
researcher and just lover of all things
web3 I'm one of the co-founders of the
smart contract auditing firm cyphon
average smart contract YouTuber
co-creator of web3 education. deev and I
live and breathe smart contract
development I absolutely love web 3
blockchain and smart contracts and I
love the power and the tools that they
enable us to use but not only that I
love taking blockchain developers like
yourself watching this video right now
on the journey to becoming a successful
smart contract developer I think the key
to web 3 to blockchain to
cryptocurrencies being successful is
having a phenomenal Foundation of
developers so I'm incredibly excited
that you're here with me and for those
you who don't want to become blockchain
developers the first two lessons of this
course lesson zero and lesson one are
foundational pieces of conceptual
information for you just to understand
how to get into this web three thing so
if you don't want to become a developer
just stop once we get to the coding for
my pythonistas here I'm working on an
addition of this course purely in Python
and Viper stay tuned for that as well in
any case I'm incredibly excited for your
journey this is a data dump passion
project of all the knowledge that I've
collected over the past few years of
working in this industry and being a
smart contract developer myself and at
this point I have the track record to
show that I am 100% confident that if
you follow along if you code along with
us if you follow me on this journey you
will come out the other side armed with
the knowledge to be a positive force of
the cryptocurrency and blockchain
Industry smart contract and solidity
developers are massively in demand with
an average salary being around
$145,000 a year and with AI coming in
place it's becoming even easier to get
up to speed quickly but only those that
understand the technology truly will be
able to take advantage of all these
advancements AIS get stuff wrong a lot
so we especially need the knowledge to
fact check whenever AIS get things wrong
being here you have the opportunity to
be a Pioneer ushering in the age of web
3 of cryptocurrency Blazing the trail of
where this phenomenal industry has yet
to go like I said this isn't the first
time we've done this we've already
helped so many developers get into space
and we're going to give you the Cutting
Edge most modern tools for Industries
like defi nfts Dow tokens upgradeable
smart contracts blockchains and
everything else that you can think of
once you finish this course it will be
abundantly clear what you want your next
steps to be and you'll have a ton of
Economic Opportunity at your fingertips
and opportunities to make a huge
difference in this amazing industry
however I can't just give it to you you
have to come with me on this journey you
have to take the step despite what you
might think you know cryptocurrencies
and smart contracts enable a more
accountable World a more transparent
World a more collaborative world a world
where promises can't be broken and
that's a world that I want to live in
we'll learn more about the purpose of
smart contracts and the purpose of
blockchain technology in lesson one of
this course and then of course we'll
teach you how to build it so before we
even get started I want to give you a
huge thank you for even being here on
this video and listening and being
interested in engaging in this
phenomenal technology so thank you for
being here and welcome to the rabbit
hole cuz we're about to drop down with
that being said let's get
froggy so let's begin our journey by
talking about some best practices that
way you can get the absolute most out of
this course and be as effective as
possible now there are two links in the
description that I want you to pause the
video right now go into the description
and click on and open up the first one
is web3 education. deev and the second
one is a GitHub link to a repo also
known as a repository with all the code
and all the lessons and everything we're
going to be covering in this video the
web3 education. deev site is an
education site that we're working on to
have all of this video and everything
else in all the Cutting Edge learnings
of blockchain developers in this course
in this site so if you enjoy written
context as well be sure to subscribe to
sign up for that so that you can be one
of the first people to know when it
launches and the second site is this
GitHub link this is going to be your
Bible for the duration of watching this
video it has everything that we're going
to go over it has all the code context
text Etc that you're going to need to be
successful in this video and I'm going
to be referring to it pretty often as we
go through the course additionally in
this GitHub there's a discussions tab
right here that you can click on and in
here is where you can ask questions
discuss with other people taking the
course interact with members helping out
and it's where you can discuss anything
that you're having trouble with and an
important note sometimes you'll see this
as the chain Excel org Foundry F course
we recently renamed it to The cyphon
Foundry F course so this is the correct
link but if you see chain excl org
that's fine as well that being said as
we go through this course we're also
going to teach you some best practices
on working with artificial intelligence
how to best prompt these AI so that they
can give you the best results just keep
in mind they sometimes get things wrong
and it's a good idea if you are going to
use an AI to fact check it with a human
or another resource so be sure to say hi
in the discussions and maybe meet some
like-minded peers and additionally once
we do get to the coding portion of this
course it's a good idea to code along
with me as I'm explaining things so
having the video up as well as your
coding screen is a good idea so you can
follow along with me as I'm explaining
it now this space moves incredibly
quickly so whenever I open some
documentation or some codebase or
something I highly recommend that you
open it as well in your browser just so
that you can know immediately right away
that the code that I'm working with in
the video is going to be the same that
the code that you're working with
locally now we're going to be keeping
all of the code in here up to date but
sometimes things change and something
that I do in the video might not be the
most up to- dat best practice so we're
going to have this file called
chronological updates. MD where you can
go in and check to make sure that you're
working on the most upto-date Edition so
if you go into that file each lesson
will have a section and if there's some
update that we made to the lesson you
can find it in there additionally if you
think you found something that is
different or doesn't quite work be sure
to make a discussion for it in that
GitHub repo like I said it's going to be
your Bible but yes if you run into an
issue make sure that file is one of the
first places that you check just to make
sure that all the code that you're
working with is the most up to dat all
of this is to say if you run into an
issue jump to that GitHub repo and make
a discussion we will also be giving you
some tips very soon about how to best
make a discussion yes asking questions
to other human beings is a skill and
we're going to try to teach you to be
the most effective because asking well
formatted questions is not only the
secret to being a fantastic AI prompt
engineer but also becoming an incredibly
successful developer we're going to
learn how to ask well-formatted
questions and whenever we post on
discussions or forums or whatever we're
going to work on formatting them as best
as possible take breaks I cannot tell
you how many people have tried to rush
through these courses and be like Oh I'm
going to finish in a single weekend your
brain doesn't work like that your brain
needs time to absorb the information so
take breaks maybe every 25 minutes to a
half hour take a 5-minute break or maybe
you like working in longer chunks Maybe
take a whole hour and then take a 15 20
minute break don't try to rush through
the whole video in a day you're not
going to retain the information go
outside go for a walk grab some ice
cream get some coffee go to the gym your
brain needs time to have the information
settled maybe every 2 hours just step
away maybe be done for the day work at
whatever Pace makes sense for you
everyone's going to have a different
learning Pace there is no right speed
for this course I've had people take my
courses in 2 weeks in 3 months in six
months months it doesn't matter pick a
pace that you can do and stick to it not
only work at your pace make sure that
I'm talking at a pace that makes sense
for you there's a little gear icon in
the YouTube video here where you can
change the speed of how I'm talking and
how fast the video is going so if I'm
talking way too fast for you then you
can slow me down but if I'm talking too
slow then you can speed me up so make
the adjustments you need to make me go
the speed you want me to go now a giant
video like this can be kind of hard to
to triage where you left off so using
the GitHub repo with the timestamps in
there is a good way to say ah okay I was
on lesson one let's click the link there
to jump right to the timestamp if you
pause a video in YouTube you can
actually rightclick and say copy at
current time and maybe drop that into a
notes folder somewhere so that you can
always just pick right back up where you
left off or like I said you can use some
of the timestamps in the GitHub repo
associated with this course or depending
on when you watch this the web3
education. site might also be up be sure
to check that out as well and of course
this course is modular so you can Bounce
Around topic to topic and go to where
you want to go if you don't want to do
any full stack stuff then skip that
section if you want to go right to the
advanced stuff do that like I said go
the pace and take the learnings that you
want to do and after every lesson it
might be a good idea to go back and
reflect on each lesson to really make
sure the knowledge gets ingrained
repetition is the mother of skill and
we're going to be repeating a lot of
smart contract development now
additionally at the end of every lesson
you'll see a little QR code that looks
something like this and there will be a
link in the GitHub repo pointing to the
same place that this QR code is pointing
to these are optional challenges that
you can do to try to make sure that you
actually learned what was meant to be
learned here and if you do solve them
you get a very cool nft along with it
don't know what an nft is don't worry
we'll teach you later blockchain
development and open source development
world is incredibly collaborative so be
sure to use tools like of course the
GitHub discussions tab ethereum stack
exchange the decentralized Q&A Forum
piranha issues on different
to unblock yourself on this and really
anything in life plus sinking with other
people in the space makes it way more
fun now before we can actually get to
coding we need to understand how the
blockchain even works what the purpose
of these smart contracts even are and
this is essential to becoming a
successful smart contract developer
because a technology is really just a
solution and a solution is only as good
as the problem is so we need to make
sure we understand the problem really
well so we know how to attack it with
this smart contract technology and the
better you understand this smart cont
technology the better you'll be able to
architect your smart contracts in the
future and make really intelligent
really powerful systems that further
this amazing industry but if you already
know the basics of blockchain feel free
to jump into lesson two and skip over
lesson one so those are some of the best
practices to be really successful with
this course but with that knowledge
you're now standing at the edge of the
rabbit hole and if you're like me once
you jump in you'll just want to keep
going deeper and and deeper I'm so
excited for you to embark on this
journey with us and I'm looking forward
to seeing you on the other side just
like the thousands of other developers
who have taken these courses and have
emerged the other side triumphant so it
all starts with blockchain Basics let's
get
froggy now since you're here you've
probably heard heard of Bitcoin before
Bitcoin was one of the first protocols
to use this revolutionary technology
called blockchain the Bitcoin white
paper was created by the pseudo
Anonymous Satoshi Nakamoto and it
outlined how Bitcoin could make
peer-to-peer transactions in a
decentralized network this network was
powered by cryptography and decentral
and allowed people to engage in
censorship resistant Finance in a
decentralized manner due to its features
which we'll talk about in a little bit
people took to this as a Superior
digital store of value a better store of
value over something like gold for
example and that's why you'll also hear
people commonly refer to it as a digital
gold similar to Gold there's a scarce
amount or a set amount of Bitcoin
available on the planet only so much
that you can buy and sell you can read
more about the original Vision in the
white paper we have a link to the white
paper in the GitHub repo associated with
this course now this was an insane
breakthrough and in a little bit we're
going to learn exactly how this is all
possible and how this actually works
under the hood some people though saw
this technology and wanted to take it a
little bit farther and do even more with
this blockchain technology and a few
years later a man named vitalic butterin
released a white paper for a new
protocol named ethereum which used this
same blockchain infrastructure with an
additional feature and in 2015 him and a
number of other co-founders released the
project ethereum where people could not
only make decentralized transactions but
decentralized agreements decentralized
organizations and all these other ways
to interact with each other without a
centralized intermediary or centralized
governing Force basically their idea was
to take this thing that made Bitcoin so
great and add decentralized agreements
to it or smart contracts and in fact
technically these smart contracts
weren't even really a new idea back in
1994 a man named Nick Zabo had actually
originally come up with the idea smart
contracts are a set of instructions
executed in a decentralized autonomous
way without the need for a third party
or centralized body to run them and they
come to life on these blockchains or
these smart contract platforms like
ethereum and it's these smart contracts
that are going to be the core thing that
we're going to be working on in this
course and that we're going to be
developing you can think of smart
contracts in the same way you think of
traditional contracts or traditional
agreements they're just a set of
instructions between parties except
instead of written on pen and paper or
typed up in Microsoft Word they are
written in code code and embodied on
these decentralized blockchain platforms
and that's also where they're executed
instead of being executed by the two
parties or three parties or however many
parties that are involved this removes
this centralized issue that we'll talk
about more in a bit this is one of the
main differentiators between the
ethereum protocol and the Bitcoin
protocol it's these smart contracts now
technically Bitcoin does have Smart
contracts but they're intentionally
touring incomplete which means they
don't have all the functionality that a
programming language would give them
this was an intentional move by Bitcoin
developers Bitcoin developers viewed
Bitcoin as a store of value versus
etherum developers viewed ethereum as
both a store of value and a utility to
facilitate these decentralized
agreements now these smart contracts on
blockchains alone are absolutely
incredible however they do come with a
huge issue if we want these digital
agreements to replace the agreements in
our everyday lives they probably are
going to need data from The Real World
blockchains by themselves actually can't
interact with and can't read or listen
to data from The Real World this is
what's known as the Oracle problem these
blockchains are deterministic systems
and they're deterministic on purpose and
we'll learn about more about how that
works in the sessions to come so
everything that happens with them
happens in their little world but if
they're going to be these agreements
they need external data and they need
external computation and this is where
oracles come into play oracles are any
device that delivers data to these
decentralized blockchain or runs
external computation however if we want
our applications to stay truly
decentralized we can't work with a
single Oracle or a single data provider
or a single Source that's running these
external computations so we need a
decentralized Oracle Network similar to
our decentralized blockchain Network
your onchain logic will be decentralized
but you also need your offchain data and
computation to be decentralized
combining this onchain decentralized
logic with this offchain decentralized
data and decentralized computation gives
rise to something called hybrid smart
contracts and most of the biggest
protocols that we interact with today
are some type of hybrid smart contract
or interact with hybrid smart contracts
to some extent this is where the
protocol chainlink comes into play it is
a modular decentralized Oracle Network
that can both bring external data and
external computation into our smart
contracts to make sure they're
decentralized end to endend while giving
them the feature richness that we need
for our agreements chain link allows for
us to get data do upkeeps get random
numbers or really customize our smart
contracts in any meaningful way now
throughout the course we're going to use
the terminology smart contract however
whenever we say smart contract we're
often using it a little interchangeably
with hybrid smart contracts but just
know that when we say hybrid smart
contract we're talking specifically
about smart contracts that have some
type of offchain component now since
ethereum's release a number of different
blockchains or smart contract platforms
have come to light such as Avalanche
polygon Phantom Harmony and more for the
majority of this course we're going to
be assuming that we're going to be
deploying to the ethereum network
however everything that we learn here is
going to be applicable to the vast
majority of the blockchains out there
like polygon Avalanche Phantom Harmony
Etc and understanding everything from
ethereum fundamentals will give you the
skills that you need to switch chains
very easily with literally one line of
code so don't worry about learning a
specific tool or with a specific change
because most of them work together
seamlessly now there are a couple of
smart contract platforms that don't use
solidity but still learning the
fundamentals here will make you much
better at those as well and ethereum by
far has the most value locked and is the
most used blockchain and smart contract
platform out there you'll also hear
those two terms used a little bit
interchangeably as well sometimes I'll
say smart contract platform sometimes
I'll say blockchain they kind of mean
the same thing obviously blockchains
could mean store of value and smart
contract platform but you get the idea
similarly chain link is the most popular
and Powerful decentralized Oracle
network is the one that we're going to
be focusing on for this course as well
chain link is also blockchain agnostic
so it'll work on ethereum Avalanche
polygon salana or really any other
blockchain out there now additionally
over the last year a new term has come
to light called an L2 or a layer 2 this
solves an issue that most blockchains
see where they don't scale very well or
they don't grow big very well we'll be
talking about l2s a little bit more in
the future but the basic concept of is
that blockchains can really only get so
big so what they do if if this is
ethereum you can actually have
blockchains hook into them to
essentially make them bigger if that
doesn't really make too much sense don't
worry about it for right now layer twos
solve this scalability issues and at the
moment there are two different types of
true layer tws optimistic Roll-Ups and
zero knowledge Roll-Ups optimistic
rollups like arbitr and optimism or zero
knowledge roll-ups like ZK sync or
polygon ZK evm yes there's a polycon
chain but there's also a polycon ZK evm
L2 the two of them are very different
don't worry about them for now and in
fact it's this arbitrum layer two where
our challenge contracts are going to be
deployed on this rollup but like I said
once we learn how blockchains work from
a basic Level under the hood then we'll
explain more about how these l2s
actually work now throughout this course
you'll hear the term dap or
decentralized protocol or smart contract
protocol or decentralized application
and they all kind of mean the same thing
a decentralized application is usually
the combination of many smart contracts
and when we get into solidity you'll see
what a singular smart contract really
looks like and like I said learning all
these core fundamentals will make you a
better solidity and a better smart
contract developer you'll also hear the
term web 3 a lot in this video and in
the industry web 3 is the idea that
blockchains and smart contracts are the
next iteration of the web web one being
this permissionless open- Source world
with static content web 2 being the
permissioned web with Dynamic content
but all the agreements and logic runs
off of centralized servers where they
control your information and then web 3
comes back to the permissionless web but
once again with Dynamic content and
instead of centralized servers running
your logic decentralized networks run
the logic creating these censorship
resistant agreements that these smart
contracts enable it is also generally
accompanied by the idea that the users
own the protocol that they work with and
it's an ownership economy you'll see
what I mean later in this course now
we've talked a lot about the history and
about the high level of these protocols
and of these smart contracts and what
they can do but what do these smart
contracts really mean what is it when I
say trust minimized agreements or
unbreakable promises what is the real
value ad of these smart contracts before
we look under the hood and take a peek
at how this all works from a technical
standpoint let's learn what all the
value of this is what is the purpose of
of us building all these Technologies of
you taking this course what problem does
this technology solve in my mind a
technology is really only as good as the
problem that it solves if it doesn't
solve a problem then why bother smart
contracts blockchain web 3
cryptocurrencies those are all just
different words that encapsulate the
idea of what we're doing in such a
unique Paradigm I think the easiest way
to sum up what these smart contracts do
is that they create trust minimized
agreements and if you might be
scratching your head to that a much
easier way to think about it is just
they give rise to Unbreakable promises
Yes you heard that right unbreakable
agreements and Promises additionally
they give rise to speed efficiency and
transparency and a number of other
things I made a video pretty recently
about exactly this so let's dive in and
take a listen to the purpose the
undeniable value of smart
contracts cryptocurrencies fundamentally
Rel landscape Market markets and
agreements as we know them unfortunately
you've probably only been bombarded with
people screaming about nfts and money
now some of the memes are fun but let's
forget the and get down to the
essence of this space if you're already
in web 3 this is the video to send to
your friends to explain why you're so
excited about this space and explain why
we're here and then if you're not into
crypto you've come to the right place
and yes there are fun memes and markets
and there's some money stuff and there
all these things but outside of all that
the purpose of blockchains relates to
the age old old elementary school
unbreakable promise the pinky swear
let's get
froggy nearly everything you do in life
is the result of an agreement or a
contract your chair was the result of an
agreement to buy and sell lumber to
assemble and sell the chair to a
retailer on Amazon then you made an
agreement to buy the chair for $40 the
lights in your house are powered by
electricity which is an agreement from
you and the electric company you agree
to pay them in return they'll keep the
lights on the electricity that they
generate is agreements between them and
Engineers who built turbines to generate
the electricity with insurance you agree
to pay some amount of money to them
every month and in return they will do
nothing or I mean they'll cover your
medical bills almost everything you do
and everything you interact with is the
result of some form of agreement or
contract in some aspect now agreements
and contracts can feel kind of abstract
and boring to really grasp on to so to
simplify we can also refer to them as
promises when you get an oil change
they're promising that they will
Faithfully change your oil in exchange
for money when you put money in the bank
they promised to keep it safe in
exchange for them to use your money to
give out loans when you buy a lottery
ticket the lottery promises to give you
a fair chance at winning a ton of money
in exchange for you buying the ticket
whenever you make one of these
agreements in a way you're asking them
to pinky swear to not screw you over and
to treat you fairly but this doesn't
always happen let's look at a real world
example of someone breaking the pinky
swear back in the ' 80s and '90s
McDonald's ran a promotion for people to
win money by collecting McDonald's
Monopoly game cards the idea was simple
you buy McDonald's in return you get a
chance to win $1
million you can imagine McDonald's
literally going hey everybody I promise
if you buy our MC food and McNuggets
we'll give you a fair chance of winning
this
money but they ended up breaking This
Promise instead of having a fair chance
of winning your chance was in fact zero
in the mid90s between 13 and $24 million
went into the pockets of not people
playing the game honestly but a group of
corrupt insiders who had rigged the game
meaning that when you played the
McDonald's Monopoly game you were buying
into a set of lies and promises that
were 100% always going to be broken and
the thing is it doesn't really matter if
this was McDonald's fault or not they
were the ones making the promises that
they ultimately could not keep another
way you can think about it is that
that's $24 million that they essentially
stole from you and I now if this system
was deployed on a blockchain with
something called a smart contract it
would have been impossible to defraud
this $24 million due to Smart contracts
being a mutable decentralized and
transparent but I'll get back to that in
a
minute in all the agreements and
contracts we make imagine making a pinky
swear with a 10-year-old and imagining
how that agreement would hold up hey
buddy could you could you please keep my
money safe you can play with it if you
like but just just please have it when I
come back immediately you might get that
worrying feeling in your chest something
might go wrong that this 10-year-old
might lose your money you might be
thinking how could I trust them will
they break their promise and this
feeling of I can't breathe because of
untrustworthy situations happens to us
all the time can I trust this used car
salesperson to give me a good car can I
trust this tag that says machine
washable or will it make my shirt shrink
will my insurance provider break their
promise of covering my medical bills
when I get hit by a bus when Patrick
promises he'll go on a hike with me will
he actually yes I I I actually will the
issue with our current agreements and
contracts is we have to trust the people
who are making them to do the right
thing however often they're actually
incentivized to not do the right thing
insurance doesn't want to pay out money
sometimes salese just want to get the
off their shelves and with my
girlfriend I promised to go on a hike
but I hate hikes where else has this
happened now you might be thinking okay
Patrick this seems cool but like where
has this actually affected me well the
McDonald's Lottery that we just spoke
about above during the Great Depression
with the run of the banks Banks promised
to keep our money safe and that when we
went back to go get it they would
actually have the money there and well
and behold there were times that they
didn't have the money there just last
year Robin Hood painted this amazing
picture come use our application we will
give you access to the markets we
promise we will give you a retail
investor a fair chance of interacting
with the world of
Finance Psy but not this asset this
asset this asset or this asset the 2008
financial crisis remember that shady
deals behind closed doors combined with
lies about financial product brought the
world to its economic knees how are you
us hyperinflation in Zimbabwe
hyperinflation in Brazil fair enough
history is a Relentless lesson of
trustworthy entities being notorious
promise Breakers we finally have a way
to fix it with smart contracts now
before I jump into smart contracts a lot
of people might be thinking hey cool and
all however we have systems in place to
protect against a lot of these things
which is is true and which is great and
that is a very helpful step forward but
these systems often break ones in 2008
definitely didn't work the ones with the
Robin Hood crisis definitely didn't work
and even if these systems apply and you
go to court to try to work them out
maybe you're in court for years before
you actually see a resolution and by
that time what you needed the money for
is long gone so what is this technology
what is this tool that can fix this
fundamental problem in our agreements
today this tool is smart contracts and
this tool is what the blockchain was
built for now I'm going to give you a
quick overview of what a smart contract
is however I'm leaving some links in the
description for more in-depth
explanations but the basics of them is a
smart contract is an agreement contract
or a set of instructions deployed on a
decentralized blockchain and once the
contract or set of instructions is
deployed it cannot be altered it
automatically executes and everyone can
see the terms of the agreement the real
basics of it is that the code is
executed by decentralized Collective
like a group of people but a group of
people running a certain software this
means that no one person or entity can
actually alter any of these agreements
or change the terms of the arrangement
in these traditional agreements whoever
owns the contract whoever owns the
execution of the contract can flip a
switch and say n we're not going to do
that anymore in smart contracts in web 3
in blockchain you no longer can do that
typically these smart contracts are in a
decentralized blockchain and used in
combination with a decentralized Oracle
Network to get the real world assets and
information and if these words sound
like I'm Conjuring up a magic spell well
again check the links in the description
if you want to learn more about the
technical implications if you're not a
technical person and you're not
interested in getting to the Integrity
you can kind of think of it like https I
bet the vast majority of you don't even
know what https stands for and yet you
use it every single day whenever you log
onto the internet so how does this fix
the McDonald's Monopoly issue in its
traditional form the lottery was
executed behind closed doors somebody
operated and owned the code and the
contracts and the agreements that ran
the lottery and they had the power to
alter it and nobody other than the
people internal on the lottery could
audit this altering happening now if the
code for this Lottery was deployed onto
a blockchain every time a hacker
attempted to alter it everyone would be
notified not only that but you couldn't
even alter it because the terms of a
smart contract cannot be altered once
deployed combine that smart contract
with a chain link vrf Oracle to get a
verifiably random number and Presto you
now have a perfectly decentralized
unalterable agreement that is impossible
to hack commit fraud or manipulate we
have just saved the public between 13
million and $24 million just by fixing
the issue of trust how does this fix
Robin Hood well the problem with Robin
Hood is already fixed right again the
problem is that there's a centralized
body that can flip a switch at any time
and say yeah you can't access these
markets anymore we're breaking our
promise of actually giving you access to
the markets this is already fixed with
something called decentralized exchanges
and these exist today one of these
exchanges is one called Unis swap you
can swap erc20 tokens which are kind of
the equivalent of stocks but some aren't
some are it's a little confusing I won't
get into that here either but it doesn't
have that centralized body that can flip
a switch and ruin access to the markets
and had these investors been on a
decentralized exchange it would have
saved them hundreds of millions of
dollars and it would have prevented
fraudulent Market manipulation how does
it fix run of the banks with
transparency built in and automated
solvency checks you can build a bank
like smart contract that has insolvency
checks built in that make it impossible
to get there insolvent means broke as
any agreement or any history lesson
where there was a trust assumption that
was broken smart contracts can be
applied to and should be applied to
especially in a time where big money
runs owns and controls everything we
desperately need to move to a world
where some self-interested centralized
entity can't flip us switch and ruin
people's access to the services that
they need we can move away from a world
that is brand-based to a world that is
math-based right now if you interact
with a service that you don't like or
that they break their promise the only
thing you can do is walk down the street
to the next service that's going to make
the same set of promises and you have to
hope and pray that they're actually
going to keep it we can move from that
to a world where we can just look at the
math and say oh okay 1+ 1 equal 2 this
is what this agreement is going to do
for me every single time guaranteed
because it's a decentralized autonomous
agent has no incentive to be evil and
everything is transparent and out in the
open I'm a big company and if it was
better for me for 1+ 1 to equal three
maybe I would go behind some closed
doors and fudge some numbers and come
back out and be like hey 1+ 1 equals 3
but with smart contracts that's
impossible doing the right thing is
infrastructural now given the choice
between two agreements one where you
have to trust a single centralized
entity that they're going to do the
right thing for you versus a
decentralized untable collective which
one are you going to choose I'm picking
the one that can't screw me over every
single time for every agreement I can
apply it to now this technology is
relatively new but we have already seen
it Rel landscape entire markets and
continue to do so the traditional
Financial world is already getting its
lunch eaten by defy or decentralized
Finance there's already over $200
billion of people's money in these
protocols to help have a more fair more
accountable more transparent Financial
system this D5 movement is one of the
main reasons I got into this space
because we desperately need to move away
from where we are right now and end
people's chances for wealth being sucked
up by some group that's bending the
rules in their favor and smart contracts
are a ticket to that better World more
and more Industries are also coming over
to Smart contracts and blockchain
because of all the Innovations and
because of all the advantages that it
has as we grow and as we get better we
we get closer to this vision of having
this concept fulfilled trust minimized
agreements these smart contracts are
minimizing the trust that we need to
give other people in order for these
agreements to be executed if trust
minimized agreements is too confusing
for you just say unbreakable promises
now I got to be honest with you guys
blockchains and smart contracts and
cryptocurrencies can actually do more
than just trust minimized agreements
what they have Security benefits uptime
benefits execution speed benefits and a
whole lot more but it's a lot easier to
just learn about one and learn the other
ones later right it's kind of like
sprinkles on top so this is why we are
here this is why we're building this
future and this is why we are so excited
about
it last year 2022 there were a lot of
issues with a couple different companies
like for example spf's FTX platform the
thing to me that's most frustrating
about that situation is that FTX
platform wasn't anything that I just
talked about it wasn't decentralized it
wasn't trustless it wasn't transparent
it was purely a traditional web 2
company pretending to be web 3 and just
using the cryptocurrency part of web 3
but not actually using the smart
contracts and we're doing a much better
job as a community getting rid of the
Bad actors and this is something that's
incredibly important for you when
working with protocols and when building
protocols I want you to be incredibly
successful here but I want you to be
incredibly successful because you're
making a ton of value a lot of these
platforms that we saw collapsing last
year were not creating value they were
stealing value they were siphoning value
they were faking having value and as you
learn and as you build smart contracts
yourself it'll start to become innately
aware of what protocols and what
companies are centralized and are not
the ethos of web 3 and the ones that are
we are building verifiable trust
minimized agreements unbreakable
promises and if you can't verify those
promises then it's not trust minimized
it's not web 3 it's not what this
industry is for that's what I want you
to do as you finish this course is be a
force for good unfortunately because a
lot of people haven't taken my course
not everybody understands the difference
between a legitimate project and a token
that's just meant to pump somebody's
bags as this space continues to grow and
as people like yourself take courses
like this we will get to continue to
push real legitimate projects forward
and wash out the projects that aren't
actually contributing to web
3 even in just this introduction part
we've learned a ton so let's do a quick
summary of what we've learned so far
Bitcoin was the first protocol to take
this blockchain technology into the
Limelight and take these
cryptocurrencies into the mainstream
Bitcoin is a sort of digital gold or a
store of value able to make transactions
between users in a decentralized manner
ethereum and other smart contract
platforms take this blockchain
technology one step further enabling
people to make smart contracts in
decentralized trust minimized agreements
these smart contracts and decentralized
applications can access an inter
interact with the real world using
something called decentralized Oracle
networks chain link is a decentralized
network that allows us to build these
hybrid smart contracts which combines
our onchain logic with our offchain
decentralized data and decentralized
computation giving rise to our logic
being completely decentralized and our
data and external computation being
completely decentralized giving us all
the features that traditional agreements
and traditional contracts have now these
digital currencies like ethereum and
Bitcoin have value even without the
smart contract part having a censorship
resistant decentralized store of value
is immeasurably powerful in its own
right we have some links in the GitHub
repository that'll teach you how this
decentralized store value flips
traditional Finance on its head and it's
another one of the great reasons for
building smart contracts but again the
easiest way to boil it down is trust
minimized agreements or unbreakable
promises but let's also go into some of
these other features that smart
contracts have over our traditional
environment the first feature of course
is that they are decentralized and they
have no centralized intermediary the
different individuals that run one of
these blockchains are known as node
operators and it's the combination of
all these thousands of node operators
running the same software running these
algorithms running these smart contracts
that make the network decentralized
we'll dive deeper into how that works
later the next feature is transparency
and flexibility in these decentralized
networks since all these individual node
operators run this software everybody
can see everything that's happening on
chain meaning there's no Shady deals
there's no weird things happening
anything that's going to be unfair
people would be able to see and just not
use everybody has perfect information
and has to play by the same rules now
additionally this doesn't mean that
there's no privacy the blockchain is
pseudo Anonymous meaning that you aren't
necessarily tied to an identity in real
life they also have the feature of speed
and efficiency for those of you who have
ever tried to do a bank transfer or send
money across Seas you know it sometimes
can take 2 to 3 weeks when in fact all
these banks are really doing is basic
math they're subtracting money from your
balance and adding it to some other
balance why does it take so long in the
blockchain all of these transactions
happen instantly another instance for
those in the financial world today know
that clearing houses and settlement days
can take a long time in the blockchain
there's no need for any of that because
they happen instantly this obviously is
much quicker but it also makes for much
more efficient interactions with each
other security and immutability again
immutable means that it can't be changed
once a smart contract is deployed that's
it whatever is in the code is going to
be in the code Forever they cannot be
altered or tampered with in any way this
means that the security is much easier
whereas in a centralized World somebody
can hack into the server jump out the
database and change some numbers you
can't do that in the blockchain world
and since it's decentralized in order to
hack the blockchain you you'd have to
take over half of the nodes as opposed
to in the centralized world where you
only have to take over one in the
regular world if your computer and your
backup computer go down all of your data
is gone in the blockchain world if your
computer and your backup computer go
down all your data is safe because it's
being run on all these other
decentralized nodes and even if a few
hundred nodes or if a few thousand nodes
go down it doesn't matter because as
long as one node has a copy of the
blockchain you're good to go hacking a
blockchain is nearly impossible and
Leaps and Bounds more difficult than
hacking a centralized server not only
that but this is safer in the asset
sense as well all you need to access
your credentials and your information
and your assets is your private key
which is basically your password for all
of this and as we've discussed in the
video these smart contracts remove this
counterparty risk remove this
centralized intermediary remove these
trust gateways that we have to do in web
2 when we engage with users and
individuals they don't always have our
best interests at heart smart contracts
remove this counterparty risk because
once one of these contracts is created
they can't go in and they can't alter it
and they can't let greed or ego or
anything else get the better of them and
alter the terms of the deal and as we
said this gives rise to these trust
minimized agreements or these
programmatic unbreakable promises we
move away from brand-based agreements to
math-based agreements where we can look
at the cryptography we can look right at
the code and see exactly what something
is going to do and how it's going to
execute versus having to rely on a human
being doing the right thing with smart
contracts and decentralized hybrid smart
contracts doing the right thing is
infrastructural all these pieces boil
down to us having the freedom to
interact the way we want to interact
without having to be afraid that
interacting like that is going to screw
us over this trust minimize peace these
unbreakable promises make interactions
so much better in the purely to World
we're constantly bombarded with messages
of projects and protocols pushing us to
move or act in the direction that makes
them more profitable versus in the smart
contract space we can see everything
transparently and we can even engage and
interact and be partially owners of the
protocols and the interactions that we
decide that we want to be a part
of so smart contracts have been around
for a few years now and what have they
generated for what industries have come
about due to these smart contract
platforms being around well you've
probably heard of some of these and some
of these we've already mentioned but
let's give you a quick refresher defi
defi stands for decentralized finance
and it gives users the ability to engage
with finance and markets without having
to go through a centralized intermediary
for example like we said with Robin Hood
you'd no longer have to trust that Robin
Hood would continue to give you access
to the markets you instead would be able
to see in the smart contract yes I have
access to the markets or in the 2008
financial crisis you never have to trust
that these groups and institutions are
giving you the correct things on the
back end you can see everything
transparently right on the blockchain
you can engage with things like money
markets and sophisticated Financial
products easy effectively and securely
if you're really excited about defi we
have a ton of defi examples showing you
how to build and interact with these
protocols in coming lessons Dows or
decentralized autonomous organizations
are another group that we've already
mentioned Dows are groups that are
governed completely centralized by a set
of instructions or smart contracts on
chain there are some massive benefits
here where engagement is much easier the
rules are black and white and you can
see everything directly on chain voting
and governance technology is completely
decentralized and the blockchain space
is one of the big ones pushing how we
can evolve politics and how we can
evolve governance to make it more
efficient fair and reasonable and you
better know it we have some examples of
how to build Dows and how to work with
Dows in coming lessons so be sure to
watch those nfts stand for non-fungible
tokens and can really be kind of
described as digital art or just a
unique asset they can do so much more
but we'll keep it high level for now
projects like board apes and crypt punks
have revolutionized the way that people
get paid for their work show off their
creativity status and so much more and
yes of course we have lessons showing
you how to create and interact with nfts
as well so many other groups and so many
other Industries are being created as a
result of this insane technology and
maybe after finishing the journey with
us here you go out and you'll be the one
to Pioneer the next industry or the next
billion dooll idea you've learned so
much already but now that we've learned
a lot of this highlevel information
let's finally jump in and let's make
your first transaction and let's get you
set up to interact with this new world
in this next section we're going to get
you a wallet and we're going to show you
exactly what a transaction looks like
and feels like let's dive
in this is the ethereum website
ethereum.org we are going to make a
transaction on a test ethereum
blockchain I'll explain what that means
in a little bit this is going to be our
first ever transaction that's made on
the blockchain and this process of
making a transaction is going to work
the exact same across all evm compatible
blockchains and layer 2s like arbitrum
ethereum ZK sync and Etc I'll explain
what evm means in the future for now
just follow along and have fun running
your first transaction now in order for
us to send a transaction on any of these
evm chains the first thing that we need
to do is set up a wallet so I'm going to
go to metamask because it's one of the
most popular wallets and one of the
easiest wallets to use I'm using the
brave browser but it works for Chrome or
Firefox or really any other popular
browsers out there and it's just going
to be an extension in the top right hand
of our browser it's going to make it
very easy to see anything to do with our
wallets and our transactions very easily
and it's going to store all of our evm
based currencies and evm based
transactions so I'm going to go ahead
and hit add to Brave ADD extension
although Brave does also come jam-packed
with its own wallet so now we come to
the get started page and I'm going to go
ahead and select create a new wallet
sure we'll agree to help out metamask
now we're going to create our password
make sure it's really secure for the
purpose of this demo mine's going to be
kind of mediocre now I'm going to
preface it
this wallet that you're making right now
as you follow along with me this is
going to be your development wallet so
if you want to make the password a
little bit weak just so that you can
test things out very quickly go for it
just know we're never ever going to put
real money into this wallet it's good if
you treat this as if it is a real wallet
that way you'll get used to and you'll
get familiar with good wallet safety you
will then get a video like this which
will teach you about the secret recovery
phrase which we saw a little bit earlier
when we were creating our wet let's
watch this video metamask is a new way
to connect to sites and applications on
traditional websites a central database
or bank is responsible for controlling
and recovering your accounts but on
metamask all of the Power belongs to the
holder of a master key whoever holds the
key controls the accounts your secret
recovery phrase is your master key it's
a series of 12 words that are generated
when you first set up metamask which
allow you to recover your wallet and
funds if you ever lose ACC access it's
important that you secure your wallet by
keeping your secret recovery phrase very
safe and very secret if anyone gets
access to it they will have the master
key to your wallet and can freely access
and take all of your funds to secure
your metamask wallet you'll want to
safely save your secret recovery phrase
you can write it down hide it somewhere
put it in a safe deposit box or use a
secure password manager some users even
engrave their phrase onto a metal plate
nobody not even the team at metamask can
help you recover your wallet if you lose
your secret recovery phrase if you
haven't written down your secret
recovery phrase and stored it somewhere
safe do it now we'll wait and remember
never share your secret recovery phrase
with anyone not even us if anyone ever
asks you for it they're trying to scam
you that's it now you know what a secret
recovery phrase is and how to keep your
wallet safe and secure awesome so that
was a great introduction to keeping your
wallet safe we'll talk a little bit more
about safety with our wallets in the
future let's go ahead and select secure
my wallet now this is where we need to
write down our secret recovery phrase
and save it in a very secure place it
gives us some tips here like a password
manager a safety deposit box or split it
up and keep it in multiple secret places
for the purposes of this video I'm going
to be showing you the secret recovery
phrase because I'm not going to put any
real money into this but you should
never never ever do this additionally
you'll sometimes hear pneumonic as a
synonym for secret recovery phrase the
main takeaway from all this is you
should never share any of this this is
for you only if you show this secret
phrase to anybody else they will have
access to not just one account but every
account that you make in metamask so be
absolutely certain to not share this
with anybody so again I know I'm
belaboring the point a little bit but
everything that we're going to do in
this tutorial we're going to do with
fake money and fake make assets and
never put actual money into this account
that we're making here once you get
familiar with using metamask and working
with the tools and stank secure then you
can go ahead and create a separate
metamask that will have real funds in it
if you want to put real money in
different metamask a lot of browsers
have a profile option and maybe you can
make a new profile install metamask on
that different profile call that profile
real money profile or something and
that's where you will store your money
but for this video for this tutorial the
mamass that you are using is going to be
specifically for are testing things out
and you will never store real money to
it I'm going to harp on that a lot more
in this course so even if you're coming
here and you have a wallet I highly
recommend still making a brand new one
for this tutorial just in case you don't
accidentally code something or do
something atomous and give away your
funds if this is your first wallet then
great but again when you're working with
real money if you lose access to the
secret phrase you will lose access to
all your money so be sure to write this
down promise me that you won't use real
money for this course great I'm going to
hit copy to clipboard for now and we're
going to go ahead and hit next now we
need to confirm by adding our seed
phrase back in we can go ahead and hit
confirm and we now have created our
wallet let's go ahead and clict got it
awesome now we can see the interface of
our metamask full screen and depending
on your browser what you can normally do
is hit this little puzzle piece on your
browser and select this pin button so
now we can pin our metamask into the top
of our browser and we can click it like
so
and we can see it give a little drop
down like this and we can see the same
information in this little drop down as
there is on the full screen now even if
you lose access to that page now that
this is bookmarked in your browser you
can select your metamask select these
three dots and hit expand view to reach
this tab now additionally what we can do
in here is we can actually go up to our
accounts and we can actually create
multiple accounts by hitting create
account and if you wanted to you could
give it a name here I'm just going to
leave it as default for account two and
now we have two separate accounts we
have an account zero with an address and
an account two with an address as well
both of these accounts actually share
that same secret phrase so anybody with
access to the secret phrase can actually
have access to both accounts however
they have different private keys and
that's what makes them different we'll
talk a little bit more about that in the
future if somebody gets access to a
private key they'll get access to a
single account if they get access access
to the secret phrase they'll get access
to all the accounts that you make even
you know if you made a third one they'd
get access to this one as well now if
you look up in the top right of the
screen here you'll see this section that
says ethereum mainnet this is our
networks Tab and if you click it you can
see all the different networks that our
metamask has access to ethereum mainnet
is the main network of ethereum and this
is where real money is spent and used
for this course we're not going to be
working with ethereum mainnet we're
instead going to be working with
something called a test net for both
engineers and non-engineers we often
need a place to test or simulate our
transactions and for the developers here
throughout this course we are going to
teach you another technique for testing
out your transactions on a local network
and a local network is actually going to
be the preferred way we do our testing
and our simulations however it's still
really important to see end to end what
a real transaction looks like and that's
what a test net will do for us it
simulates exactly what a mainnet or a
live money Network would look like
however there's no real money at stake
and we don't actually have to spend any
money to see some of the test Nets that
come default with metamask we can hit
the show/hide button which will bring us
to the settings page of metamask we can
turn on show test networks and if we
scroll back up now if we hit our
networks tab actually let's go ahead
close out of settings now if we hit this
drop down we can see gelli test Network
sapoia test Network and Linea gorelli
test Network these Networks networks are
test networks that resemble ethereum or
polygon or Linea or arbitrum or optimism
or ZK sync or any other evm compatible
chain that we want to work with and
again we'll Define evm in the future and
we can actually switch the network that
we're working on simply by clicking
another Network so let's switch to
sapoia we can see our Network changed up
here and now we can see we have zero SEO
eth so on eth mainnet this new account
has zero ethereum and on the sapoia test
Network we also have zero sapoia eth
which makes sense because this is a
brand new wallet and we haven't put any
money into this brand new account yet so
of course we have zero at the time of
recording sapoia is one of the most
popular test networks out there so we're
going to be working mainly with sapoia
throughout this course however test Nets
often change because again they're run
out of the goodness of people's hearts
and sometimes people stop running them
you should absolutely have either the
web3 dev. education site up or the
GitHub reposit associated with this
course and an important note sometimes
you'll see this as the chain Excel org
Foundry FL course we recently renamed it
to The cyphon Foundry F course so this
is the correct link but if you see chain
excl org that's fine as well and you
should scroll down to the recommended
test Nets section to make sure you're on
the most up-to-date test net at the time
of recording like I said we're working
with sepolia throughout this course we
are going to show you how to work with
different test Nets and different
networks as well because because it's
incredibly important to do so the
blockchain world is moving into a
multi-chain world and especially with
the popularity of l2s which help
ethereum scale learning the differences
between different chains and different
l2s is incredibly important now same as
ethereum what we can do is we can
actually go to sepolia etherscan so
we'll go to sepolia etherscan.io and we
can grab our address from metamask by
clicking and copying the address here
pasting it into the sapoia Explorer and
same as ethereum we can see our account
balance we have zero eth there are no
transactions no token transfers nothing
because obviously it's a brand new
wallet now I'm showing you this because
pretty soon we're going to send our
first ever blockchain transaction if
you've never sent a blockchain
transaction before we're going to do it
on this test net to give you some
confidence as what a transaction
actually looks like when you do move
over to a main net and I'm showing you
this site now because you're going to
see when we send a transaction a lot of
this information is going to get updated
now just remember like I said earlier a
test net is run out of the goodness of
people's hearts so please use the
transactions sparingly once you send
your first transaction here try not to
send too many more as one as good enough
for you to see what's going on anyways
and in order for us to simulate one of
these transactions we're going to go to
a faucet for a testnet testnets have
this thing called faucets which allow us
to get some free sapoia eth so that we
can test out sending transactions and
receiving transactions if you go to the
GitHub associated with this course or
web3 dev.
education we can scroll down to this
testet faucets section and select one of
the links to go to one of these test net
faucets right now the recommended faucet
that we're working with is faucets.
chain. link But be sure to use the
GitHub repo or web 3d. education to be
most up toate what this is going to do
is we're going to ask this faucet site
to send us testnet ethereum and this is
why this test net ethereum isn't worth
any real money since we can get it for
free anytime that we want these
obviously don't exist on mainnet you
can't get free mainnet ethereum via a
faucet now what we can do is we can
actually connect our wallet to this site
and we can get some free test net sapoia
eth this will make it so that in our
balance here we'll actually have some
seoa eth to play with so to do this what
we're going to do is we're going to go
ahead and hit connect wallet accept the
chain link terms of service I've already
read them our metamask is going to pop
up to connect it to this website now get
familiar with this interface because
this is how websites will interact with
our wallet and interact with the
blockchain connecting our account to the
site will first select the specific
account that we want to connect we're
just going to choose account one we'll
hit next and then we'll go ahead and hit
connect and now we can see our wallet
address in the top right and we can see
that we're connected on the ethereum
supp a test net if we go up to our
wallet and we actually switch to
ethereum mainnet you can see that the
website has actually changed this little
drop down to ethereum name net and if we
go in here we can actually switch to
ethereum sapoia and our metamask will
pop up with this switch Network button
which will help us switch the network
for us so now we're back on sapoia test
Network connecting to these websites is
how we give these websites a way to
interact and connect with our wallets we
can go and select this hit these three
dots and hit disconnect this account but
don't worry anytime we want to send a
transaction the website has to ask us if
we want to send a transaction so just by
connecting to the site it won't actually
send a bunch of transactions for us and
if we scroll down we can see our wallet
address is placed right here and we can
see we can request test link and we can
also request test eth for now we don't
need any test link so we're going to
leave that off but in the future we will
come back to the site to get some test
link for now we're just going to get 0.1
test ethereum and if all goes well we
should hopefully see it in our sapoia e
here in order for us to get this test
ethereum we do have to log in Via
Twitter if you don't have a Twitter you
can use any of the other facets in the
test Nets facets area of the GitHub such
as the Alchemy seoa faucet or the sapoia
proof of work faucet but if you are on
Twitter now is a great time to give me a
follow maybe give me a shout out and
maybe say hey sending my first
transaction
thanks Patrick Alpha C or not whatever
you want to do just some light Shilling
of my own Twitter account anyways we can
log on Via Twitter we can authorize this
app verify that we're human give our AI
overlords The Prompt here oh make sure
we don't select the link and let's go
ahead and send the request now what's
going to happen is it's going to give us
this transaction hash on sapoia and
after a delay we'll see it go from
initiating to waiting for confirmation
to token transferred and we'll see a
transaction hash and if we click the
transaction hash we'll see a transaction
that was sent to our address so this
will be the first transaction that we
get to see and there's a ton of
information here but the most important
piece is if we open up our metamask now
we can see we now have 0.1 spolia eth in
our account and if we copy the address
again we paste it into here we can see
now we have a 0.1 eth balance
you might have to wait several minutes
for the transaction to finish going
through and if you accidentally refresh
your browser again we can go ahead and
just select our metamask copy our
address and paste it into ether scan or
just view it right in our metamask here
and if you missed that piece about the
transaction data if we go back to ethers
scan with our address remember we're on
sepolia ether scan and we scroll down we
can see this most recent transaction
hash that just occurred and we can click
the link here and we can see that detail
about the transaction again here now
importantly remember though this is on
sapoia if we switch back to mainnet
ethereum you'll see we have zero eth on
mainnet ethereum if we switch to gly
test Network you'll see we have zero gly
eth on that network if we switch to
Linea gelli eth or any other network
other than sapoia you'll see that seoa
is the only one that has the 0.1 sapoia
eth if you want to practice working with
a different test net feel free to scroll
up back to the faucet select a different
test net and try to get test net in one
of these different test Nets just be
sure to take a look at what test Nets
your metamask comes with since some of
the networks this faucet is compatible
with don't come built into our metamask
but again like I said in the future I'll
teach you how to add these different
networks to our metamask in the future
but huge congratulations you received
your first transaction because again
this faucet is US asking them to send us
money it's not us sending money it's
them sending money to us and if this is
the first transaction that you've ever
sent you should be proud of yourself
already give yourself a big Pat in the
back and here's a picture of me holding
a cat with that cat's face all over my
pajamas as of congratulations now once
more let's grab our address paste it
into ether scan here and scroll down and
we're going to learn a little bit more
about what actually went down what
actually happened in this transaction
you can see on ether scan it gives us
some basic detail details it says from
and to from is going to be another
address a different address an address
controlled by the foset and two is
obviously going to be our address and if
we select this transaction hash we can
see even more details in here
understanding all these different fields
is essential to becoming a smart
contract developer and even just a web3
or ethereum or blockchain user so let's
learn a bit of the basics of what's
actually going down in this transaction
the first field on this page is the
trans action hash you can even see a
little question mark here which tells
you a little bit more about it it's a
unique identifier for this specific
transaction on this network so this
specific transaction hash we can even
copy and paste this into the address bar
and we'll get the exact same transaction
back this is the only transaction in the
entire blockchain that will have this
transaction hash it's the unique
identifier it identifies the transaction
of sending 0.1 eth from the faucet
address add to our address we can see
the status of this was successful we can
see the block number and the number of
block confirmations which we will
explain in the future we can see the
time stamp which of course is when this
transaction occurred we can see the from
and to who initialized the transaction
and who it was sent to if we select this
from and open this in a new tab we can
see some details about who actually sent
us this test eth and if we go back to
the transaction detail and keep going we
can see the value here which again if we
roll over it's the value of ether or
testnet ether and then in parentheses
the Fiat value or the dollar value which
of course since this is a test net it's
always going to be zero the value of
this transaction was 0.1
e now what's underneath this value thing
this transaction fee and this gas price
thing what are these if we zoom in a lot
more to these pieces here and we roll
over transaction fee we can see it says
it's the amount paid to the block
producer for processing the transaction
and then gas price is going to be the
cost per unit of gas specified for the
transaction in ether or guay the higher
the gas price the higher the chance of
getting included in a block I'm going to
explain that in a little bit but if we
scroll down even more let's Zoom back
out and we click click to show more we
can see even more details about this
transaction for now we're just going to
click to show less and just focus on the
details that are here so let's talk
about just the concept of transaction
fees and gas for a second because they
are important concepts for you to
understand remember how I said that
these blockchains are actually run by a
group of different nodes well the
question is what's their economic
incentive to keep running these
blockchains are they running them out of
the goodness of their heart well on a
real Network these nodes actually get
paid a little bit of ether for
processing transactions whenever you
send a transaction there is a node
sometimes referred to as a minor or a
validator depending on the network
you're on who gets paid a little bit of
the Native currency of the blockchain to
process that transaction for ethereum
they obviously get paid in ethereum or
for test ethereum they get paid in test
ethereum which again the test ethereum
is worth nothing which is why I said
they're running them out of the goodness
of their heart if you're sending a
transaction on the polygon Network
they're going to get paid in madic the
native token of polygon if you send a
transaction on an L2 like arbitrum or
optimism you're going to get paid an eth
which is the native token of those l2s
this payment is obviously to incentivize
people to continue to run nodes and they
get paid more the more gas you use so
what is gas gas is a unit of
computational measurement the more
complex your transaction is the more gas
you have to pay for example if we hit
more details just really quickly and I
zoom in a little bit more we can see
this section here gas limit and usage by
transaction this means that when we sent
this transaction we limited it to a
maximum of 60,000 gas but in total we
only used 21,000 gas this 21,000 gas
represents how complex this transaction
was it was 21,000 gas units worth of
complexity now for simple things like
sending ether the units of gas are
usually pretty small for example 21,000
units of gas is actually a really small
amount of gas being sent but maybe for
more complex transactions like minting
an nft depositing some funds into a D5
protocol or deploying a smart contract
those are typically going to be more
expensive transactions because they're
more complicated they have to do more
stuff in the future we'll introduce you
to this concept of evm codes or op codes
and if you break down a transaction to
the lowest level this assembly op code
stuff you can actually see exactly how
much each op code costs in terms of gas
don't worry about this at all right now
just know that these transactions are
broken down into many many many many
very very small instructions and each
instruction has a specific amount of gas
the more instructions usually means more
gas like I said we'll explain this much
later in the course don't worry about
this too much here but just know that we
use 21,000 gas now if you take this gas
used and multiply it by the gas price in
eth instead of guay so we'll take 21,000
and multiply it by this gas price in eth
not in guay and hit enter we'll see the
total trans transaction fee of the
transaction and you can see that this
number does indeed match the transaction
fee for you to understand how much eth
you're going to pay for your transaction
you multiply the gas price times the gas
used transaction fee equals gas price
times gas used so this means that
whoever sent us this 0.1 e also paid
0.525 blah blah blah
eth to a blockchain node to a validator
on the sapoia ethereum test net now each
blockchain has their own unique way of
calculating how much transaction fee
someone's actually going to pay for most
evm chains this is the simple algorithm
it's going to be gas used times gas
price after we understand how the
blockchain works more in depth I'll
explain to you what the rest of these
values stand for for now just know that
anytime you make a transaction on chain
you have to pay the validators or the
blockchain nodes a little bit of gas or
a little bit of the Native token of the
blockchain which in our case is eth so
you have to pay a little bit of eth to
the blockchain nodes providing or
sending the transaction sometimes I'll
refer to this just as transaction gas
let's look at an example of this
ourselves if we pull up our metamask we
go ahead and hit expand view as we know
we have two different accounts in here
we have account one and account two
count 1 has 0.1 spolia eth Count 2 has
zolia eth if I send
0.05 from account one to account two how
much do you think I'll have left in
account one let's go ahead and do this
and this is going to be the first
transaction that you send on the
blockchain which is incredibly exciting
as well let's go ahead and hit this send
button in our metamask we'll hit send
we'll hit transfer between my accounts
we'll select account two and we'll say
0.05 suppo eth so we started with 0.1
aoia eth and we're going to send 0.05 to
account two we'll scroll down we'll hit
next we can see some information here
about what's actually going on we can
see some gas information which metamask
automatically prompted for us and it
even gives us the total amount that
we're going to be paying in eth it's
adding this 0.05 eth to the estimated
amount of gas that we actually have to
spend so that at the bottom it says the
amount plus the gas fee is the two of
those combined
the value that we're sending plus the
gas fee and additionally in metamask if
you select this here you can get some
more information about editing our gas
fees the amount of gas that you choose
to spend can be different depending on
how many people are making transactions
with the blockchain the more people are
sending transactions at the same time
the more expensive gas costs are going
to be so if a lot of other people are
also sending transactions right now the
gas price is going to be higher if a lot
of people are sending transactions that
means there's not going to be enough
space for everyone's transaction to get
through so in order to throttle that
they increase the gas price that's a bit
of an oversimplification of what's
happening but if you take that
understanding that'll pretty much work
if you want to specify exactly how much
gas you want to spend you can clict the
advanced tab if you select zero gas
there's a high likelihood that your
transaction will never go through so
we're just going to go with the default
which is usually a good idea so let's go
ahead and confirm we now see a send
transaction in our Q in the activity tab
of our metamask which shows us that we
have a transaction currently sending and
if we click on it and click view on
block Explorer it'll actually open us up
on ether scan and we'll see well mine
was a little bit quick but normally
we'll see a little indexing Tab and we
won't see this having gone through we'll
see it as like indexing or sending or
something like that but after a little
bit it'll actually finish sending you
might have to wait a minute or so for
this to actually finish going through
but it looks like mine was really quick
and same as our last transaction this
has a lot of the same information and if
we scroll down we'll see that of course
we send a different amount of eth
0.05 and we have a different transaction
fee now if we pull up our metamask what
do you think that we're going to see
we're going to go ahead and click expand
view again and we see account one says
0.05 and account two also says 0.05 hm
that's kind of odd I thought we spent
some gas well if we click on the big
accounts button we see exactly how much
eth is in each account you can see we
have
0.499 in account one and 0.05 in account
2 and we can see in our activity history
our account one recently sent 0.05 eth
and account two recently received 0.05
saoa eth now here's the best part of all
this even if you don't want to become a
developer you just learned the basics of
sending a transaction and interacting
with sites using your metamask
congratulations now here's here
something that's incredibly exciting
with just this little bit of information
you now know how to interact with
blockchains and interact with the
ethereum protocol so if you don't want
to learn how to code anything you can go
and you can start interacting with
ethereum and interacting with protocols
with just this much information however
I know most of you guys are here to
learn how to code so let's look under
the hood of ethereum and what is
actually going on with these
transactions and with these gas and with
these blockchains and what's really
going on let's learn all the
fundamentals of a blockchain now if you
want to just go ahead and jump into the
coding go ahead and grab a timestamp
from the description however learning
exactly how the blockchain works is
going to make you an incredibly powerful
developer so let's take a look at that
first so we're going to be going through
this blockchain demo on this site right
here now the creator of the site has a
fantastic video and a fantastic walkthr
blockchain 101 it is right on their site
so if you're looking for another
explanation definitely check out his
video it is absolutely fantastic but the
first thing that we really need to do in
order to understand blockchain in order
to really anything and everything that's
going on here we first really need to
understand this shot 256 hash or hashing
just kind of in general let's first
understand what a hash is a hash is a
unique fixed length string meant to
identify any piece of data they are
created by putting some piece of data
into a hash function in this example the
hashing algorithm used is Shaw 256 now
ethereum actually uses uh this uh this
right here for its hashing algorithm
which isn't quite um Shaw 256 but is in
kind of this sha family but it's it's
really just another way to Hash things
and uh the specific hash algorithm
doesn't matter uh so much so uh this
example uses Shaw 256 but you can
imagine it's the same as the ethereum
hash they're just going to you know
result in a different hash so what's
going to happen in this application here
is whatever data or whatever information
we put into this data section here as
you can see below
this hash changes so what's happening is
this data is running through this Shaw
256 hash algorithm and it's outputting
this unique hash so this hash is a
unique fixed length string that's going
to identify like a blank data piece here
right so if I put in you know my name
like you know Patrick Collins this is
the hash that's going to represent
Patrick Hollins right and you can see
even when I put you know tons and tons
of data in here the length of the string
doesn't change right so it's always
going to be the same amount we can put
almost any amount of data in here there
is an upper limit on the max size of the
data but for all intents purposes we can
pretty much put any length in here and
you'll see too that you know every time
I type in Patrick Collins this hash is
always going to be this 7 e5b right I'm
going to delete it I'm going to do
Patrick Collins again you 7 e5b it's
it's always this this unique hash is
always going to be unique right it's
always going to be this fixed length
string here so now we can take this idea
right of putting this data in here and
we can move on to uh this concept of a
block so with this block concept we're
going to take the exact same thing with
this hash this this data section right
but instead of having everything just
being in this this singular data area
right here we're going to split this
data up into block nuns and data so all
so what we're going to do is we're
actually going to Hash all three of
these to get to get this hash right
we're going to put all three of these
we're going to say all three of these
are combined uh together we're going to
put every all three of them into this
hashing algorithm uh to figure it out so
if I type a bunch of stuff here we can
see that block one with nuns you know
this nuns and this data we're going to
get this hash and as you can see
actually the screen turns red this block
turned red now what happens when I hit
this mind
button when I hit this mind button it's
actually G to take some time it's going
to think for a little bit and we can see
that the nuns here actually changed
right the nuns is different from what it
was before and this hash now starts with
four zeros okay and then it the back
turned green when we're talking about
mining we're talking about minors
solving some type of very difficult
problem that takes a lot of time to do
now in this example here the problem
that the miners had to solve was they
had to find a nuns or or a value in this
nuns section section that when hashed
with at block number one with this data
it would start with four zeros so the
problem here the minor had to solve was
to start with four zeros and the only
way for them to really do that is kind
of this Brute Force you know trying
stuff so they tried one okay one didn't
work okay two nope two didn't work three
no four five six okay five well that
started with one zero but that's not
four and they have to keep trying all
these numbers until they uh get to this
one where you know let's hit mine again
where it has four zeros at the top at
the start now this specific problem
changes blockchain to blockchain right
ethereum has a different problem for
miners to solve um Bitcoin has different
problems for minor solv but this concept
is going to be the same and since
etherium is proof of stake now nodes
actually take turns solving these
problems again we're not going to go too
deep into that right now though so they
have to take um one block is going to be
this this uh this concept is going to be
all this data it's going to be the block
number and it's going to be this nuns
right and so this nuns is the solution
um is is going to be the the number that
they use to get like the solution to the
problem right so if I go to one here you
know and I do this
again we going to hit mine and the nuns
has changed right it went from one to
33,100 and so that's what's happening
when uh blockchain minor ERS are mining
they're going through this process this
very computationally intensive process
of trying to find a nun that fulfills
whatever the problem is so that's really
it actually so that's a block and and
that's really what's happening when
miners are mining they're just looking
there's trial and error Brute Force
trying to find this nut so so now that
we know what a block is let's go to the
next step and figure out okay well
what's a blockchain so here we have an
example of what a blockchain is going to
look like right we have a combination
you know we have back here in the block
section we have one what one block looks
like now here we have multiple different
blocks right each one of these
represents a different block but we have
an additional column here or we have
additional uh variable here so like
before you know we have block nuns and
data right we have block nuns data but
we also have this thing called previous
right and so this is actually going to
be pointing to the previous hash of the
last block so for example if we go to
the the last block in this blockchain it
says previous is 00 ae8 and if we look
at the hash of block number four it's
000000 ae8 and then we look at its
previous it's 4 Z's B9 we have 4 zos B9
and so on all the way back to our first
block which has previous of just all
zeros right and so the block with the
previous of all zeros is going to be
known as The Genesis block so you've
probably heard that before the Genesis
Block it's the first block in the
blockchain where the previous hash
points to a hash that uh doesn't
actually exist now as you can imagine
kind of the same as how this block
worked how the block nuts and data all
go through the hashing algorithm in the
blockchain the block nuns data and
previous hash all go through this
hashing algorithm to figure out you know
what the hash is okay so if we go to
over here you know for example if I type
in you know Patrick obviously this is
now no longer valid right because this
nuns uh combined with the block the data
and the previous hash aren't going to
solve you know our problem of having 4
at the at the start right so I'm going
to go and fix that and and that's that's
kind of an easy way to to see it being
broken but but let's take a look if I
break this block right here what happens
if I if I break the data in here if I do
like Patrick in here you can see that
both of these are now read both of these
are now invalid right because the block
hash with the nuns hash with the new
data which is my name Patrick hashed
withe hashed with the previous block is
now a brand new
right and this block is still pointing
to this previous hash right here right
is pointing to this previous block and
now it is wrong and it is messed up and
now um and now its Nuns with this
previous hash is also wrong right and
this is where when we talk about uh
blockchains being immutable this is
exactly how it's immutable right because
I go back and I change anything you know
if I just typed a right here the entire
blockchain is now invalidated because
none of these are going to have uh Nunes
that solve this equation anymore so this
is why blockchains are immutable is
because anytime you change one thing you
ruin the rest of the blockchain okay so
however though you know if if an a was
here originally we can go ahead and mine
these we can mine all these but as you
can see you know this is going to start
getting very uh computationally
expensive because I have to go redo uh
basically the entire blockchain uh and
the farther and farther down the line
you get the harder and harder it becomes
to you know rehash and and redo all
these different blockchains here now
this makes a lot of sense right so we
have this blockchain it's really hard to
change something in the past but if we
do we can just go ahead and remine it
now if I'm the one who controls the
blockchain right if I'm the one who
controls this you know and I want to
change something in the past well okay
great all I got to do is change this
data here and then you know mine each
one of these you know obviously it's
going to be very computationally
expensive but it's something that I can
do right if I'm the one who owns the
blockchain now here's where the
decentralized nature or the distributed
nature really uh makes it incredibly
powerful so we're going to go to the
distributed tab here which I also refer
to as the decentralized tab here and
it's going to show us what a blockchain
looks like uh in a decentralized manner
so we have this exact same uh initial
setup here we have distributed
blockchain we have you know the our
first blockchain which is kind of
exactly as the one from here but we also
have more than one so we have Pier a
pier B and Pier C and when people are
talking about Pier to to peer
peer-to-peer transactions they're really
talking uh this is kind of that concept
that they're talking about right so we
have a number of different peers who
running this blockchain technology
they're all weighted equally right each
one of these tiers or each one of these
nodes each one of these entities running
a
blockchain has the exact same power as
anybody else right so the way that we
can tell very easily which blockchain is
correct or which ones are correct are by
looking at this end hash here right by
looking at where we are uh in the
blockchain because again remember
because again remember this this hash
that this this in this last block here
is going to Encompass all of the blocks
from before right because this last hash
is going to have the previous hash here
which includes the previous hash here
which this hash includes the previous
hash here and which so this last hash is
encompasses everything in here right and
we can look we can look at the hash of
Pier C which is four zeros and then E4 B
we can look at the latest hash of Pier B
which is 4's e4b and then Pier a which
is 4 e4b so all of these peers all of
these nodes all of these decentralized
you know these independent um all these
independent users running this
blockchain software they're all matched
up it's very easy for their nodes to
look at each other and say hey great we
are all matched up now what let's say
that a decides that you know something
happened on the blockchain that they
didn't like and they wanted to go back
and change something right so let's say
they change here you know obviously uh
the rest of their blockchain is
invalidated and they have to spend a lot
of computational power to catch up to
speed so let's go ahead and humor it
let's say that they they did they ended
up catching up uh they ended up catching
up you know they ended up mining
everything and now they have a valid
blockchain right it solves the equation
awesome however in block number three
there's something new right this is here
and it shouldn't have been here this is
something that perer a put in by
themselves all that happens now is we
look at all the blockchains that are
running the software and we're looking
at all the hashes at hash at block
number five so per a has this new hash
now
9bc but Pier B has a different hash 00
e4b right so who's right is it is it
Pier a with their new stuff or is it
Pier B well that's where the
decentralized comes in because then we
can look at Pier C and Pier C also has
e4b so Pier B and Pier C both say hey
Pier a you're wrong get out right and P
A will stop being able to participate in
the mining rewards because they have
essentially forked uh the blockchain and
started their own little blockchain
right with their own history because
they're the only ones with this this
piece of data in block three whereas
Pier B and Pier C have nothing in there
so that really shows why uh in these
blockchain worlds in this decentralized
world there really is no centralized
entity you know per a you know might
have been maliciously motivated to
change you know this this block number
three however democracy rules right the
majority rules in the blockchain pier B
and Pier C both say Hey you know that
that's cute and all p a but you're wrong
right that that's not right now it might
be a little abstract that you just look
at data and you know us typing kind of
random stuff in here and think okay yeah
that's that's data right that makes
sense you know just kind of random
strings in here doesn't really do
anything for us so if we actually go
over to the Token section here this is
where everything really starts to make a
lot of sense so we have the exact same
setup here uh with Pier a pier B Pier C
except the difference is instead of
having kind of this this data section we
have this a TX this transaction section
right and this represents all the
transactions that are happening in this
block right so we're we're sending $25
from Darcy to Bingle or to Bingley uh
for uh $27 here 1922 right and it's the
exact same thing so this all these
transactions are going to get hashed in
the exact same way uh that the data is
going to get hashed and and this is why
it's so powerful because again you know
if I want to be malicious right if uh if
I wanted to say hey I I really wanted to
give Jane a lot more money from
Elizabeth so I'm p and I go back and I
change it to 100 well now you know not
only do I does my whole blockchain uh
get invalided because that was so far uh
so long ago but I'm not going to match
any of these other chains right and so
my blockchain is going to be excluded
from the overall blockchain so and let's
let's go ahead and fix this and it's the
same thing if down here if I I become
malicious and I want to send you know I
want uh Miss Audrey to have less money
maybe I want to send a dollar and I go
ahead and M it the same thing here this
hash now this 2a1 is not going to match
pib's pb's hash of BBA and it's not
going to match PC's hash of BBA as well
so the two of them are going to say hey
this your blockchain is invalid it's not
matching the majority you know you're
out right so that's really how uh these
blockchains work at a low level and it
all goes back to this this understanding
this hash idea and using it in this very
sophisticated manner uh to kind of
cryptographically prove um you know
where where stuff lies now the way the
blockchain works is you instead of
random stuff put in this data section
it's actually going to be solidity code
in here to finding ways to interact with
different blocks and different protocols
that are on chain or as we've said
before different smart
contracts now the next question that you
might be asking is okay well how do I
know how can I be sure that I'm the one
uh you know let's say this is let's say
I'm Darcy right how can I be sure that I
was that Darcy was the one to actually
send this money here how do we know that
Darcy sent $25 to uh Bing
well this is where we get into private
keys and public keys and that's what
we're going to go into now let's just do
a quick recap of what we've learned in
this section so far right we've learned
that ethereum actually runs on this Kack
256 but you know we used shot6 for this
demo it doesn't really matter we're just
talking about hashing algorithms so
again a hash is a unique fixed length
string meant to identify any piece of
data a hash algorithm or a hash function
is a function or algorithm that computes
any type of data into a unique hash
mining is going to be the process of
finding the solution to the blockchain
problem in our example the problem was
finding a hash that starts with four
zeros nodes get paid for mining
different blocks and the problem is
going to be different blockchain to
blockchain a block in a blockchain is
basically a combination of a block nuns
transaction and a previous hash to
create this unique hash for this block
and again depending on the blockchain
implementation this might have a couple
other fields or might have different
fields but this is essentially what's
going on blockchains are decentralized
and distributed because many independent
users are going to run this blockchain
software and they will check and they
will compare against each other to see
which blockchains are acting honestly
and which ones are acting maliciously in
the blockchain world majority rules the
nuns here is the answer used or the
number used to get this hash now nuns is
kind of an overloaded term it's actually
used for a number of different reasons
in this case we're using it to solve
this problem of getting you know four or
five zeros at the stop of the hash
however in ethereum it'll also be often
used as the number of transactions from
a given
address so now we're going to talk a
little bit about signing these
transactions and and private keys and
and some other cryptography pieces right
because in this blockchain demo here we
can see we have all these these
fantastic transactions right all these
things went through but how do we know
that it was dar see who is the one to
send $25 uh to Bingley right how do we
know that actually happened and this is
where all those pieces that we just
learned about uh in our our test net in
our metamask account are really going to
start to to come to life here a little
bit here so here we have an example of
public and private Keys okay at the top
we have this private key right that was
that was randomly generated uh a private
key is is you know as it kind of states
is a key that you really want to keep
secret because you're going to be using
this uh as kind of your your secret
password for all your transactions right
I can really pick you know any any any
private key anything that I want and
with it uh this algorithm they're going
to use an algorithm you know for
ethereum and Bitcoin they both use this
elliptic curve digital signature uh
algorithm it's it's a variant of just a
digital signature algorithm and it's
going to create this this public key
right I'm really not going to go at all
into kind of this digital signature
algorithm but just know it does use some
of these uh some of the hash uh
knowledge that we just learned combined
with some other pieces uh to kind of get
this this public here so I'm not going
to go too deep into it but we have this
private key that we create and we get
this public key now this public key we
want everybody to have access to right
this is yeah whole world can see this
this private key we really want it to be
uh private we don't want people to see
this we're going to use this private key
as like a password to quote unquote
digitally sign transactions and then
people can verify them with this public
key so let's let's see what this
actually looks like let's pick a a
random key a more secure key right
because the longer it is the the more
secure it's going to be and if we go to
signatures now right um let's say we
have this uh this message that we want
right we say high world right we want
this to be the message what's going to
happen is this private key that we've
created we can use to sign this data
right remember how in the blockchain
demo you know we were kind of We Were
hashing stuff right we were we're using
this uh shade 256 hash to to get this
hash well we're doing something similar
but instead of hashing we're we're using
this digital signature algorithm to
create this message signature now what's
really powerful about how this uh this
algorithm works is that you can create
this message signature with your private
key but somebody else can't derive your
private key from the message signature
and that's what makes this really really
powerful however if we go to verify by
using this public key right uh and so
this is the this is that 0403 this is
that same public key using this uh using
this public key anybody can verify oh
let's go ahead and sign it again anybody
can verify that this signature is yours
right so you have a public a private key
just for you so you can sign things and
a public key that anybody can verify
something right so anybody can verify
this and let's say somebody tries to
fake a transaction from you they say Hey
you know this is this is this is their
transaction um all they have to do is
verify that this signature against your
uh public key and very easily this whole
thing turns red because uh it isn't
verified right the the algorithm says
Hey uhuh that's wrong so we can go ahead
and take that into transactions in this
exact same way so if I want to send
money you know if I want to send $400
from you know my address to another
address using my private key I can sign
that transaction and anybody else in the
world can then verify this transaction
right and this is why when people say
hide your keys you know protect your
keys this is what we're talking about in
our accounts here right if we go to uh
settings and again the only reason that
I'm showing you guys my pneumonic and my
private key is because this is a uh this
is a dumpster account I'm going to throw
this away at the end of this video or
I'm just not going to put any real money
it um
but when we look at our our our metamask
here we have this numic phrase which
allows us to easily get these different
private keys right so uh pneumonic
phrase combined uh with you know uh
whatever account number will get us a
private key so pneumonic phrase combined
with one we're going to get this private
key and this is when we look at Account
Details export private key
confirm this is going to be the private
key that we're going to use to sign our
transactions right this if anybody else
gets access to this private key they
then can sign transactions for us and
they can send transactions for us and
that's why we want to keep these private
so uh it works the exact same way right
so this is why it's so important to hide
your private keys and hide your newonics
now your ethereum address is actually uh
a piece
uh is actually a piece of your public
key now to get our address in ethereum
all we have to do is take this public
key that we've created with our private
key hash it using that same ethereum
hashing algorithm and then take the last
20 bytes and that's how we'll actually
derive to our um to our address here now
knowing the exact methodology of how to
get the address doesn't really matter
because it could change blockchain to
blockchain and could even change e two
um but just know that that is
essentially how kind of these addresses
are derived right there some derivative
of the public key right because the
public key is public and you know uh
using the public key in kind of any
public way is is totally fine um but not
the private key so that is how we sign
our transactions note though this isn't
how we send the transactions so so this
is just going to sign it create a
transaction for us to send uh we'll
learn later on how to send these
transactions so that was a lot of
information there too let's do a quick
recap your public key is derived by
using a digital signature algorithm on
on your private key right and you want
to keep your private key private at all
times because you're going to use your
private key to sign transactions signing
transactions with your private key you
are the only one who can actually do
this because you can't get the private
key from a message signature however
using your public key you can anybody
can very easily verify that a signature
that's signed by you is in fact signed
by you in our metamask our private keys
are located in this Account Details
section you just hit uh show Private
keys and type in your password and
you'll get your your private key here
and the address of your account is
derived from this private key uh it's
derived from this public key so if you
think about it your private key creates
your public key which then can create
your address and there's a little
barrier
here or a big barrier here because your
private key you want to keep private and
your public key and your address can all
be public information now remember
remember how in our metamask we were
able to actually create new accounts
mine says account six cuz I've created
actually a few but how was it actually
creating those accounts well now that we
know all this if we go back to our
blockchain demo here what our metamask
is doing is essentially taking our
pneumonic or or that multi-word secret
phrase and then just hashing it with
some number so secret phrase plus 0 gets
this and it'll set this as your private
key and for our account one that'll be
the private key or maybe it's plus one
the exact algorithm that it's using
doesn't matter but if you want to create
a new private key where you just hit
this create account button the way it
actually picks this account is by taking
this secret phrase and then just
changing this number so if I go if I'm
in my metamask I do create account this
right now I'm on account six because
like I said I made a whole bunch if I
make account six right it's as if we
just did the secret phrase plus six and
created this new hash or this new
private key and created this new hash
and it uses this to make a private key
and this is why in your metamask if you
share that secret phrase if you share
that pneumonic device they will have
access to all the accounts that you ever
created however if you share your
private key it will just give them
access to that single account secret
phrase has access to all the accounts
created in your metamask or your wallet
your private key is access to that
single account and then the public key
or address anybody can have access to
and it's cool for anybody to have access
to so when I'm thinking about the
security of my metamask or my wallet
this is kind of the order that I think
of it in the seed phrase or pneumonic or
secret phrase is incredibly important
protect this at all costs because if
somebody else gets access to this they
will have access to all of your accounts
the second most important is the private
key because if somebody gets access to
that they will get access to a single
account and then your public key or
address which whatever it's public
now that we know a little bit more about
what's going on underneath the hood of
these blockchains let's go back at our
transactions and look at this gas thing
again and we'll look to see what's
actually happening here gas in
particular can be a little bit tricky to
wrap your head around so if you don't
get it right away don't worry as we go
through examples it'll start to make
more sense so before I was saying let's
just look at this transaction fee bit
which is the cost associated with
running this transaction if I scroll
over this on ether scan I can see this
thing that says Block Base fee per gas
plus Max prity fee per gas times the gas
use which might be a little bit
confusing here let's actually break down
what's going on on ethereum with EIP
1559 in place and again this is going to
be specific to ethereum as every
blockchain might do it a little bit
differently but if we click to see more
we can see a number of useful values
here we can see gas limit is 21,000 and
usage is
21,000 so this transaction used 21,000
gas and we sent 21,000 gas along with it
sometimes when sending a transaction
depending on when it's sent and
depending on what these Specific
Instructions are it might actually use
way more gas than what you want it to
use so with your transactions you can
actually set a limit hey I don't want to
use more than x amount of gas I don't
want to do more than x computational
units and in fact if we go to our
metamask and we click Send to transfer
between accounts again
and we pick you know 0.01 e or something
next can actually hit this little button
here go to Advanced and we can actually
edit some specifics of this transaction
one of them is going to be the gas limit
we can change this gas limit to maybe
2200 2300 or more or even less since
sending ethereum takes exactly 21,000
gas metam Mass just defaults to setting
into that but we also see these other
interesting things we see a priority fee
and a Max base
fee let's reject this transaction and
let's look back at ether scan to talk
about these So currently in ethereum
according to e EIP 1559 every
transaction on ethereum comes with
something called the base fee this is
the minimum gas price you need to set to
include your transaction and you'll
notice that these are priced in
something called guay so what is aay if
we come to the site ethon converter.com
and again there's a link to this in the
GitHub repository we scroll down we can
see whey guay and ether if I put one
ether in here I can see how much one
ether is in terms of guay and in terms
of wayy one ether is equal to one 2 3 4
5 6 7 8 nine nine zeros so that's that's
one billion guay is going to be one
ether and then 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18
and then 18 zos is away these are just
easier ways of referring to really
really small amounts of ethereum so if
we look at our gas fees we see that the
base fee is
0.00004 gay and this obviously would be
an even smaller number if this was in
units of way so if we take this number
and we put it into our calculator we can
see that this is equal to 40 way or 0.
a whole bunch of zeros for ether the max
fee here refers to the maximum gas fee
that we're willing to pay for this
transaction and you can actually see
that our Max fee is a little bit higher
than what we actually ended up paying
our Max fee was 2.21 32 something
something and the gas price we actually
paid was up here now your transaction
might of course be a little bit
different then additionally we have a
Max priority fee this is going to be the
max gas fee that we're willing to to pay
plus the max tip that we're willing to
give to miners now currently in ethereum
this base fee ends up getting burnt and
we can see on ether scan exactly how
much is getting burnt here and if we
pull up our calculator again we can grab
this gas fee multiply it by the amount
of gas we used and we can see that this
is indeed how much ethereum we actually
ended up burning we go back to ethereum
converter paste it in we can see that
these two numbers are indeed equ
this means whenever you send a
transaction a little bit of ethereum is
removed from circulation forever or it's
considered burnt So currently in
ethereum part of your ethereum part of
your transaction fee actually gets burnt
and then the other part goes directly to
miners so to figure out exactly how much
went to minors we could do this number
minus the burnt amount and this is how
much ethereum was paid to an ethereum
minor for this transaction you'll see
down here transaction type 2 EIP 1559
this is the EIP 1559 version of these
transactions like I said every
blockchain is going to have a different
fee burning and and fee and gas process
and they're all going to be a little bit
different but the sum of it is
blockchains have limited block space for
transactions the gas price that costs
for your transaction to be included in
one of these blocks changes based off
how much demand there is the base gas
fee for ethereum will go up and down
depending depending on how many people
are sending transactions and how many
people want to be included in a block if
a ton of people want to be included in a
block that means a ton of gas is
obviously going to get burnt we've left
a link to a video in the GitHub
repository with this section from this
YouTuber who does an amazing job
breaking down this EIP 1559 and more
about how this gas model actually works
I highly recommend you pause this video
and watch that video to understand more
the base fee gets programmatically
algorithmically adjusted to try to
Target for all the blocks to be 50% full
if they're more than 50% full this base
fee automatically goes up if they're
less than 50% full this base fee goes
down now this is a lot of the basics of
how this transaction works and it can be
a little confusing so let's do a quick
refresher of everything in here there's
a unique transaction hash that uniquely
identifies this transaction on this
blockchain we can see the status we can
see the block number that it's confirmed
on one other thing we want to look at if
we scroll up we see block number and
block confirmations this is how many
blocks have been mined since this block
was included like we saw with our
blockchain demo the longer the
blockchain gets the harder it is to
tamper with and the more secure it is
typically you'll see some processes say
they'll only do something after 20 block
confirmations 30 Block confirmations or
or Etc the reason that they wait for
these block confirmations is because
they want to make sure that that
transaction is actually included and we
can actually see the block that our
transaction was included in and all the
other transactions with it different
details about how much gas was used the
gas limit Etc time stamp is when the
transaction happened we can see from and
to we can see the value and then we can
see the transaction fee which we see
right here is Block Base fee per gas
plus the max priority fee per gas times
the gas used and we see all the details
of the gas down here gas price is the
cost of one unit of gas gas limit is the
max amount of units of gas that we're
willing to pay in this transaction the
usage is how many actually got used the
base fee is going to be the base Network
fee per gas so 40 way per one gas used
the max gas is the max gas price we're
willing to pay and Max priority is going
to be the max gas price plus the tip
that we give to Miners and then we can
see how much is burnt and then we see
transaction savings which which is the
difference between how much was actually
used or paid for and then returned so
for example in this transaction the gas
price we ended up picking was a little
less than our Max gas price here so the
gas price we ended up using was a little
less than our Max priority fee here so
we had some savings compared to that we
can also see that this was an EIP 1559
transaction we can see our nuns here
which was nuns zero because the
transaction that I'm showing is our
first nuns and then of course we can see
the input data for transactions that are
just sending ethereum the input data is
going to be blank but you'll see that
when we get to Smart contracts the input
data is not going to be blank and it's
going to be one of the most important
features of these transactions you'll
also notice that there's a state tab
this is an advanced Tab and it shows the
different states that are changed based
off of this transaction where we're
going to ignore this one for now now
that we know how the blockchain itself
Works under the hood let's talk about
some blockchain fundamentals and we
actually covered all these topics in a
previous free code Camp video so let's
go to
that if the first time you listen to
this some of these Concepts seem a
little bit hard to grasp don't worry
about it as we continue and as we move
on with this course they'll start to
make more sense when you see them used
in real examples I definitely would
recommend going back and rewatching and
Rel listening to the parts that you
don't quite get and asking questions in
the discussions tab of the GitHub
repository awesome so now that we know
all the cryptography pieces and all the
little nitty-gritties of how the
blockchain actually works and how our
signatures work and how everything
sticks together let's talk a little bit
about how this works in actuality and
what's really going on now for a lot of
this each different blockchain has
slightly different algorithms and
slightly different metrics and criteria
for doing a lot of this stuff so when
we're talking about these specific
implementations keep in mind the exact
algorithm might be a little bit
different but the concepts are all still
going to be exactly the same hashing and
hash function is going to be the same no
matter where you look a decentralized
blockchain is going to be the same no
matter where you look how it's actually
implemented is going to be a little bit
different now traditionally when you run
an application you know be it a website
or something that connects to some
server you are interacting with a
centralized entity and unlike how we saw
with the blockchain with multiple
different peers it's going to be run by
a single centralized group now it still
could be run on many different servers
but all those servers are still going to
be controlled by the same centralized
group blockchains as we saw run on a
network of different independent nodes
when we saw Pier a pier B Pier C those
were different examples of different
independent users running the blockchain
technology on their own node now when I
use the term node I'm usually referring
to a single instance of a decentralized
system so when I say a single node when
I'm talking about a blockchain I'm
talking about one of those perer A's
Pier B's perer C's running that
blockchain software I'm talking about
one server running this technology and
again it's this network it's this
combination of these nodes interacting
with each other that creates this entire
blockchain what makes these so potent
too is that anybody can join the network
and that's why there's decentralized the
barrier to entry is a little bit of
Hardware requirements you getting the
correct materials to run the software
and then you running the software
anybody can join these networks and
participate and that's what makes it
truly decentralized in fact you can go
to GitHub right now and run your own
ethereum node in a few seconds now in
the traditional World applications are
run by centralized entities and if that
entity goes down or is maliciously
bribed or decides that they want to shut
off they just can't because they're the
ones that control everything blockchains
by contrast don't have this problem if
one node or one entity that runs several
nodes goes down since there are so many
other independent nodes running that it
doesn't matter the blockchain and the
system will persist so long as there is
at least one node always running and
luckily for us most of the most popular
chains like Bitcoin and ethereum have
thousands and thousands of nodes and as
we showed in our demo if one node acts
maliciously all the other nodes will
ignore that node and kick that out or or
even punish it in some systems because
they can easily check everybody else's
note and see okay this one is out of
sync with the majority and yes majority
rules when it comes to the blockchain
each blockchain keeps a full list of
every transaction and interaction that's
happened on that blockchain and we saw
if a node tries to act maliciously then
all their hashes are going to be way out
of whack and they're not going to match
everybody else this gives blockchains
this incredibly potent immutability
trait where nothing can be changed or
corrupted so in essence we can think of
a blockchain as a decentralized database
and with ethereum it has an extra
additional feature where it also can do
computation in a decentralized manner
now let's talk consensus proof of work
and proof of stake because you've
probably heard these before and they're
really important to how these
blockchains actually work when we went
through that blockchain example and we
did that mining feature this is what's
known as proof of work proof of work and
proof of stake fall under this umbrella
of consensus and consensus is a really
important topic when it comes to
blockchains consensus is defined as the
mechanism used to reach an agreement on
the state or a single value on the
blockchain especially in a decentralized
system I briefly alluded to this
consensus mechanism in our blockchain
example when I said if one changes
something and the other two don't then
majority Will Rule and kick that one out
this is part of that consensus mechanism
now very roughly a consensus protocol in
a blockchain or decentralized system can
be broken down into two pieces a chain
selection algorithm and a civil
resistance mechanism that mining piece
that we were doing or or the proof of
work algorithm is what's known as a syil
resistance mechanism and this is what
ethereum and Bitcoin currently use
please note that depending on when
you're watching this if eth 2 is out
then it's no longer proof of
work now proof of work is known as a
civil resistance mechanism because it
defines a way to figure out who is the
block author which node is going to be
the node who did the work to find that
mine and be the author of that block so
all the other nodes can verify that it's
accurate civil resistance is a
blockchain's ability to defend against
users creating a large number of pseudo
Anonymous identities to gain a
disproportionately advantageous
influence over said system and in
layman's turns it's basically a way for
a blockchain to defend against somebody
making a bunch of fake blockchains so
that they can get more and more rewards
now there are two types of civil
resistance mechanisms that we're going
to talk about here namely proof of work
and proof of stake let's talk about
proof of work work a little bit more in
depth first in proof of work this is Cil
resistant because a single node has to
go through a very computationally
expensive uh process called mining which
we demonstrated earlier to figure out
the answer to the blockchain's riddle of
finding that correct nuns or or whatever
the blockchain system has in place in
proof of work this works because no
matter how many pseudo Anonymous
accounts you make each one still has to
undergo this very computationally
expensive activity of finding the answer
to the proof of work problem or the
proof of work riddle which again in our
demonstration it was finding a Nuns with
that first four zeros but again each
blockchain might change the riddle or or
change the problem to be a little bit
different in fact some of these
blockchains make this riddle
intentionally hard or intentionally easy
to change What's called the block time
the block time is how long it takes
between blocks being published and it's
proportional to how hard these
algorithms are so these problems
actually can change depending on how
long they want the block time to be if a
system wants the block time to be very
very long they just make the problem
very very hard if they want to be very
short they make the problem a lot easier
we'll talk about cibil attacks in a
little bit and how they can affect the
system but with proof of work it's a
verifiable way to figure out who the
block author is and be civil resistant
now you need to combine this with a
chain selection rule create this
consensus now there's some consensus
protocols that have more features but
very very roughly these are the two
pieces that we're going to look at the
second piece is going to be a chain
selection role how do we know which
block chain is actually the real
blockchain and the true blockchain now
on bitcoin and ethereum they both use a
form of consensus called Nakamoto
consensus and this is a combination of
proof of work and longest chain
roll the decentralized network decides
that whichever blockchain has the
longest chain or the most number of
blocks on it is going to be the chain
that they use this makes a lot of sense
because every additional block that a
chain is behind it's going to take more
and more computation for it to come up
that's why when we saw in our
transaction we actually saw
confirmations the number of
confirmations is the number of
additional blocks added on after our
transaction went through in a block so
if we see confirmations as two it means
that the block that our transaction was
in has two blocks ahead of it in the
longest chain now I do want to point out
that a lot of people use proof of work
as a consensus protocol and I do want to
say that this is a little bit inaccurate
but sometimes people use it
interchangeably proof of work is a piece
of the overall consensus protocol which
in Bitcoin and ethereum 1's current case
is Nakamoto consensus nakomo consensus
is a combination of proof of work and
this longest chain rule both equally and
very very important now proof of work
also tells us where these transaction
fees and these block rewards go to
remember how when we made this
transaction we had to talk about gas and
a transaction fee so who's getting paid
who is getting this transaction and this
transaction fee is going to the miners
or the validators in a proof of work
Network they're called Miners And in the
proof of stake Network they're called
validators there are a little bit
different and we'll get into that when
we talk about proof of stake in this
proof of Works system all these nodes
are competing against each other to find
the answer to the blockchain riddle
remember in our example it was to find a
hash that has four zeros at the start
and again depending on the blockchain
implementation that riddle is going to
be a little bit different but all the
nodes are trying as many as possible to
try to get this answer first why because
the first node to figure out the answer
to the blockchain re is going to get
that transaction fee they're going to
get paid from that now when a node gets
paid they actually get paid in two
different ways one is going to be with a
transaction fee and another piece is
going to be the block reward remember
how we talked about alternating the gas
price or the guay on our transaction
well that's the transaction fee that
we're going to pay to these blockchain
nodes for including our transaction the
block reward is given to these nodes
from the protocol from the blockchain
itself you've probably heard of the
Bitcoin having before the having is
referring to this block reward getting
cut in half and it's supposed to be cut
in half roughly every four years this
block reward increases the circulating
amount of whatever cryptocurrency that
is being rewarded for example on
ethereum the Block reward is giving out
ethereum and on bitcoin the block reward
is giving out Bitcoin so these nodes are
competing against each other to be the
first one to find this transaction to be
the first one to find the answer to this
problem so that they can be the ones to
win both this block reward and your
transaction fee some blockchains like
Bitcoin for example have a set time when
they're no longer going to give out
block rewards and the miners or the
nodes are only going to get paid from
transaction fees now this gas fee again
is paid by whoever initialized the
transaction when we got our funds from
the faucet there was some server and
somebody else was paying the transaction
fee for us however when we sent ether
from one account to another our first
account actually paid some transaction
fee to send that ether in proof of stake
there's also a gas fee but it's paid out
to validators instead of Miners and
we'll talk about that in a little bit
now let's talk about two types of
attacks that can happen in these
blockchain worlds let's talk about the
first one being the cibil attack the
cibil attack is when a user creates a
whole bunch of pseudo Anonymous accounts
to try to influence a network now
obviously on bitcoin and ethereum this
is really really difficult because the
user needs to do all this work in proof
of work or have a ton of collateral in
proof of stake which again we'll talk
about in a bit the other more prevalent
attack is what's known as a 51% attack
now as we saw as part of our consensus
protocol these blockchains are going to
agree that the longest chain is the one
that they're going to go with so long as
it matches up with 51% of the rest of
the network this means that if you have
the longest chain and you have more than
51% of the rest of the network you can
do what's called a fork in the network
and bring the network onto your now
longest chain now Cil attacks obviously
are when a single node or a single
entity tries to affect the decentral of
the network by pretending to be multiple
different people although they're just
the same person or entity and like I
said it's really difficult to do in
proof of work and proof of stake so you
can see now that blockchains are very
Democratic whichever blockchain has the
most Buy in and is the longest is the
blockchain that the whole system is
going to corroborate when nodes produce
a new block and add it to the longest
chain the other nodes will follow this
longest chain that the rest of the
network is agreeing with ADD those
blocks to their chain and follow up so
very small reorganizations are actually
pretty common when a blockchain picks a
block from a different longest chain
puts it on and then has to swap it out
for another block and continue with a
different blockchain however if a group
of nodes had enough nodes or enough
power they could essentially be 51% of
the network and influence the network in
whatever direction that they wanted this
is what's known as a 51% attack and it's
happened on blockchains like like
ethereum classic which is not ethereum
this is why the bigger a blockchain is
the more decentralized and the more
secure it becomes so after you watch
this video and you become a blockchain
engineering expert I definitely
recommend you run a note as well because
you are going to increase the security
of the network as a whole by running a
node so proof of work is fantastic
because it allows us to very easily
protect against these Cil attacks and
keep our blockchains decentralized and
secure however it has some drawbacks as
well proof of work costs a lot of
electric
because every single node is running as
fast as they can to win this race to get
the rewards this leads to obviously an
environmental impact now since proof of
work in Nakamoto consensus a lot of
other protocols have taken this idea and
gone in a different direction with a
different civil resistance protocol a
lot of them with the intention to be a
lot more environmentally friendly and
the most popular one right now is proof
of stake there are some chains that are
already using this proof of stake
protocol and that are live and thriving
some of them are like Avalanche Sal
polygon polka
dot so let's talk about proof of stake
now again this is a different civil
resistance mechanism instead of solving
this difficult problem proof of stake
nodes put up some collateral that
they're going to behave honestly AKA
they stake in the example of ethereum 2
nodes put up some ethereum as a stake
that they're going to behave honestly in
the network if they misbehaved in the
network they are going to be slashed or
removed some of their stake obviously
this is a very good civil resistance
mechanism because if you try to create a
whole bunch of anonymous accounts then
each one of those accounts you have to
put up some stake and if you misbehave
you're going to run the risk of losing
all the money that you put up as
collateral in this system miners are
actually called validators because
they're no longer binding anything
they're actually just validating other
nodes now unlike proof of work which
every node is racing to be the first one
to find the Block in proof of stake
nodes are actually randomly chosen to
propose the new block and then the rest
of the validators will validate if that
note has proposed the block honestly as
we saw with our cryptography lesson it's
usually very easy for other notes to
verify if a proposal or a transaction is
honest now proof of stake obviously has
some pros and cons as well Pros are that
again it is a great civil resistance
mechanism and a great way to figure out
who the author of a block should be the
other Pros are that it's way less
computationally expensive to figure out
the new block because instead of every
single note on the network trying to do
this only one node needs to do this and
then the rest of the nodes just need to
validate it the cons are that it's
usually considered a slightly less
decentralized Network due to The Upfront
staking costs it costs to participate
now this gets into a little bit of a
philosophical battle on how
decentralized is decentralized enough
and I think that's up to the community
to decide and as we progress I think
we'll learn more and more about how
decentralized is decentralized enough
the general consensus amongst blockchain
Engineers though is that proof of stake
is very very decentralized and very
secure now there's another term that
might be the first time you heard it a
layer one we're going to talk about
layer ones and layer twos in terms of
scalability really quickly as well a
layer one refers to any base layer
blockchain implementation bitcoin's a
layer one ethereum's a layer one
Avalanche is a layer one these are the
base layer blockchain Solutions a layer
two is any application that is added on
top of a layer one added on top of a
blockchain some examples of layer twos
are going to be chain link arbitrum or
optimism arbitrum and optimism are very
interesting because they are layer twos
that also look to solve this scalability
issue arbitrum and optimism are what's
known as rollups and they roll up their
transactions into a layer one like
ethereum we're not going to go too deep
into rollups and how they actually work
but all you really need to know is that
they solve some of the scalability
issues by being another blockchain that
people can make transactions on still on
kind of this base ethereum layer now
they're different from side chains
because side chains derive their
security from their own protocols
rollups derive their security from the
base layers so arbitrum and optimism for
example is going to be just about as
secure as ethereum there's some
fantastic guys in there that go a little
bit deeper into rollups and I've left a
link in the description for you all
right so we just talked about a lot of
stuff so let's do a quick recap before
moving on civil attacks are prevented
due to protocols like proof of work and
proof of stake 51% attacks grow
increasingly harder with the size of
blockchain so you should run a node
consensus is the mechanism that allows a
blockchain to agree upon what the state
of the blockchain is sharding and
rollups are solutions to scalability
issues on layer ones a layer one is any
base blockchain implementation like
Bitcoin or ethereum a blockchain
scalability problem is that there's not
always enough block space for the amount
of transactions that want to get in them
this leads to very high gas prices and
again gas prices are how much it costs
to interact with a blockchain
so that's it for the blockchain basics
and the blockchain explainers with just
this information you now can go off into
the world and start working with
blockchains and interacting with
blockchains with at least some level of
knowledge as to what's going on you
should be incredibly proud of yourself
for just making it this far definitely
be sure to give yourself a pat on the
back and Round of Applause now that
we've gotten a lot of the basics and the
fundamentals out of the way let's start
jumping into the coding aspect this is
where you're going to learn how to
actually build these smart contracts how
to build these trust minimized
agreements in these blockchains and in
these smart contract platforms this next
section this solidity Basics the
solidity fundamentals section will give
you all the skills to start actually
coding solidity and understanding how
these smart contracts work underneath
the hood so at this point absolutely
give yourself a high five maybe say hi
in the GitHub discussions maybe say hi
high in the community on Twitter on
Reddit Etc and be proud of just making
it this far the journey has really only
just begun but you've already learned so
much let's begin the next section and
let's jump into the
code now that we're going to to the
coding part I need to stress to
absolutely use the GitHub repository or
web3 dev. education associated with this
course if you're on the GitHub repo
right now and you scroll down to lesson
two and this is going to look a little
bit different when you come to it you
can click on the GitHub repo associated
with this lesson this will have all the
code that we're actually going to be
working with for this section as well as
a read me section which is going to have
a lot of notes on how to actually work
with the code and instead of making
issues and discussions on this
repository here if you have an issue
please use the discussions tab of The
Foundry full course here or use any of
the areas that we've laid out in the
questions section we're going to teach
you how to ask questions so that they
have the highest probability of being
answered by either somebody else in the
community by an AI or by a forum
additionally please be sure to check out
web 3d. for more information as well I
highly recommend that you pause the
video right now and make accounts for
first of all GitHub and then at least
stack exchange ethereum additionally
chat gbt is a great resource to make an
account for just remember that it will
often get things wrong and isn't quite
up to date find you don't need to make
an account for but it often gets things
wrong sometimes as well typically for
each coding section I'll give you a
brief rundown of what we're actually
going to be building and in this lesson
we're going to be building this exact
smart contract and we're going to be
building your first smart contract ever
and we're going to deploy it to a
blockchain at the end of this section
you are going to have deployed your
first smart contract ever so be sure to
get to the end so you can deploy your
first smart contract we're going to be
using something called an IDE called
remix to deploy and interact and work
with this smart contract which is going
to be very exciting it's highly
recommended to get the best experience
out of this is for you to follow along
and you to code with me you can change
my speed on the YouTube video if I'm
coding too fast or I'm coding too slow
but you taking the time to write out the
code as I code along with you is going
to ingrain the knowledge into your brain
repetition is the mother of skill and I
want to make sure you come out the other
side with skill actually code this we're
going to be using a tool called remix
you can either Google search it or you
can just come to the GitHub repo or web
3d. education and click this link to
remix which will pop open the remix web
ID so let's go ahead let's jump in and
let's learn to deploy our first smart
contract at the end of this lesson you
will have deployed your first smart
contract you'll have written your first
bit of solidity and we are very excited
to get through this
part welcome to the remix IDE or the
integrated development environment this
is where we're going to learn to write a
lot of our code in the beginning if you
want you can go ahead and accept to help
out remix here and if you've never been
to the remix website before it'll give
you a tutorial walkthr of some of the
features that remix has to offer for
example it has a solidity compiler
solidity is the programming language
that we're going to be using in this
course to code our smart contracts where
and we need to compile them when we've
written the solidity we'll learn about
that in a little bit we have a tab here
where we can actually deploy our
contracts to a blockchain and we have
all these different folders and scripts
since we can actually write JavaScript
and typescript in remix as well but
don't worry about those too much for now
because I'm going to be explaining
everything that we're going to do remix
is an incredibly powerful tool because
it has a lot of features that will allow
us to really see and visualize what our
smart contracts do eventually we're
going to move off of remix to a local
development environment however remix is
a tool still used by some of the top
Auditors and smart contract developers
in the space when they want to quickly
check something out and additionally
it's fantastic for learning the
fundamentals of solidity the left hand
side is where we're actually going to
start interacting with remix if we bring
our Mouse up to the top this little file
explorer is where we're going to have
all of our files and where we're going
to write our solidity or our smart
contract code if you want you can leave
all these folders in here but I'm
actually going to go ahead and delete
everything so that there's less for me
to work with or or deal with so I'm just
going to go ahead and rightclick and
delete everything in here just so I can
start completely from scratch again if
you want to leave all of these in here
feel free to do so doesn't matter I just
think it's cluttering up my mental space
a little bit now we have a blank remix
project and the first thing that we're
going to want to do is create our first
file to start writing and deploying our
solidity smart contract we're going to
go ahead and click the create new file
right here and type in simple storage.
Soul doou tells our compiler that this
is going to be a solidity contract a
solidity file and we're going to be
writing solidity inside of this file
which again solidity is the most popular
smart contract programming language and
you'll see we actually get popped up a
simple storage. Soul on the right hand
side which you can type in and actually
write our solidity code now right below
the file explorer button is a little
search icon which allows us to search
for different code in all of our
contracts so for example if I type in
hello in here and I copy that paste that
into the search bar hit enter we can see
that it found this line hello in our
simple storage. let's go ahead and
delete that right below that search icon
is this solidity compiler and you'll see
a bunch of different stuff pop up which
tells us about our compiler
configuration and we can see even more
advanced configuration if we hit the
dropdown we're not going to hit that for
now let's go ahead and double click this
solidity compiler over here so we can
just see the simple storage. soulle I'm
also going to click this hide terminal
button so that we just see our simple
storage. soulle now the first thing that
we want to do in all of our solidity in
smart contracts is write the solidity
version that we're going to be working
with solidity is a constantly changing
language and we want to be very specific
about what version we're going to be
using to write our smart contract as
each version does different things to
write your version you're going to do
pragma solidity and then type your
version for most of this course we're
going to be using
0.819 as that's the most current
addition of solidity however getting
used to working with different versions
of solidity is really good for you as
you're going to be working with
different versions of solidity no matter
where you go certain versions of
solidity are considered more stable than
other versions right now there's a
popular tool called Slither which
recommends using
0.818 so if you want to default to 0.818
for this course feel free to do so we're
going to be using a couple different
versions as we code so this line says
we're stated our version now these two
slashes here stand for what's called a
comment in solidity and this allows you
to write anything after the two slashes
and when we compile or run our code it
will just ignore what's in here so we
could type blah blah blah whatever we
want cats are cool and it doesn't matter
you can write anything in here I highly
recommend as we're going along you
should write comments in your own code
as well for you to refer to later on and
additionally feel free to copy all the
code that you write and paste it locally
so that just in case your browser cache
refreshes or something you won't lose
all the work you've done so so before
you lock off for the day copy paste this
into a text file so that you can have it
for later but a good comment for here
might be this is the version now writing
our version like this in solidity tells
the solidity compiler that we're only
allowed to use 0.818 when compiling this
however maybe a new version comes out
and we're okay to use anything newer
than this version to tell the compiler
that we add this little hat this little
carrot which says this contract only
works with
0.818 or anything greater than that this
means 0.8.9 would work when 0.820 comes
out that one would work however
0.817 would not work if we were working
with 0.818 or above if we don't have the
carrot this tells the compiler that only
0.818 will work with this code if we
want to use solidity versions within a
range we could do something like this we
could say we want our version to be
greater greater than or equal to
0.818 but less than
0.9.0 this would tell the compiler that
any version between these two is a valid
version for example
0.9.1 would not work neither would
0.9.0 because these are not strictly
less than
0.9.0 great so now we know how to do
compiler versions now the next thing
every smart contract needs to start with
is something called the spdx
license identifier now this actually
isn't required by the compiler it'll
actually throw a warning if we compile
and it won't error it's fine if you
don't have this however it's highly
recommended this is a way to make
licensing and sharing code and IP of
your contracts a lot easier from a legal
perspective I have a link to more about
how licenses work in the GitHub repo
associated with this section of the
course MIT is known as one of the most
permissive licenses it basically means
anybody can use this code and pretty
much do whatever they want with it I
wouldn't worry too much about the
licenses right now but let's actually go
back to
0.8.9 and on the left- hand side let's
scroll down to this compiler button and
open this back up even right now now
that we don't even have any code we can
actually go ahead and compile this
contract now you might see a red
squiggly and you might see a warning
here but don't worry about that for now
to choose our compiler version We scroll
up to this section and we can choose the
compiler version that we want to work
with most of the time though if you just
hit compile simple storage. soulle or
you hit this big compile button it'll
automatically choose the version for you
for example if I scroll down but I hit
compile it'll automatically flip up to
08.19 and we were able to go ahead we
were able to successfully compile this
code now it says no contract compiled
yet because we haven't put a contract in
here yet we just put the version of
cility that we're working with compiling
our code means taking our human readable
code and transforming it into to
computer readable code which is
essentially a bunch of zeros and ones or
it's bite code computer code is very
specific instructions for the computer
to use or in our case the blockchain to
use for our contract we'll learn later
about Machine level code and op codes
and evm codes in a much later section of
this course Additionally you can hit
command s or controls which will also
save and compile you'll see I kind of
have a trigger finger and I will out of
habit hit command s all the time
because as somebody who codes a lot I
need to make sure I save all the time
otherwise things might not work as
intended as you saw if we use a
different version of solidity and we hit
the compile button it'll automatically
flip back but for example let's say I
wanted to use
0.8.7 anything greater than that and
we're on compiler
0.8.9 and we hit compile it won't change
however if I use something less than
0.8.7 and we hit compile it'll change
because it wants to automatically select
a solidity version that is appropriate
for the version that you chose again I
want to use
0.818 and I'm going to hit compile and
we're good to go now we're going to go
ahead and start writing our contract and
to get the full screen view again we
just go ahead click the solidity
compiler so that we can just see our
code here to start writing our contract
we're going to use a keyword in solidity
called contract this tells solidity that
the next piece of code is going to be
the name for our contract that we're
going to create you can think of a
contract very similar to a class if
you're familiar with JavaScript or
python or Java or really any
object-oriented programming and we're
going to go ahead and give our contract
a name here we're going to call ours
simple storage and then we add this
little open and closed curly braces or
curly brackets everything inside of
these curly brackets is going to be
considered part of this contract simple
storage now if we hit enter we go back
to the compiler and hit compile we can
see once again this little green check
Mark pop up this means our compilation
has been successful if we were to remove
for example this curly brace and hit
compile we would see we would get this
error compilation failed with one error
and if we scroll to the bottom it'll
tell us where the error actually is and
we'll get a little red popup saying what
line the error is actually on we'll
learn about debugging these errors in a
little bit but let's add the curly brace
back go ahead back to the compiler
compile and we're good to go
hypothetically we could deploy this
smart contract right now this is a valid
contract although it doesn't do anything
but congratulations technically with
just this little piece of code you've
written your first smart contract I
spelled version wrong so we're going to
correct that city has many different
types of things that you can build in
these smart contracts many different
data types or just types if you go to
the solidity documentation at docs.
solidity l.org again link this in the
GitHub we can select the types section
on the left hand side to learn more
about solidity types if you want to get
a holistic view of all the different
types you can go ahead and read this
documentation some of the basic types
are going to be Boolean Boolean uent and
an address and bytes bytes is a lower
level type which we'll talk about in a
little bit a Boolean is some type of
true false value a uint is going to be
an unsigned integer AKA a positive whole
number meaning no decimals no fractions
a integer is going to be a signed whole
number meaning it could be positive or
negative but again is a whole number and
then we have an address which is going
to be well an address it's very similar
to if we open up our metamask and we
click this account here it's going to be
something like this there are some other
types as well and ways to create your
own custom types but we'll learn more
about that later on we can use these
different types to Define different
variables VAR variables are essentially
holders for different values and these
values can have one of these types for
example we could create a variable
called has favorite number which would
represent if somebody has a favorite
number this has favorite number could be
true or false either they do have a
favorite number or they don't to tell
solidity that this has favorite number
is a true false or a Boolean we would
add this Bull keyword before has
favorite number so this has favorite
number is going to be either true or
false and to set its value we're going
to give it this little equal sign and
say true so now has favorite number is a
variable that represents true we could
also say has favorite number is false
meaning that somebody doesn't have a
favorite number for a uent which again
is an unsigned integer we could say uint
favorite number equals 88 this means
that this variable favorite number is
going to be 88 a uint and int are
actually special in that we can actually
specify how many bits or bytes that we
want to use for example we could say U
256 U 256 specifies this variable
favorite number has 256 bits we're not
going to go over bits and bytes in depth
right now but if you want to get a quick
refresher we've left a link in the
GitHub repo associated with this course
to give you an overview of bits versus
bytes and how they work an easier way to
think about this is really just how big
can it get the bigger the number over
here the bigger this favorite number can
be the maximum size is a ENT 256 and if
you don't specify the U 256 it defaults
to being a u 256 so this and this are
the same thing this this same thing you
could also have 8 Bits 16 bits 64 bits
Etc often times it's better when we're
writing our code for a readability
standpoint to be as explicit as possible
so you'll see me pretty much always
writing U and 256 because I want to be
very explicit with how many bits I'm
using for U and 256 even even though
they mean the same thing instead of a u
256 we could also have this be an INT
256 and actually let's add that Boolean
back up here now an INT can actually be
positive or negative so we could have
our favorite number be88 if we wanted to
we can also have strings or text
variables which I didn't name up here
but I'll say why in just a minute we
could say string
favorite in text equals 88 let's
actually make this positive 88 even
though an INT could be positive or
negative I'll put this little semicolon
here you'll notice that at the end of
every one of these lines I'm adding this
semicolon the semicolon is how you can
tell solidity that a statement has
completed so this semicolon is saying
the end of this line is right here if we
wanted to we could put all of our code
on the same line like this and this
would compile fine it just looks really
ugly so we always want to put our code
on a new line after the semicolon a
string in solidity
is basically text that represents well
words so I could say 88 instead of
having 88 in here to tell solidity that
something is a string you have to put it
in between quotes I could put really any
combination of characters in here even
like hello or follow Patrick on Twitter
and let's actually do U in 256 here
favorite number and we'll do an in 256
favorite int equals 88 this way we'll
just have an example of all these
different types on screen we can also do
an address so we can say address my
address equals and we can go into our
metamask copy the address and paste it
right into remix and add that semicolon
and now we have our address type in
remix and then finally down here we're
going to say a bytes 32 object fav bytes
32 equals cat and we're going to put it
in quotes just like we did the string up
here and what's interesting about the
string object is that strings are
actually secretly just byes objects
specifically for text so a string can
actually get converted to a byes object
really easily because under the hood
they're essentially the same thing bites
typically look like something like xerx
and then a whole bunch of random numbers
and letters that represent the hex of
whatever the bites is and can often be
represented as strings like cat we'll
talk about btes more in the future
similar to U 256 and in 256 you can have
different size bytes like bytes 2 two
byes byes four byes 8 Etc all the way up
to 32 you can also have just straight up
bytes and not have a number after but
that's a slightly different type and
we'll go over that later as well a u
like this and a u 256 are the same thing
but a byes 32 and a byes with nothing
are actually different so keep that in
mind for now the largest bytes like I
was saying is actually 32 so for example
we can't do 8 bytes 64 and if we type
that in Here remix section goes hey
there's an issue here and if we try to
compile this we scroll down we'll again
see this little error code here and this
little error pop up it even gives us an
output declaration error identifier not
found or not unique it gives us the line
and we can say ah Whoops a Daisy this
should be a bytes 32 and we can go back
and compile this for our simple storage
contract let's say that we only want to
store a favorite number this contract is
going to be a contract that allows us to
store our favorite number and some
different people's favorite numbers as
well so we're going to go ahead and
delete everything except for the U 256
favorite number so we're going to go
ahead and delete everything and boom and
we'll pick a smaller favorite number
just to make it a little mentally easier
now these variables actually have
default values so for example if I don't
set my favorite number to anything and I
have a line that looks like this you'll
see that this actually compiles fine
favorite number will actually get
defaulted to zero and all of these types
have a different default value U 256 is
zero booleans is false Etc so saying U
256 favorite number and not having an
equal sign after here is the same as
doing U and 256 favorite number equals z
so for now let's not initialize it to
anything so that favorite number starts
off as zero and remember as you're
coding along here and typing along with
me if you get confused make sure to
write your own comments for example we
can say favorite number gets initial
ized to zero if no value is
given now let's go ahead and learn to
make our first function basic solidity
function section functions or methods
functions or methods are a subsection of
code that when called will execute a
very specific small piece of our entire
codebase if you're familiar with
JavaScript or python or any other
programming language functions in
validity are exactly the same functions
are identified by the keyword function
let's create a function and name it
store and we're going to have this
function be responsible for actually
updating our favorite number we're going
to store a new favorite number so you
first write the function keyword the
name of the function and then you add
these two parentheses whatever is in
between these two parentheses represents
what we're going to pass or send to our
function or the parameters that we're
we're going to send to our function for
example we need to tell our store
function what value it should use to
update favorite number so we're going to
tell our store function it should take a
un 256 and this variable that we're
going to pass to it we're going to call
underscore favorit number it's important
that we give it a different name than
favorite number up here and we'll talk
about that in a little bit then we're
going to say this is going to be a
public function and we'll explain that
soon too we want to put these little
curly brackets in here as well and we're
just going to say favorite number equals
underscore favorite number and without
going too deep into what this is doing
we're saying I'm not going to explain
public yet but we will in a minute but
what we're saying is whenever you call
this store function you're going to set
our favorite number variable to whatever
variable that we passed I'll explain why
we do this underscore here as well in a
little bit and with just this we can
actually start to simulate what this
smart contract will do and if our store
function will actually work correctly so
what we can do with just this code right
here is come over back to the compile
Tab and hit compile make sure that we
get this green check mark and that
everything looks good and then we can go
down to this deploy and run transactions
tab our deploy and run transactions tab
has a ton of different parameters in
here on how to actually deploy and run
with our transactions we're going to
deploy this contract to a simulated
virtual environment so we're going to
deploy it basically to a fake
environment we're not going to be
deploying it to a test net we're going
to deploy it basically in kind of an
imaginary world in order for us to do
this first make sure we're on this remix
VM and for us we're going to just use
the default which is the merge doesn't
really matter which one you're on just
so long as it's the remix VM this remix
VM is a fake local blockchain where we
don't have to wait for transactions to
complete and we don't have to deal with
any of the oddities on deploying our
code to a real test net or a real main
net and don't worry about the rest of
these for now we also get an account
here when we run on our fake remix VM we
get automatically given an account with
a different amount of ethereum for each
account you can think of each one of
these accounts similar to our metamask
accounts in metamask except for these
our fake imaginary accounts that remix
just gives to us for our transactions
including deploying contracts we're
given a gas limit values that we can
send and we can also choose our contract
depending on which one we've compiled
since we only have one contract in here
we only have one to choose from so on
the left hand side to deploy our
contract to this fake remix VM
environment we're going to go ahead and
collect the deploy button if we scroll
all the way down to the bottom now under
this deployed contracts we can see we
actually deployed a contract here simple
storage we can see the balance of zero
and we see this big orange button that
says store and then u56 favorite number
on our local blockchain this at blah
blah blah here this is going to be the
address of our contract similar to our
wallets how they have different
addresses every single contract has a
unique address as well and if we hit
this little copy button and we close
this we put as a comment here and we
paste it we can see this looks exactly
similar to an address such as what's in
our metamask and then let's go ahead and
open the deploy back up and we see that
deployed contract is still there
additionally if you hit this little show
terminal button and you pull this up we
can actually see we have this little
comment here creation of simple storage
pending and we have this green check
mark here this is notating that we
actually sent a transaction to deploy
this contract similar to sending eth
back and forth in order for us to deploy
a contract we actually have to send a
transaction since we're doing this on
the remix M this is a simulated
transaction a pretend transaction inside
of our remix environment you can even
hit the little drop down and see even
more information about this transaction
you'll see a lot of familiar keywords
like status transaction hash from to gas
Etc deploying a contract uses the exact
same process as sending a transaction
for just eth the main difference is we
populate this data or input field with a
ton of that bite code and if you copy
this input field or this data field and
go ahead and make a comment in here
you'll see it's a massive line and this
massive line notates all the data
associated with this smart contract all
the machine readable code remember
anytime we do anything that modifies any
value on the blockchain we actually do
that by sending a transaction deploying
a contract is modifying the blockchain
so we do it in a transaction which means
yes we spend gas now this big orange
button over here actually resembles our
function store in our smart contract and
if we add some numbers in here and we
call it again if we pull the terminal up
we can see transact to simple storage
pending and we see we sent a transaction
which called this store if we do this
again with a different number we call it
we can see our terminal say oh you sent
another another transaction to update
the state of the blockchain and if we
scroll all the way up to our account
you'll see that we have a little less
ether in our account because we had to
spend the gas associated with well a
deploying this contract and then B
calling these functions and then for
example if I add this if I add five in
here and hit store we'll send a
transaction to store five on the
blockchain now you might be thinking
okay Patrick that's pretty cool but what
is the value of favorite number you're
telling me that this function store is
up updating favorite number but I can't
really see it how do I know that
favorite number has actually been
updated to five well the reason we can't
see it is that the visibility of our
favorite number is actually defaulted to
internal so us not having anything here
or right internal are actually meaning
the same thing and we'll talk about
visibility and default visibilities in a
minute but in order for us to actually
see the value of our favorite number
we'll go ahead and add the public
keyword to this this changes the
visibility of favorite number to public
and like I said we'll talk about
visibility in a minute but let's go
ahead and compile this let's go ahead
and delete this contract by hitting this
x here and let's redeploy this contract
with this new public keyword so let's go
ahead and hit deploy and now if we
scroll down and we open up our simple
storage we actually now see a blue
button labeled favorite number and if we
click it now we can see it returns zero
which makes sense because we know that U
256 is default to Z now if I go ahead
and add five into here and hit the store
button if I pull up the terminal we'll
see that we went ahead and executed that
store function call that transaction
that's going to take input this five as
favorite number and set it to our
favorite number now if I hit favorite
number you can see it does indeed return
five showing that we actually updated
our favorite number with this function
call and remember though I'm going to go
ahead and do the skan and remember when
I hit X here this is just removing it
from this window here if you actually
deploy a smart contract to the
blockchain hitting X from this window
doesn't do anything because once you
deploy your contract it's immutable it's
out there and you can't just delete it
by clicking X and remix functions and
variables can have one of four different
visibility specifiers in solidity public
private external and internal if you
don't give one of these keywords to your
variables it'll get defaulted to
internal public functions mean that
they're visible externally and
internally and you'll see here it says
it creates a getter function for storage
slst State variables this means that
other people can call this function or
call this variable when we didn't have a
visibility for favorite number it
defaulted to internal which is why we
didn't see this blue number pop up
because internal it means that other
contracts and people aren't allowed to
call on this favorite number we have a
little bit more here it says it actually
creates a getter function for storage SL
State variables when we add this public
keyword here it's actually equivalent to
us making a getter for this favorite
number variable a getter function and
I'll show you exactly what the function
will look like in a little bit now keep
in mind though everything on chain is
technically public so setting a function
or variable to private isn't a good way
to hide what the value actually is there
and we'll talk a little bit more about
storage and visibility and and that much
later just remember everything on these
evm chains is actually public data this
public variable just means any other
contract can call this favorite number
and see the value what's in favorite
number and private means only the
current contract can external functions
mean they're only visible externally and
this is only for functions not for
variables and it means another function
inside this contract couldn't call an
external function and internal means
only the current contract and its child
contracts can call the function we'll
talk about child contracts and
inheritance in a later section so let's
just keep it public for now the reason
that we have this underscore here in
this parameter is because we need to
tell users that this variable in here is
different than favorite number and
there's a a couple different conventions
on naming local variables versus these
what's known as state variables or
variables outside of functions and we'll
go over those later in the course now
here's something that's really
interesting as well remember how I told
you earlier that sending ether is a
relatively simple transaction right well
let's see what happens when we call this
store function and we update favorite
number to five let's actually call it
one more time and we hit the little drop
down here let's go to gas and we'll see
gas actually cost 27,000 gas which is a
lot more than the 21,000 gas it costs to
just send ether between accounts
remember every time you update the state
of the blockchain it's going to cost gas
now what do you think will happen if we
do more inside of this store function
for example we say favorite number
equals itself + 1 let's go ahead and
compile this let's delete our old simple
storage let's deploy this new one
remember the last one cost 27 gas let's
pull up the terminal and remix actually
gives us a little tool tip and it's
saying an infinite gas which we know is
actually wrong but let's go ahead and
add one two 3 in here and we'll hit
store we'll see this transaction we'll
scroll down we'll see gas is actually a
lot more it's way more gas it's 50,000
gas with just adding this line here now
technically I'm not telling the full
story here because there are some other
gas costs associated with the first time
you run a function but it's still more
right and that's what's important here
so so let's go ahead and delete that
line and go back to our old function
here now let's talk about something
called scope for a second so if I create
a variable in here called U 256 test VAR
equals 5 and I create a new function
called something make it public could I
access the test bar and then maybe
change it to six or seven what about the
favorite number VAR what about the
favorite number variable could I access
that to seven well let's go ahead and
see what happens if we try to compile
this we try to compile we actually go
ahead and get an error in our
compilation Undeclared identifier
whenever you create a variable it can
only be viewed in the scope of where it
is if that's confusing just look for the
curly brackets the reason that our
something function can read the testar
is because this testar isn't inside of
the curly brackets of something the
reason it can't read the testar is
because testar was created way up here
inside of these curly brackets outside
of something but favorite number wasn't
created inside of these curly brackets
so how come it knows what favorite
number is well something is inside of
these curly brackets and favorite number
was created inside of all of these curly
brackets if favorite number was created
inside of here it wouldn't be able to
access favorite number because again
favorite number is inside of this scope
and not this scope if you create a
variable like testar inside of store you
can only access this testar inside of
this store function and not anywhere
else the easy way to know what the scope
of a variable is is just look for the
curly brackets so let's go ahead and
delete this something variable and let's
delete this test far and let's recompile
now like we were saying earlier when we
add this public keyword to favorite
number it's the exact same as if we
created a getter function to return this
favorite number so let's actually write
a function similar to what this public
keyword is creating so we're going to
say function retrieve make this a public
view function and we'll talk about that
in just a second and we'll say it
returns a uint 256 and we'll add the
curly braces here and we'll say return
favorit number and often times when
these Auto suggestions come up like this
you just hit enter and they will
automatically do it so if we do favorit
and then I just hit enter boom
automatically like that now I'm going to
hit command s which is equivalent to me
going to the compile Tab and hitting
compile now if I go to the deploy Tab
and let's deploy this contract now we
scroll down we now see we still have
that store function we have our favorite
number function and we have a new blue
button called retrieve right now they
both start off as zero and then
obviously if we update this to five by
calling store yep I called store these
now both return five since favorite
number is the actual variable and
retrieve is just returning whatever
favorite number is now as you can see
here these two functions are blue but
this one is Orange what's the difference
why are the colors different well the
key is actually with this view keyword
here solidity has a special keyword
which notates functions that don't
actually have to run or don't actually
have to send a transaction for you to
call them and those two keywords are
going to be View and pure a function
marked view means we're just going to
read state from the blockchain for
example in our retrieve function we're
just going to read what the favorite
number variable is our store function
isn't reading it's updating something so
and it's changing the state of the
blockchain so we have to send a
transaction since our retrieve function
doesn't have anything inside here that
updates anything it just returns
favorite number we don't need to send a
transaction so if you add this view
function in here it disallows any
modification of State for example I
couldn't add favorit number equals
favorit number + one if we go ahead and
try to compile this we'll get an error
function cannot be declared as view
because this expression potentially
modifies state so we'd have to remove
this line or we'd have to remove the
view keyword so view functions disallow
updating State your functions disallow
updating State and they disallow even
reading from state or storage this
favorite number here is what's known as
a storage variable because it's stored
in a place called storage we'll talk
about that in a later section but if
this was labeled pure we'd see we get a
little red underscore here because
favorite number is reading from State
instead of returning favorite number we
would return something like seven so
this would be an example of a pure
function this would be an example of a
view function because we're reading from
State again we'll explain the difference
a little bit later and like I was saying
before if we call a view or a pure
function we actually don't need to spend
gas since we're not modifying the state
that's why these buttons over here are
blue they're representing view or pure
functions functions that we can call
without having to send a transaction for
example if I pull up the terminal here
and I pull this up and I call retrieve
we do get another function but it's just
a call and it looks different than if I
hit the store which has this little
check mark they're different because the
store is obviously sending a transaction
and the retrieve is actually just making
a call and not sending a
transaction however something weird is
going on here if I hit retrieve and I go
into the details of this call I can see
oh what's what's this why is there an
execution cost it says cost only applies
when called by a contract what's going
on there the reason for that is because
if another function that does update
state that does require a transaction
calls retrieve that transaction does
need to pay the gas of reading and
calling this retrieve function so
calling a view or a pure function
actually does cost gas only when a gas
cost transaction is calling it so we can
go ahead and call these as much as we
want it costs nothing but if another
function that does cost gas calls it
it's going to cost something for example
if our function store here then went
ahead and called retrieve like this
since store cost gas you're telling this
function hey also call this retrieve
function which is more work for it to do
and since it's more work it's going to
cost more gas so for example if we
delete this contract over here let's go
ahead and compile this let's go ahead
and deploy this with this retrieve in
here so let's go ahead and look at these
These are now zero we'll store five in
here we'll select the drop down we can
see how much gas we actually sent 50,000
gas let's go ahead and drop this now
close this out let's remove the retrieve
line let's compile we'll hit deploy
simple storage these are both zero We'll
add five it's store pull up the terminal
hit the drop down look at gas it's still
$50,000 but it's actually a little bit
less than before although I'm pointing
at gas we really should be looking at
transaction cost because gas is really
just actually how much we're sending
whereas transaction cost is how much gas
the transaction actually cost but in any
case it was a little bit less without
the retrieve function now I've kind of
been glossing over this a little bit but
this returns keyword specifies what this
function is going to give us when we
call it so when we have this returns
keyword in our retrieve function here
we're saying whenever we call this
retrieve function we want to get
returned or we want to be given this
favorite number of Type U 256 we want to
return a unu 256 from this
function now our contract as is is
pretty good it does one thing pretty
well it's it allows us to store our
favorite number update that favorite
number and then view that favorite
number and in fact let's go ahead and
make this an internal variable and we'll
have the retrieve function be the way to
get this we can have this public but for
now we're going to set it up like this
and I'll tell you why we're going to set
it up like that in the future but what
if we wanted to be able to store not
just our favorite number but other
people's favorite numbers as well well
what we could do is we could create
something called an array or a list of
favorite numbers what we could do is we
could say instead of just one uent 256
we could have a list of un 256 called
list of favorite numbers this bracket
syntax here identifies that we have a
list of un 256 or a list of numbers or
an array of numbers an array of numbers
is going to look something like this
it's going to have maybe the first
element is going to be zero maybe the
second favorite number is going to be 78
maybe the third favorite number is going
to be 90 now arrays are very common in
computer science and programming and an
array in solidity is exactly the same as
an array in any other programming
language if you're unfamiliar with
arrays arrays or lists are actually zero
indexed so the zero here is actually at
index zero so we refer to this object
here as the zero withth object right
this could be 77 and this would be the
zero withth object the 78 is going to be
the first element the 90 is going to be
the second element and so on and so
forth it's very common in computer
science to actually start counting from
the number zero and arrays start
counting from the number Z we'll learn
to play around with arrays more in just
a minute so this list of favorite
numbers is great but how do we know who
favorite number each section is this is
our list of favorite numbers how do we
know who zero is who 78 is who 90 is ETC
well maybe what we would do instead of
just having a raw list like this let's
go ahead and comment this line out maybe
we could create a new type called a
person in solidity you can actually
create your own types using the struct
keyword so we're going to say struct
person and do little curly brackets like
this inside of these curly brackets we
can Define what this struct person
custom type is comprised of and we're
going to say for every person they're
going to have a u 256 favorite number
and a string name now something
important to note is oh whoops we have
two favorite numbers here remember what
we learned about scope since this
favorite number is inside of these curly
brackets these would Clash a little bit
so what we're going to do instead is
we're going to rename favorite number up
here to my favorite number and we're
going to copy paste that down here as
well so we're we're renaming this state
variable this storage variable to my
favorite number and just keeping it down
here that way we can have favorite
number inside of this struct in any case
we created this new type of type person
which is a combination of each person
has a favorite number and each person
also has a name now similar to how we
can have a u 256 a Boolean a string and
in 256 Etc we now have a type of person
and this is similar to each one of these
oh and we're also going to have to
update the retrieve down here with my
favorite number instead of favorite
number now since we have our own new
type we can actually create a variable
of type person the exact same way we
created a variable of type my favorite
number so we could say person visibility
will be public my friend equals and
we'll put person here and put some
parentheses here because when you're
working with custom types you have to
Define both on the left side and on the
right side what type it is and in here
we would assign a favorite number and a
name so we could say seven and Pat like
that so now Pat is going to be a person
with a favorite number of seven and a
name of Pat see the first parameter goes
to the first
item in the person struct and the second
parameter goes to the second item I like
being a little bit more explicit when
working with structs and actually what
you can do is you can put little
brackets here instead and you can say
exactly what value you're going to
assign to what section so I can say
favorite number is going to be seven and
name is going to be that and we can hit
command s or just go straight to compile
to see if it worked correctly get that
little green check mark Now by doing
this we've created our own type person
and we've created a variable named Pat
with a favorite number of seven and a
name of Pat now if we were to go ahead
let's delete this old simple storage and
let's deploy our new simple storage we
scroll down we now have a new blue
button since this is a public variable
called Pat and if we click the button if
we call this variable we'll see favorite
number of seven and string name Pat you
can also see this zero and this one
which shows the index of each one of
these variables or parameters zero is
for favorite number one is for name if
we added another one maybe bull is cool
bull is cool would be at index 2
whenever you create a custom type like
this solidity will automatically index
them similar to the way that we index
our list or our Rays favorite number
zero name one whatever is next would be
two EX Etc now this is great for one
friend but what if you have a lot of
friends which I know a lot of you do
because you're taking this course which
automatically means you're cool maybe
what if you have your friend Mariah that
you would like to add to our smart
contract like this and her favorite
number is 16 or maybe your friend John
you'd have to copy paste the line add JN
in here his favorite number is going to
be 12 so on and so forth it might get
very tedious to have to write variables
for all of these people for all these
friends this obviously isn't a great way
for us to create lists of people or
lists of our friends so instead of this
we can actually use this array syntax
that we just learned and create an array
of person or a list of persons so I'm
going to comment all these out for now
and a quick tip here if you're on a Mac
and you highlight a couple if you're on
a Mac and you hit command backslash or
command question mark it'll
automatically comment or uncomment those
lines if you're on a Windows I believe
it is control slash but you might be
able to Google what the actual keyboard
shortcut is this is a keyboard shortcut
I use all the time so what we're going
to do now is we're going to create a
list or an array of persons so exact
same as we did it up here we'll say our
type first is going to be type person
array so we're type person array then
we'll State our visibility which is
going to be public then we'll get our
variable name which is going to be list
of people like this so we've created a
person array with visibility public and
the name list of people and we'll just
leave it blank for now so it'll get
defaulted to being an empty list which
would look like this now if I were to go
ahead and deploy this let's delete the
last one let's compile deploy we scroll
down we select this we now see we have
our retrieve blue button and we also
have this blue button for list of people
when you create arrays with a public
keyword
instead of being able to see the whole
array with this list of people button
you actually have to put in the index of
the elements you want to work with and
you get to see that exact element it
wants to take a u 256 as an input
parameter however obviously our array is
blank so if we say what is the person at
the zeroth index it'll say well nothing
because you have a blank array well what
about the first index well nothing what
about the second one well nothing no
matter what you put in the box right now
it's going to return nothing we'll show
you how to add to this array in just a
second this kind of array is known as a
dynamic array because the size of the
array can actually grow and shrink in
solidity a dynamic array is signified by
what's inside of these little brackets
here if we added a three in here this
would be a static array we're saying
this list of people can only have a
maximum size of three so we can only put
three persons in this array
Dynamic array static array can have any
size can only go up to three any size up
to three any size up to four hopefully
you get the picture we're going to work
with a dynamic array because we're going
to want to add a arbitrary number of
people to this person array so let's
create a function that will allow us to
actually add people and update this
array and let's delete this comment so
below our retrieve function we'll create
a function add person
and this is going to take two variables
as input it's going to take the name of
the person that we're going to add it's
going to take the favorite number of the
person that we're going to add as well
as the name so we'll say string memory
name and I'll explain this memory
keyword in a little bit and we'll do
uint 256 unor favorite number and let's
do and let's do underscore name and
we'll make this a public function and
what we're going to do inside of this ad
person function is we're going to take
this list of people object and call the
push function on it arrays come built in
with a function called push which allows
us to add elements or add person to our
list of people array so what we're going
to do is we're going to say list of
people. push and we'll add these little
parentheses here and we're going to push
a new person onto this array now what we
could do now let's comment this out for
now now what we could do is we could
create a new person person new person
equals person name favorite number like
we did above oops excuse me these are
backwards person memory new person which
we're going to ignore that for now and
then just do list of people. push new
person we could do this this is valid
syntax and I'll explain this memory
keyword in a little bit this is going to
create a new person and we push to the
list or we could just add this person
right into this push piece here so we
could delete this line instead of
creating a new person on its own line we
could say list of people. push person
and then we'll add in here favorite
number name since we're calling this
person favorite number name inside of
this push object solidity is smart
enough to execute this line of code
first create a new person and then
execute this line to push our person
into this list of people object so this
function should allow us to push new
people into our list of people array so
what we can do now is let's compile this
let's deploy this let's delete the old
one we'll hit
deploy now we see if we call our list of
people at zero we'll get nothing back
because it starts off as a blank array
but now we have this new add person
function where we can you can kind of
see very faintly it takes a string name
and a un 256 a favorite number so we can
add Patrick 7 we'll hit add person which
if you have your terminal you'll see we
made a transaction and now if we hit
list of people at zero we see we have
indeed added a person to the zero withth
index Patrick has a favorite number of
seven and his name is Patrick obviously
if we hit one we'll get nothing back and
this will just stay up but if we add
another person maybe John 16 add person
now at list of people index one we now
see John 16 so 0o it's going to be
Patrick 7 1 John 16 2 is nothing so
nothing
happens now we've talked about this a
little bit already but if we go ahead
for example and maybe delete this
semicolon and we go to try to compile
and we scroll down you'll see we get
this error parser error expected
semicolon but got bracket instead and it
gives us this little red exclamation
mark and the line that it's having an
issue with all these red errors mean
that your code isn't compiling and you
can't actually deploy this to the
blockchain because solidity doesn't know
how to turn this human readable code
into machine readable code so we need to
add this semicolon here recompile so we
get no errors now interestingly though
if we go to the top and let's say we
delete this SPX license identifier and
now we compile we scroll down we get a
yellow box and it says warning instead
of error says warning spdx license
identifier not provided source file blah
blah blah interestingly though if we
compile this we actually let's delete
our last symbol storage we can deploy
this so something important to note is
warnings are just that they're just
warnings they won't prevent you from
deploying or compiling your code errors
will prevent you from deploying or
compiling your code now even with that
being said though it is good to try to
remove all of the warnings because the
warnings are generally there for a
reason they're warning you that you
might be doing something bad and
sometimes if you have a bug in your code
simply just listening to the warnings
would have solved it so it's best to
listen to the warnings here so to
summarize if it's red it's broken if
it's yellow you might want to check it
out and additionally when it comes to
these errors and These Warnings this is
where using our Ai and Google searching
skills can really come in handy let's
say for example I ran our code I get
this error I read the error and I don't
really understand what's going on here
what we can do is we could maybe copy
this error and use any of the search
features that we talked about resources
for this course we can use chat gbt or
find GitHub discussions stack exchange
ethereum and panum and I'll explain what
each one of these is good for later in
the course but for example let's go and
try out find find is an AI search engine
for developers what it does is it first
does a Google Search and then it reads
all those links links and based off the
links it reads it tries to give you an
answer so what we could do is we could
say I am getting this compiler error in
solidity how do I fix it we hit this
little dropdown put any code or context
here we'll paste our error this is the
error like this and we'll go ahead and
hit
search we get a pretty verbose response
on what's going on with our code we
could actually take this a step further
and we could copy our entire code base
and we could paste it under here we say
code I usually put three back ticks
before and after any code that I use and
I'll teach you why in the future well
let's go ahead and hit enter and
research it actually is able to read our
code and say one way to fix the error is
to Simply add a semicolon at the end of
the line where you push the new person
to the dynamic array list of people and
we can see if we do indeed get a way to
just copy our ad person function and we
can scroll down and just paste it on top
with it being fixed and we could also
say concise because it's being a little
too verbose for us we'll hit enter again
and it wasn't that concise but a lot of
these AI tools like I said are still in
beta but this was a good example of how
using an AI tool like this can actually
help you detect bugs like I said often
times they will still get things wrong
which is why it's important for you to
know about GitHub discussions stack
exchange piranha Etc later in the course
I'll explain more about how to ask good
questions how to do good AI prompting
how to format your questions and how to
search and learn more one of the key
pieces of being a really good software
engineer or a good prompt engineer is
less about actually knowing the
information and more about knowing where
to find the information so throughout
this course I want you to practice using
these resources because they're going to
help you be a much stronger developer
much stronger prompt engineer and just
be better at every thing that we're
going to go over in this course if find
or chat gbt gives you a poor answer be
sure to use the GitHub discussions if
you have a question specific to this
course be sure to use the GitHub
discussions or if you have a more
general question about solidity about
Foundry or anything like that you can
use one of these resources again I'll go
over this more later but great job
you've done your first bit of prompt
engineering
congratulations you don't have to
understand this section fully now one
thing that we didn't really go over and
we kind of glossed over was this memory
keyword and you'll notice if we actually
delete this keyword and you try to
compile we'll get an error data location
must be memory or call data for
parameter in function but none was given
now there are actually six places you
can store data in solidity you have the
stack memory storage call data code and
logs we're not going to go over all of
these areas right now but we are going
to go over some of the big ones which
are call data memory and storage and
this is going to be a little bit
Advanced here so if you don't understand
this section the first time don't worry
about it just keep pushing through it'll
make more sense as you go later on in
the course call data and memory both
mean that this variable is only going to
exist temporarily it's only going to
exist for the duration of the function
call any anytime we call AD person with
a different name we can only access this
name variable that one time that we call
this function if I call add name Patrick
7 and now I try to list of people at
zero obviously we see Patrick at
favorite number seven we can actually
never access that Patrick variable ever
again because it existed in memory it
existed for a very short period of time
just for that single call we could also
have call data here and we'll go ahead
remove this deploy the drop down and do
the same thing we'll add Pat
and actually you don't even need the
quotes Patrick do 88 add person we'll
see if it's in there sure is call data
and memory both mean temporary variables
inside of functions most variables
automatically default to memory
variables strings are a special type in
solidity so you have to specify memory
or call data and it has to do with the
way arrays work in memory but we'll talk
about that much later on the course now
the question obviously then follows okay
well if call data and memory are both
temporary variables why have two what's
the difference between these two well
let's try something let's have this be a
memory variable and in here we'll say
name equals cat so we're going to
reassign whatever people put in here to
Cat Let's compile this looks like it
compiles fine now let's do call data and
try to compile ah we get an error type
error type literal string cat is not
implicitly convertible to expected type
string call data the difference between
memory and call data is that
a memory variable can be changed it can
be manipulated if we pass a memory
variable to a function we can go
ahead memory and I hit and I hit command
s to compile this is valid solidity this
is not if you pass a call data variable
you cannot modify it call data is
temporary variables that cannot be
modified memory is temporary variables
that can be modified and storage is
permanent variables that can be modified
my favorite number was actually
implicitly converted to a storage
variable since it's added in this state
context outside of a function if you
create a variable that's outside of any
function inside of a contract it'll
automatically be a storage variable and
let's delete this line let's compile
let's deploy again delete this deploy we
know it's a permanent variable because
we can hit retrieve and we can always
access what is in favorite number so if
we store 1 2 3 we hit store or we can
hit retrieve and we can access 1 2 3 so
this variable 1 2 3 exists outside of
function calls now even though I said
there are more places like stack code
log return Etc we can only make these
variables call data memory or storage
and like I said we'll explain that later
in the course so let's go ahead let's
add this back to memory because that's
normally what you'll see now the next
question that logically follows is oh
okay Patrick well why do we need to put
memory here but we don't need to put
memory over here in fact if we try to
put memory there we'll get an error data
location can only be specified for array
struct or mapping types but memory was
given like I was saying earlier arrays
structs or mappings are considered
special types in solidity and the way
that memory management works under the
hood makes it so that we have to put
this memory keyword un 256 is known as a
primitive type and solidity is smart
enough to know where to put this
favorite number always under the hood
like we were saying earlier a string is
actually an array of bytes and so so as
we just saw with the air we need to put
the memory keyword for arrays so then
the next question is okay well what
about the storage variable can I put
that here no you can't put that here
either since this is a function solidity
is smart enough to at least know that ah
okay this is a temporary variable that
you're working with it's got to be
memory or call data it's not going to be
storage since this name is only going to
exist for a short duration so you got to
pick one of these other two so the
summary of this section is that strs
mappings and arrays need to be given
this memory keyword string is an array
of bytes so it needs this memory or call
data
keyword so this code is starting to
shape up it has a lot of functionality
here we can store variables we can add
people but it has a bit of an issue if
we have this contract and we want to say
oh what was Kelly's favorite number
let's say we have four people in the
array let's have Pat
7 John 8
Mariah
10 and Chelsea 22 or
232 and we asked the question ah what
was Chelsea's favorite number well the
way we would do it is we'd have to
actually Loop through this list of
people to find Chelsea so we'd say okay
what's at zero ah okay that's Pat that's
not Chelsea what's at two Ah that's John
what's at three Ah that's Mariah excuse
me what's at three Ah that's Chelsea
favorite number 232 okay perfect I found
Chelsea but obviously if we had a
thousand people in this array that would
be a very tedious process and that would
take a long time for us to find the
person that we wanted so the question
then is is there a better data structure
than a list or an array to use that
makes it much easier to access and find
the information about the people that we
want and the answer to this is using a
mapping you can think of a mapping as a
dictionary it's a set of keys with each
key returning a special set of
information about that key so it's
similar to a dictionary if you look up
the wordthe the wordthe will have a
whole bunch of text Associated only with
the word thee so let's create a mapping
type and you'll see how it works in
practice so we're going to create a
mapping like this with this mapping
keyword and we'll say the key is going
to be a string and It'll point to a uent
256 so this is going to be our type
obviously what comes after the type our
visibility so let's just go ahead and do
public for this as well and I like to be
very explicit with my naming so I'm
going to say name
to number signifying that this mapping
Maps someone's name to their favorite
number and now with this we have
essentially a dictionary where every
single name or every single string is
going to map to one number so for
example if we looked up Chelsea we'd
automatically get returned the 232 that
we're looking for instead of having to
iterate through this list so let's add
some capabilities to our ad person
function here so that we can update our
mapping so we have this list of people.
push which adds someone to the array
let's also update this so it will also
add somebody to our mapping to do that
we'll say name to favorite number and we
put these little brackets in here to
specify what the key is and we'll
saycore name and we'll assign that
toore favorite number what this line is
doing is now it's saying all right in
our mapping up here in our name to
favorite number mapping anytime you look
for that person's name you'll
automatically get their favorite number
back and now you have a much quicker way
to access people's favorite numbers just
by knowing their name so let's go ahead
let's compile
this let's deploy this let's delete our
old one we'll deploy
this now we have this new name to
favorite number blue button and so let's
go through the same problem so let's say
we have Pat 7
John
16 Mariah
32 Chelsea
232 now same thing list of people zero
returns Pat list of people one John so
on and so forth or we could just go down
here and let's say let's look up Chelsea
and we automatically get 232 we get
Chelsea's favorite number back
automatically same thing if we look up
Pat we get seven if we look up JN
we get Mariah and if we look up
cheesecake we get nothing back in a
mapping the default value for all the
keys is zero so if you look up a key or
a word that we haven't added in the
mapping yet it defaults to the default
value of whatever that type is since RS
is a string to U at 256 U at 256 default
type is zero if we look for a key that
we haven't added we get zero back
so now that we've added all this
functionality we're looking pretty good
we really like the way that our contract
is set up we have our my favorite number
which is a internal variable but we have
a way to read it with retrieve we have
our new typing person we have a public
list of people array we've got a public
name to favorite number got a way to
update the favorite number retrieve the
favorite number and add people to both
our list and our mapping now now in the
future you'll hear me say that you
should never do this before you write
any tests before you get it audited but
for now this is just a dummy contract
that we're going to deploy on a test net
so we don't really care but let's go
ahead and learn how to actually deploy
this to a real test net this is going to
simulate what deploying to a real
network with real money is going to look
like are you ready you should be this is
going to be incredibly exciting after
you do this successfully you should 100%
tweet about it on Twitter on LinkedIn on
lens protocol on whatever social media
you want it's important to celebrate
your small wins surprisingly it'll help
motivate you moving forward so first off
let's make sure this actually compiles
okay cool we've got a green chat Mark
there's no warnings there's no errors
fantastic now let's go back to the
deploy Tab and we'll delete this down
here and we'll scroll up and we're going
to change the environment we're in this
remix VM and we're actually going to
move to injected provider metamask
remember this remix VM is kind of this
fake world that remix gives to us
injected provider metamask means that
we're going to literally inject our
metamask into this remix we're going to
inject our metamask into this website
we're going to allow this website to
interact with our metamask we'll first
get prompted by metamask to pick the
account we want to use I'm going to use
account one and hit next and we're going
to go ahead and hit connect similar to
the way we connected to the faucet we
scroll up to our metamask we now see oh
it says your account is not connected
that's because I'm currently on account
two let's flip to account one and we do
indeed see that account one is connected
and now before where we saw kind of this
fake account with fake ether we see our
actual account with the actual amount of
sapoia e that we have make sure that
again be sure to use whatever
recommended test net we have in the
GitHub repo for us we're using sapoia
don't worry about the rest of these for
now so make sure you're on the correct
test net to deploy to a test net you're
going to need some seia eth so if you
haven't been to the faucet be to head
over to the faucet to get some suppo eth
remember you can find those in the
GitHub or web 3d. education now in remix
what we're going to do we're going to do
the exact same process we use to deploy
to the virtual remix environment we're
going to do that to deploy to the test
set environment so we're going to go
ahead hit the deploy button and metamask
is actually going to go ahead and pop up
this is similar to what we saw with the
blockchain example with signing
transactions we're actually going to
sign and send a transaction on the test
set it's similar again to us sending
ether to our ourselves the difference
here is though that our data section has
a ton of information here all this data
is associated with sending this
transaction but this one has all of this
contract information encoded in machine
readable code or our compiled code in
details we can see all the pavement
information associated with this
transaction we can see exactly how much
gas it's going to cost to deploy this
contract on chain but again we're on the
aoia test Network so this is fake money
anyways to actually deploy this we're
going to go go ahead and hit the confirm
button and now we're going to have sent
our function if you have the terminal up
you can see we have this call created
and it says creation of simple storage
pending with this view on ether scan
button if you click the view on ether
scan button you'll get brought to this
ether scan page with this transaction
going through on sepolia you'll see it's
currently being indexed by Ether scan
but there's a good chance it already
went through and back in remix it
actually goes ahead and gives us this
green check mark saying that we did
indeed deploy this contract
you might have to wait a few minutes for
this to complete because again we're
sending a transaction to a test net
blockchain and the blockchain needs to
actually ruce the block with our
transaction in it but if we wait a few
minutes on either scan we'll eventually
see a success status with block
confirmations on this block section here
and exactly the same as what we saw with
sending e to ourselves we see all this
information about the transaction
transaction hash status block time from
to blah blah Etc but if we scroll down
this input data field is much bigger
than anything we've seen before because
again this is all the data associated
with creating this contract and of
course we see more gas fee information
because again deploying a smart contract
to the chain is modifying the blockchain
so we have to spend gas now if we come
back to our remix and scroll down we're
able to see our simple storage contract
and we're able to copy the address that
it's at so if we copy this address we go
back to Ether scan we can even paste
this into the bar here and we can see
this contract that we went ahead and
deployed ether scan is smart enough to
know that this transaction created a new
contract remember this has to be on The
seoa Ether scan not the main net ether
scan because we sent this on the sepolia
testnet so now that we have this
contract created we have all the exact
same functions that we had in our
virtual environment but these functions
are actually on a test net with a
contract that we actually deployed now
we can do all the exact same things we
were doing on our fake remix environment
on this test environment for example we
can call retrieve which doesn't send a
transaction it just reads off the
blockchain
and we get zero same as what we got
before if we look up a name like Pat in
name to favorite number we get nothing
back cuz we haven't updated anything if
we add zero in here for list of people
we get nothing back as well metamask
didn't pop up here because these blue
buttons are view functions View and pure
functions like we said don't send
transactions now let's go ahead and
actually send a transaction let's update
the blockchain let's update our contract
by storing a new favorite number so
let's do 7878
and we'll hit store and we'll press this
orange button you'll see you'll get
prompted with metamask actually popping
up saying okay let's update the
blockchain let's send this transaction
and if we go ahead and hit confirm the
exact same thing happens we'll get this
transact to simple Storage storage
transact to simple storage. store
pending view an ether scan this little
check mark we view it we can see the
transaction indexing on ether scan and
after you wait for a little bit the
transaction will go through and now if
we hit the retrieve button we can see we
have now stored 7878 on chain if we copy
the contract address again we paste it
into sapoia ether scan we scroll down
after a few minutes we'll actually see a
second transaction come through we see
two transactions associated with this
contract the first transaction obviously
is the contract creation transaction and
the second transaction is us actually
calling the store method ether scan is
smart enough to know that this is the
store method it's not always smart
enough to know that but for this one
it's smart enough to know and we see
that we actually updated our contract
and remember in the future please use
these testet sparingly we're just
starting out and we're just learning so
it's okay for us to send these
transactions here though but let's go
ahead and let's keep going because named
a favorite number of Pat still returns
nothing list of people zero still
returns nothing so let's go to add
person we'll do Pat 16 we'll hit add
person metam Mass pops up obviously
because we're updating the state of our
contract we'll hit confirm we see
transact to simple storage. adderson is
pending it looks like it has succeeded
so now if we do name the favorite number
of Pat we see 16 get returned and if we
do list of people at zero we see we get
Pat whose favorite number is 16 and
guess what at this point you've
successfully deployed a smart contract
to a real test net congratulations you
should be incredibly excited for
yourself be sure to give yourself a pat
on the back maybe go for a walk maybe
have an extra cup of coffee or an ice
cream because additionally you've also
interacted with that contract with these
buttons and remix that allow us to send
transactions to update the state of our
contracts congratulations you're a
solidity developer but we've got a lot
more to go and like I said make sure to
celebrate these little wins celebrating
little wins will motivate you and excite
you to continue to move forward so be
sure to take the time to Pat yourself in
the back congratulations if you've got
this far there's a ton more for us to
learn but just you getting here is a
fantastic achievement in itself now here
if we wanted to deploy to a different
test net all we would have to do in our
metamask is switch to a different testet
like linear Gilli since we don't have
any linear Gil we actually can't deploy
this to a test net but if we used a
faucet to get more linear gorill eth
that's how we would deploy it
additionally we could do the same
methodology for deploying to ethereum
main net or any other main net that you
want to work with throughout this course
the difference here is obviously you
just need to buy some ethereum to
actually deploy this smart smart
contract remix will automatically update
to whatever Network you're working with
for example right here it says Ah you're
working on the main network but if we
were to switch to gelli it would say ah
you're working on gelli but if we were
to switch again it would say ah you're
working on lenia in the future we'll
learn to add different networks so you
can learn how to deploy to any other evm
compatible network that you want
to now I've mentioned this a couple of
times but whenever we compile this code
it compiles it down to something called
the evm or the ethereum virtual machine
don't worry too much about exactly what
this means but essentially the evm is a
standard for how to compile and how to
deploy smart contracts to a blockchain
any blockchain that is evm compatible
you should be able to deploy solidity
code to some examples of evm compatible
blockchains and layer 2os which again
we're going to go over working with
layer twos more in the future are going
to be ethereum polygon arbitrum
optimism ZK sync and more just note that
it's important to double check the
blockchain before you launch to it for
example ZK sync is zvm compatible but a
couple of keywords don't actually work
with ZK sync now let's do a quick recap
of everything we learned in this lesson
and then after we do this be absolutely
be certain to take a break maybe go get
some ice cream go get that extra coffee
or whatever you like to do the first
thing you want to do in any smart
contract or solidity code that you write
be sure to write the version that you
want to work with and above the the
version be sure to add the spdx license
identifier if you're not sure what
version to use for now just default to
MIT then you have to create your
contract object and name your contract a
contract is similar to a class in other
programming languages anything inside of
the curly brackets for the contract is
part of that contract there are many
different types in solidity like U 256
string Boolean int Etc if we want to
create our own type in solidity we can
use what's called a struct you can
create arrays or lists in solidity you
can create mappings or dictionaries or
hash tables in solidity where if you
give it a key it'll spit out the
variable associated with that specific
key we can create functions in solidity
that modify the state of the blockchain
we can also create functions in solidity
that don't modify the state of the
blockchain view and pure functions don't
modify the state of the blockchain we
can also specify different data
locations in our parameters of our
functions but we can only do for special
types like strings strs and arrays call
data and memory mean that that variable
is only temporary and will only exists
for the duration of the function call
Storage variables are permanent and stay
in the contract forever function
parameters can't be storage variables
since they're only going to exist for
the duration of the function call
whenever we hit compile in our smart
contracts it actually compiles our
solidity code down to evm compatible B
code or machine readable code we'll
learn more about those specifications
later
and last but not least congratulations
on your first contract
here all right let's get started now
with our lesson three remember
everything is in the GitHub repository
or the web3 dev. education we scroll
down once again we can scroll to lesson
three and again a lot of this is undone
but it'll be done for the actual video
scroll down to lesson 3 and we have
lesson 3 remix storage Factory all the
code that we're going to be working with
is in this remix storage Factory f23
GitHub repository all of the GitHub
repos associated with this course end
with
f23 which stands for Foundry 2023 I'm
going to first do a brief walkthrough of
what we're going to be coding for this
lesson so for now just sit back and
relax and enjoy for this lesson we're
going to be working with three new
contracts our original simple storage
doso which we're going to do a slate
modification to a new five storage. or
add F storage. and a storage factory.
soou our storage factory. is actually
going to be responsible for deploying
new simple storage contracts yes other
contracts can deploy contracts not only
is this going to be able to deploy other
contracts but but it's going to be able
to interact with other contracts as well
what we could do is we could deploy this
to a remix VM H deploy we'll compile all
of our code go to a remix VM scroll down
to select the contract we're going to
select storage Factory not simple
storage deploy this see that contract
that we just deployed down at the bottom
and you'll see our top function is this
function called create simple storage
contract where if we pull up our
terminal and we click create simple
storage contct contract you'll see we
get a new transaction at the bottom and
this transaction is the transaction that
we deployed a simple storage contract
from our storage Factory contract now we
can actually go ahead and interact with
our simple storage contract remember in
simple storage we have a function called
store which takes a favorite number we
can actually call this store function on
our simple storage contract from our
storage Factory contract using this F
store function so we'll add the index of
our simple store contract which since we
only deployed one so far it'll be at
inex zero and we'll say our new favorite
number is 1 123 and we'll hit F store
and we'll click SF store at 0123 SF
store stands for storage Factory Store
so we're going to store the number 123
on index0 and again don't worry about
this making too much sense yet we're
going to explain this all in a minute
now if we hit SF get of zero we'll go
ahead and get back 1 2 3 we're saying
let's get the value of the simple
storage contract stored at index Zer and
we do indeed get 1 2 3 additionally we
have this list of simple storage
contracts array or list and it's only
size one right now but if we type in
zero here we get back the address of
that original simple storage contract
that we deployed additionally in this
lesson we're going to learn about a ton
of incredibly important solidity
features such as Imports and inheritance
without further Ado let's get
froggy and one more time of course
remember all the code is available in
The Foundry full course f23 of the chain
exelor or on the web 3d. ucation site
once it's up so here we are back in
remix with our simpl storage. soulle if
you skipped over the last section and
want to get that contract just come to
the full repository go down to lesson
two go over to the code in the GitHub
repo associated with this course the
remix simple storage f23 and just copy
and paste everything into remix yourself
to make sure you've done it correctly be
sure to hit compile we have our simple
storage contract that we created in our
last lesson which is great it allows us
to store our favorite number and it
allows us to store a list of people who
have different favorite numbers also a
mapping and some other different
functionality with interacting with
people's favorite number but we want to
go even further with this we want
another contract to actually deploy this
simple storage contract for us and
interact with it contracts interacting
with each other seamlessly and
permissionless is a feature of smart
contracts and blockchain development
that's absolutely essential and crucial
and one of the reasons why blockchain
development is so powerful the ability
for contracts to interact with each
other seamlessly is something known as
composability smart contracts are
composable because they can easily
interact with each other this becomes
even more important when we get to
topics such as defi where we can have
incredibly complicated Financial
products and instruments interact with
each other seamlessly because they're
all using the same smart contract
interface so we're going to keep our
simpl storage. the exact same way it was
from the last lesson and we'll update it
in a little bit but let's go ahead and
create a new contract called called
storage factory. Soul so let's go ahead
and get this contract set up now we're
going to be doing this a lot and when we
work with AI pair programmer now we're
going to be doing this a lot and when we
work with AI pair programming this is
going to be a lot easier for us to do
but for now repetition is the mother
skill so let's keep going first thing we
need to do is what if you want to pause
the video and add the first two things
you should put at the top of every slity
smart contract right now go ahead but
for those of you who didn't pause let's
go ahead and do
spdx license ident to fire MIT and then
let's do pragma solidity
0.818 or 19 or whatever you want to do
you know what let's do 19 what do we do
in simple storage we did 18 let's do
18 and then we'll do contract so this
will be the third thing actually
contract storage Factory like this and I
hit command s but you can also go and
compile like so and I'm also just going
to add the carrot here meaning we're
going to use 0.818 but any version
greater than that all also works as well
awesome now this storage Factory
contract is going to be deploying a
simple storage contract so let's create
a function that can actually deploy or
create a simple storage contract so
we'll say function create simple storage
contract and we'll make this a public
function and we're going to have this
create simple storage contract function
deploy a contract and then save it to a
state variable or a storage variable but
the question is okay well how does the
storage Factory know what the simple
storage contract even looks like how
does this contract know about this
contract how does this contract know
that this contract even exists the first
way that we could do this is we can
actually go to our simple storage. Soul
contract and start highlighting from the
contract word and scroll all the way
down to the end of the contract copy it
command C or rightclick copy go back
over to storage Factory and Below pragma
solidity but above contract storage
Factory paste it in here if we go ahead
and command s or compile this you'll see
that this actually goes ahead and
compiles successfully huh so this is to
show you that yes right now in our
storage factory. soulle we have contract
simple storage which ends here and we
also have contract storage Factory down
here you're allowed to have multiple
contracts in the same file now this
isn't a best practice because we really
don't want to be having multiple
contracts in the same file when we could
separate them out into their own files
as your projects get bigger and bigger
if you just add all of your contracts
into the same file it can get really
really confusing really difficult to
jump around the code and find the places
where you want to add stuff so normally
it's best practice to keep them
separated like we did above but we'll
learn a little bit more about how to
keep them separate in just a minute if
you go down to the deploy Tab and you
say on the remix VM and scroll down you
actually have this section to choose
your contract we can choose either one
of these contracts right now and if on
the right side you have storagea
factory. in this contract section you
can actually choose either one simple
storage or storage Factory and you can
see they're both in storage factory.
soulle if on the right hand side we go
to simple storage and we go back to this
contract section we can only chose
simple storage because the simple
storage contract only has one contract
in it the storage Factory has both
simple storage and storage Factory so
that can get a little confusing as well
if you have multiple contracts in the
same file but let's stick with this
methodology for now in our storage
Factory and let's even close out simple
storage. Soul at the top just so we
don't get confused in our storage
factory. Soul let's scroll back down to
storage Factory because now that we have
our simple storage in this file we can
actually deploy the simple storage
contract so this function is going to
deploy a simple storage contract but
we're going to save it to a storage or
state variable and we're going to do it
the exact same way we've been saving any
variable first thing remember like
remember how we did U 256 public
favorite number this was in the format
type visibility name we're going to do
the exact same thing the type of a
simple storage contract is going to be
simple storage and the reason that
solidity is going to be able to identify
this keyword is because it's the same
name as contract in the same sense that
our struct keyword allows us to create a
person type the contract keyword allows
you to create a new type of well a type
of simple storage contract so simple
storage for now we'll just give it a
visibility of public and we'll give it a
variable name simple storage now this is
going to be a syntax you're going to see
a lot and it might be a little bit
confusing the first couple times you
read it the difference between these two
is very subtle the difference between
simple storage on the left and simple
storage on the right is very subtle it's
simply that the S is lowercased over
here and the S is capitalized over here
solidity is case sensitive so these are
actually different word simple storage
here is referring to the contract simple
storage here is referring to the
variable you'll often see people use the
syntax when working with contracts where
they name the variable the exact same as
the contract itself if this is confusing
to you you can do my simple storage
instead of simple storage with lowercase
so either one of these works it's good
to get used to this as such but if
that's confusing you can do my simple
storage now in our create simple storage
contract function we're going to say
simple storage equals new simple storage
like this this new keyword is how
solidity knows to deploy a contract so
adjust this code alone if we go to the
compile tab we compile this this does
indeed compile we can go to deploy we
need to make sure we're on the storage
factory. Soul on the right hand side
we'll scroll down to the contract we can
actually deploy our storage Factory like
so hitting the deploy button and
remember you can see the transaction in
the terminal here and we can scroll down
to the contract right now there's two
buttons we have our blue view function
simple storage because again the public
keyword automatically gives the variable
name a getter function or a view
function and of course we have our
create simple storage contract orange
button because it is actually a
transaction right now simple storage
returns nothing the zero the default
value for an address which is the zero
address and if we call create simple
storage contract we get see a green
check mark meaning that transaction went
through now if we call the simple
storeage blue view function we see we
indeed get an address here we have
deployed our simple storage contract
from another contract oh my goodness so
congratulations now you know how a
contract can deploy another contract
awesome
job but the thing is like I was saying
if we just add all of our contracts into
the same file and we have these massive
contracts all interweave between each
other and can get very cluttered and
very confusing so is there a better way
we can actually arrange and organize our
code other than this and this is
actually even a little bit redundant
since we already have our simple
storage. soulle if I change something in
here then I would also have to go and
change it in here and that's too much
work for me as an engineer I will work
incredibly hard to be incredibly lazy so
instead of doing this we can use what's
called an import if we go ahead and
delete our contract simple storage in
our storage Factory here so that now we
just have the storage Factory contract
we can go ahead and use the import key
word to import simple storage. soulle so
we can do
import
do/ simple
storage. and a little semicolon here
this import do/ simple storage. is the
exact same as if we had this giant
simple storage in here so this import
simple storage. soulle is a shorthand
version of copy pasting that simple
storage. soulle into this contract and
now we're able to have simple storage.
in its own file and storage Factory just
import it from simple storage making our
lives much easier it takes our path
package or GitHub which we'll explain in
a little bit and and copy paste whatever
in that file at the top of our file
literally solidity for us is copy
pasting everything in here and sticking
it up here so we can go ahead run this
again let's compile delete our old
contract run remix VM let's be sure
we're on storage Factory we'll go to
storage Factory we'll deploy it scroll
scroll down click here simple storage
starts up as nothing create simple
storage oh my goodness look we deployed
a contract huzzah great work so now that
we're starting to work with different
files there's a number of things we want
to consider first one is actually the
solidity version so right now we're
using 0.8.1 with no carat and in storage
Factor we're using 0.8.1 with a carat if
I were to for example move the solidity
version of this down to
0.8.6 and go to compile this with a
different version remix is actually
going to remix is actually going to
automatically bump this up to
0.8.9 or actually remix is actually
going to automatically bump this up to
0.818 if I'm on the simple storage
because 0.818 is the version that works
for simple storage and it still is
compatible with storage Factory however
if I were to take storage Factory and
move it to
0.7.5 and try to compile it's going to
try to compile this with
0.7.0 and our simple storage with 0 .
7.6 and it's not going to be able to do
it for both and so we're going to get a
compilation error so when working with
multiple files it's important to keep
the version of solidity in mind because
you want to make sure that all of your
contracts can actually compile together
so this is great and all but right from
the get-go I want to teach you the more
advanced import that you should always
use so this is good but we actually
never want to default to this we want to
default to something called named
Imports let's say our simple storage.
Soul contract had a ton of other
contracts like contract simple storage 2
simple storage 3 simple storage 4 and
these were all massive massive contracts
as we have this right now import simple
storage. would import everything from
here simple storage simple storage 2
simple storage 3 simple storage 4 and if
these files were incredibly big when we
deploy our storage Factory it would have
to calculate all this extra computation
making the deployment of our storage
Factory more expensive if that's
confusing to you don't worry about it
right now additionally in the future
these can import from weird places that
aren't compatible with storage Factory
again that's not going to make sense
quite yet and that's okay but in any
case there's a way for us to not import
this whole file but only a very specific
contract or a specific section of our
simple storage. sole so instead what we
can do is in our import statement we can
specify the exact contract that we want
to import from this file so in our
simple storage. soou let's say we do
have these other contracts in here we
could say we only want to import simple
storage not simple storage 2 not not
simple storage 3 not simple storage 4 by
saying import these little brackets here
simple storage from simpl storage.
soulle and this goes ahead and compiles
correctly we could also import multiple
contracts from our simple storage for
example we could do import simple
storage simple storage 2 from simple
storage. soulle this way we only import
the exact specific contracts that we
want from these other files and I
promise you in the future always
referring to named Imports instead of
this type of imports will save you a lot
of headache in the future so always
default to this never default to this
just by learning this you are already
better than 80% of the current solidity
developers so
congratulations but all right fantastic
so we've learned about Imports we're
able to import our simple storage from
simpl storage. soou We're importing it
in the more advanced way
congratulations now already here you
might actually start running into some
questions right and we're going to get
more and more advanced with this course
and you're going to have questions which
is a good thing if you don't understand
stuff that means you're thinking
critically and you're approaching the
subject matter the right way so this is
where we're going to jump into again
doing a little bit of an AI chat example
so for example on this line let's say
you're a little bit confused and you go
what's the difference between simple
storage here and simple storage here I
don't understand so let's learn how to
work with chat chbt or any AI buddy to
ask them to help clarify so we're going
to go ahead I'm going to hit command a
or you can just highlight everything
command C to copy or rightclick copy
we'll go over to chat gbt and in here
we're going to ask the question hi I'm
having a hard time and let's zoom in
understanding the difference between the
simple storages on this line and here's
where we want to be very specific when
we're talking with AIS so I'm going to
hit shift enter so that it doesn't
actually send the question to chat TBT
but I'm going to put three back ticks
shift enter again and actually I said
we're going to copy the whole thing but
let's just copy this this single line
and paste it in here shift enter again
three back ticks again adding this
delimiter tells chat gbt that this is a
block of code and it makes it easier for
chat gbt to be able to understand that
this is a block of code and I'll hit
shift enter twice and if you have a lot
of code you're not going to be able to
copy your whole contract because a lot
of these AIS can only understand so much
in a question but this is small enough
that we can actually just go ahead and
copy the whole thing bring it back over
to chat yout and say here is my full
code and then we'll do again shift enter
three back ticks shift enter paste shift
enter three back ticks so now we have a
little AI prompt here that we can ask in
chubbt and and I don't have this in here
yet but in the GitHub repo associated
with this lesson I will add this AI
prompt in here so let's go to the bottom
and I was saying you need to use shift
enter but I guess you could just use
enter that's fine let's go ahead and
click the send button and it'll send
send it the question so now it'll start
outputting here and let's see what it
says and this is where we can already
start to see the power of these AI
buddies as learning buddies we see in
the given code simple storage is a
variable of type simple storage which is
a contract defined in simple storage.
Soul tells us what the line is doing it
clarifies the differences a little bit
more and a lot of this beginner basic
stuff AIS are really good at once we get
more and more advanced AIS are going to
start breaking apart but but at least
for the beginning of this course AIS are
going to be incredibly helpful and
Incredibly good at explaining a lot of
these what we could do if we wanted to
is we could also go ahead and copy this
prompt we can go over to something like
Bard paste it in here and ask Bard the
same thing and here's already a good
example of where an AI can get things
wrong if we scroll down it's telling me
you can use simple storage variable to
interact with the new simple storage
contract for example you could call the
set function to set the value on stored
data variable or you could call the get
function to get the value of the stored
date variable uh there is no stored data
variable so I don't know where it's
getting that from so just remember keep
in mind that AI can get things wrong and
that when they do there are other forums
that to use as well like I said we're
going to be learning about them as we go
on like stack exchange of theum piranha
or like I said of course the discussions
for of this course so if Bard or chbt or
whatever AI budy you're working with
gives you something confusing be sure to
go to the GitHub discussions or ask on
one of these
forms now as you can see though right
now every single time we call create
simple storage contract we're going to
deploy a new simple storage contract but
we're going to override it in this
simple storage right so if we go ahead
and deploy this right now scroll down
here simple storage at the zero address
create okay now it's at a new address
create again okay now it's at a new
address we're not keeping track of all
the different addresses that this simple
storage contract is being deployed to so
let's actually create a running list of
all the different simple storage
contracts that we're deploying so
instead of having this variable be just
a single simple storage contract let's
have it be an array or list of simple
storage contracts and we'll change the
name to list of simple storage contracts
so now when we deploy it instead of
saving it like this we're going to do
what we did before in our last section
we'll say simple storage new simple
storage contract equals new simple
storage and then we'll push it onto our
Dynamic array so we'll say list of
simple storage contracts push new simple
storage contract so let's go ahead and
compile this okay looks good let's go
ahead and deploy this we'll delete our
old one we're on the remix VM great
storage Factory and look at this you can
even see make sure we're on storage
Factory okay great we'll go ahead and
deploy that awesome we get list of of
simple storage contracts which now has
this U 256 input which allows us to
choose the index of the variable we'll
go ahead and create simple storage now
we go check the zerith index we have an
address if we check the first index
nothing happens if we call create again
which sorry if I have the terminal up
I'll call create again again now there
is one at the first index and since I
called it twice there's also one at the
second there's nothing at the third I'll
hit create again there's no one at the
fourth oh at the third excuse me awesome
so now we actually have a running list
of all of our simple storage contracts
now let's learn how to actually interact
with other contracts from a contract for
now we can think of our storage Factory
as a sort of manager for all these other
contracts so let's learn how our storage
Factory contract can actually call the
store function of the simple storage
that it deploys so let's create a
function called SF store which is going
to stand for storage Factory Store and
it's going to take two variables a u 256
undor simple storage index and a u 256
uncore new simple storage number we make
this public like this now in order to
interact with a contract you're always
going to need two things and we're going
to refer to this a lot you're going to
need an address and you're going to need
the AI now this is technically a lie you
really just need the function selector
but we're going to learn that way way
later in the course for now just think
okay I always need the address and I
always need the ABI the ABI stands for
application binary interface the ABI
will tell our code exactly how it can
interact with another contract we'll go
deeper into the ABI later on in this
course but for now if you go to the
compile tab H compile and you scroll
down there's this little button at the
bottom that says copy abi2 clipboard or
you can also go to compilation details
you can see a ton of information about
the compliation details such as the bite
code with the op codes some metadata the
name but also the ABI which tells us the
ways we can interact with this contract
if we hit the drop down for the zero we
see there's an input create simple
storage contract which is one of our
functions and you see state mutability
which we'll talk about later but if we
had another drop down we see list of
simple storage contracts and the other
drop down we'll see SF store these as
you know are the buttons that we can
press when we deploy this contract right
so if I redeploy this we see those exact
three buttons these are the three
buttons that were inside of that ABI
this is how remix knows to put three
buttons here because it looks at the ABI
and sees that there's three buttons so
in our code here our compiler knows what
the ABI is so in our code here the
compiler automatically knows what the
ABI is because the compiler is the one
that generates the API and we know where
the address is because we have a list of
all of our addresses that we're keeping
track of up here so the reason we have
the ABI is because we're importing our
simple storage contract and actually
let's delete this simple storage 2 we
don't really need the simple storage 2
so when we compile simple storage we
automatically get the ABI for solidity
in the future we'll learn other ways to
get the API so down here let's get a
simple storage contract to interact with
from our list and to do that we'll say
simple storage my simple storage equals
list of simple storage contracts at
index simple storage index like this
since this is an array of simple storage
contracts we can just automatically get
the contract itself like this however
let's say that instead of this being an
array of simple storage contracts this
was an array an array of addresses a
list of simple storage addresses like
this you don't have to code along with
me for this section just go ahead and
follow along and watch if we had a list
of addresses and this would be to be a
little bit different but we had a list
of addresses instead we could say simple
storage my simple storage equals list of
simple storage addresses at the index
and then do something called type
casting and we'd wrap this in
parentheses like so let me zoom out a
little bit so this is something we'll
learn about a little bit later so
basically what we're doing is this list
of simple storage addresses simple
storage Index this line returns an
address and we're wrapping that address
in simple storage like so if this is a
little confusing for you now don't worry
too much about it we will learn about
about it more later now that we have our
simple storage contract we can actually
call the store function directly on this
contract so now we can say my simple
storage. store and we'll add the new
simple storage number and this is great
if we were to deploy this contract right
now though and call this SF store
function though we wouldn't be able to
read the new variable that we just
updated our simple storage contract with
so let's create a function that allows
us to read from our simple storage
contracts as well so we'll create a
function called SF get which will take a
un 256 undor simple storage index is an
input parameter we'll make this a public
view function that will return a uent
256 you in 256 and we'll say simple
storage my simple storage equals and
we'll use this exact same syntax that we
used above to get the simple storage
index equals list of simple storage
contracts at the simple storage index
and now we're going to do return my
simple storage and again if you see
these autocompletes that come up you can
just hit tab but do retrieve so perfect
now let's go ahead and compile we'll go
ahead and delete the old
deploy we'll make sure we're on storagea
factory. soul we'll hit deploy and we
see storage Factory down here now let's
go ahead run through that exact same
exercise so we'll pull up the terminal
just to see our transactions go through
we'll hit create simple storage let's
see that it's actually there at the
zeroth index okay cool we see an address
there so now let's store a new variable
at index0 so at this address so we'll
say at index0 we'll store the number 1 2
3 and actually before I hit this button
if we go down here we hit zero we get
nothing back right but now if I hit SF
store with index zero favorite number 1
2 3 looks like the transaction did go
through now if I hit SF get we go ahead
and get 1 2 3
so our storage Factory contract was able
to create its own simple storage
contract store a variable in that
contract from the storage Factory and we
were able to read back the number one
two 3 all from within our storage
Factory contract feel free to pause
right now and play around with adding
different values creating different
simple storage contracts so that you
really understand what's going on you
can also feel free to hit the little
dropdowns and read more information
about these transactions just as a recap
in our storage Factory contract we have
a function called create simple storage
contract which creates new simple
storage contracts from the storage
Factory contract the reason it's able to
do this is because we're importing from
our simpl storage. file using something
called named Imports we're only
importing simple storage we're not
importing anything in these other
contracts then we use SF store to store
a new number on one of those simple
storage contracts using the index in our
array it can do this because we have the
address address and the ABI the list of
simple storage contracts automatically
compact with the address and the ABI and
then finally we can read back those
simple storage values that we stored now
we can make this sfg function even more
condensed since this list of simple
storage contracts simple storage index
returns an object of type simple storage
we can actually delete this whole line
copy
this paste it here and delete this line
and this will work exactly the same as
what we had before go ahead and save or
compile you'll go ahead and get that
green check mark there this retrieve is
saying we're going to call the retrieve
function on whatever this is and this
whatever this is is of type simple
storage contract we can actually do the
same thing up here by deleting this part
copying this line except for the
semicolon and pasting it over the myle
storage and hitting save or compile
awesome great job so far
awesome now let's say you really like
this simple storage contract you love
all the functionality except for one
thing you wish that the store function
didn't just store the favorite number
you wish it added five so for some
reason you want a contract that does
everything this contract does but just
adds five whenever you call store for
some reason you want everyone's favorite
number to be five larger than what they
think it is well one thing we could do
is we could just copy paste this into a
new file but again that's kind of too
much work for me I'm a lazy engineer
here but let's go ahead and see how we
can approach this problem so let's
create a new file and we'll call it add
five storage. soul and same thing since
this is a new contract we're going to
follow the exact same tips we're going
to do spdx license identifier MIT we're
going do pragma solidity
0.818 let's even do the little carrot
here and we'll do contract add five
storage like so compile great looking
good oh I'm getting a warning
spdx license spelled license wrong so
let's spell that right okay cool looks
good so like I said the first thing that
we could do is we could copy paste
everything in here and then just change
the pieces that we don't like in our ad
five storage this is a little bit
redundant a little bit too much work and
we are Engineers we want to work as hard
as possible to be as lazy as possible so
how can we do that well this is where we
can do something called inheritance we
can have our ad five storage contract be
something called a child contract of our
simple storage contract
and we can have our ad five storage
inherit all of the functionality all of
the functionality of our simple storage
contract so first of course in order for
our ad five storage to know about our
symol storage contract we're going to go
ahead and have to import it so we're
going to do import and we're going to do
once again the named Imports because
we're Advanced solidity Engineers so
we're going to say import simple storage
just the simple storage contract
froms simple storage. soul now if this
do slash is confusing to you don't worry
we'll learn about directory structures
later on in the course and then we'll
say our contract add five storage is
simple storage now our ad five storage
is going to do what's called inherit
everything from simple storage and our
ad five storage is going to have all the
same functionality as simple storage we
can actually see this directly if we go
to compile let's go ahead and delete our
previously deployed contracts we're on
the remix VM let's make sure we're we've
selected ad five storage adiv storage.
Soul let's go ahead and deploy it and if
we scroll down we can actually see oh my
goodness it's got all the same buttons
as simple storage even though the
contract itself doesn't have anything
defined that's because we inherited all
of the buttons We inherited all of the
functionality of simple storage into ad
five storage if you want a contract to
inherit the functionality of another
contract you just import it in and then
say your contract is that other contract
now we can keep going though and add our
own custom functionality into ad five
storage that's not in simple storage so
for example we could say function say
hello it's going to be a public and it
returns a string memory and again you
need the memory keyword because strings
are special in solidity and we can just
say return hello like so this will be a
public pure it's not a view because
we're not reading from storage and again
if that dissertion is a little confusing
to you don't worry too much about it now
but if we go to deploy it it's still
delete our old one we'll deploy this one
we see we have all the functionality of
simple storage plus this say hello
function great but let's delete that for
now let's say instead of wanting to add
additional customization you actually
love every function in here except for
one remember the reason we wanted this
adiv storage. soulle is because we
actually want to change the store
function to have it add an additional
five to people's favorite numbers maybe
you're mischievous and you want people's
favorite numbers to be five greater than
they are well to add this ad five
customization to that store function we
can do something called overrides to do
overrides there are two keywords that we
need to be aware of those are virtual
and override if our were to try to
create a store function for our ad five
storage right now what do you think will
happen well let's try it out so let's
say function store un
256 undor new
number public if we try to compile this
right now we'll actually get an error
even if there's nothing in this store
function we roll over we say from
solidity type error overriding function
is missing override specifier and
remember if you get lost or confused an
error like this is something perfect for
you to ask chat TBT or maybe even find
we could say I am trying to compile my
solidity code but I'm getting this error
we can copy this whole error here paste
it in here and then in additional
context we'll just add the code like
this we'll hit search see what it gives
us we'll say and it looks like find was
able to find the answer the error
message indicates the function store in
the ad five storage contract is missing
the override specifier which is required
because it overrides a virtual function
from the simple storage contract thanks
I'll explain what find is giving us in
just a minute it's right we need to tell
solidity that it needs to override the
store function in simple storage we want
to be very explicit and say hey do this
store function and not what's in simple
storage. soole so let's go ahead and add
that keyword override now though if we
just add that keyword we go ahead and
try to compile we still get an error
trying to override a non- virtual
function did you forget to add virtual
in order for a function to be override a
bowl you need to add this virtual
keyword in the base class or the parent
class so in simple storage we need to
add virtual to store this virtual
keyword means that this function is
overridable any function that doesn't
have this keyword you can't override now
our store function is override a and
we've specified that we are indeed going
to override the store function now if we
go ahead and compile we'll see
everything compiles successfully all
right great so now let's just add the
functionality to store remember since ad
five storage inherits everything from
simple storage this means that we even
have access to my favorite number so
what we can do is we can say my favorite
number equals underscore new
number plus 5 we'll compile this and now
let's try it out we're on remix VM we
want to make sure we're with ad five
storage we'll delete the other ones
we'll deploy scroll down hit the drop
down retrieve currently return zero now
if we store two pull up the terminal to
make sure we're actually sending
transactions we'll hit store and now if
we hit retrieve we see we indeed get
seven back cuz 2 + 5 is 7 we add five we
hit store retrieve now returns 10 So
This Is How We Do inheritance and
override
functions and that's it for this section
you've learned a ton of incredibly
powerful features in solidity so let's
do a quick recap of what we learned this
section we learned that with the new
keyword we can actually deploy contracts
from other contracts we learned that we
can actually import other contracts
which is essentially the same as copy
pasting the code into this file we also
learned this thing called named Imports
which is going to make you look even
better than most of the solidity devs
out there we learned that we can
interact with other contracts so long as
we have the address and the ABI the
simple storage type automatically comes
with the address and the ABI so we can
just access it like this we didn't learn
too much about the ABI but we'll learn
more about it later we learned that if
we want to make a child contract and
inherit the functionality of some other
contract we can just import that
contract and then use the is keyword in
the contract declaration to override a
function we need the override keyword
and we need the base class or the parent
class to have the virtual keyword on the
function you want to override and that
is the end of this lesson so be sure to
give yourself a huge pat on the back
take a break breaks are good for your
brain go for a walk grab a coffee get
some ice cream go tell your friends go
post on Twitter you're getting more and
more advanced with solidity very quickly
so be sure to celebrate the little wins
to keep being excited and keep that
Curiosity congratulations youve
completed this lesson
all right everybody welcome back we are
now headed into Lesson Four this is
going to be our remix fundme and once
again you can find all the code
associated with this lesson in the
GitHub repository associated with this
course and also web3 dev. and let's do a
quick walkthrough of these contracts
before we actually start coding anything
to see what we're going to be doing
we're going to be creating one contract
funme doou we're also going to have
another file called price converter
dossou and we'll talk about that in a
little bit the fundme contract is going
to be our main contract this is going to
be an example of a crowdsourcing
application or a way to raise money you
can think of it as a web 3 decentralized
Kickstarter will allow users to send
ethereum polygon Avalanche Etc or really
any native blockchain cryptocurrency
into this contract and allow the owner
of the contract to actually withdraw all
the funds for them to go spend on their
new project and we are going to actually
deploy this contract to a test net and
remember use the test net transactions
sparingly but if we deploy this to a
test net we scroll down we actually see
that we have a couple of buttons and a
new color button we'll actually get a
new red button for our fund function a
red button indicates that a function is
payable and we can send native ethereum
or polygon or Avalanche or whatever the
native cryptocurrency of the blockchain
we're working with is We additionally
will indicate a minimum USD amount to
send to the contract so fun have to
spend at least $5 worth of ethereum in
order to call this fund contract so if
we go up to the value section we can
actually send some value with this
transaction and again don't worry about
this making sense yet but if I want to
send 0.01 ether I'll grab that amount in
way paste it into the value section here
I'll scroll down I'll hit the fund
button minimass will pop up I'll confirm
we can see at the top the current
balance of the contract is zero and
we'll wait a little bit for the
transaction to finish going through and
after the transaction finish is going
through we can see ether scan we have a
balance of 0.01 eth and we can also see
that after remix after a slight delay
then we can allow the owner of the
contract to withdraw those funds right
now the owner of the contract is also us
and after this transaction goes through
we'll see that balance removed from the
contract and it'll go back into our
wallet and as you just saw there if we
held our metamask up for long enough
eventually it would pop back into our
metamask are you excited we you should
be because after you complete this
section you'll actually know most of the
fundamentals of working with solidity
we're going to going to be going over a
lot of advanced features in this section
and I'll let you know the specific parts
that you don't need to fully understand
quite yet there's going to be a couple
parts where if it doesn't totally make
sense just keep going with the course
and as we get later into the course
you'll figure out why they make sense
but it might be a good idea to write
down the questions that you have to ask
either an AI on the GitHub discussions
or web3 education. make sure of course
to use the discussions Tab In The
Foundry full course f23 to ask questions
and interact with other developers who
are taking this same course or go to
web3 dev. education to learn more all
right let's get
froggy so the first thing that we want
to do is let's once again delete
everything in our remix so we can start
from scratch so I have the contracts
that we're actually going to be building
in here you might have the simple
storage the ad five extra the storage
Factory Etc let's go ahead right click
and just delete everything we're going
to start completely from blank here so
let's go ahead and delete everything in
here all right great so let's go ahead
and start creating our contract we're
going to call it fund. Soul one thing
that's really good when you actually
start building any code at all is to
First write down what you want it to do
so what do we want ours to do we want to
get funds from users into this contract
withdraw funds to the owner of the
contract or whoever has created this
fundme contract and then we also want to
set a minimum funding value in USD we
don't want people to be able to donate
just a penny so let's go ahead and set
this up
spdx license identifier identifier MIT
do pragma solidity carot
0.818 contract fund me let's go ahead
and delete these comments so before we
embark on writing all of our
functionality out let's just write down
the functions that we want to build so
we're probably going to want a function
fund which is going to be the function
they call to send money to our contract
we're going to want a function withdraw
which is going to be the function that
the owner of the contract is going to
use to withdraw the money that the
funders send us and those are going to
be the two main functions that our
contract is going to need we're going to
be implementing more functions than just
this but these are going to be the main
functions to interact with our protocol
or interact with our fundme contract
let's comment out withdraw for now and
just start focusing on
fund we want anyone to be able to call
this fund function so we're going to
make this public and we want this
function to do what well we wanted to
allow users to send money and we want to
have a minimum dollar amount that they
have to send so the first question we
need to answer is how do we send eth to
this contract how do we have it when a
user calls the Fone function eth
automatically gets sent into our
contract whenever we send a transaction
on the blockchain there's actually
always a value field that gets populated
and most of the time it gets sent with
zero even before when we called the send
function between our accounts when we
added an amount in our metamask this
amount value populated the value field
of our transaction this value field is
the amount of native blockchain
cryptocurrency that gets sent with every
transaction the first thing that we need
to do to allow a function in solidity to
accept this native blockchain currency
in the first place is to make the
function payable it's this payable
keyword that makes the function look red
in the remix UI just like how wallets
can hold funds contracts can actually
hold funds as well so whenever you
deploy a contract similar to a wallet
address it actually acts almost the same
as a wallet address you can send money
to it you can interact with it Etc and
like we did in the demo you'll see this
contract actually gain a balance just
like a wallet you can access this value
amount of a transaction using one of the
globals in solidity called
message. solidity has a number of these
globally available keywords and
functions and you can find these in the
solidity documentation one of them is
message. value which is the number of
way sent with the message if we wanted
users to be required to spend at least
one whole ether with this fund function
we could use something called require to
do so in order to do that we would add
this line require message. value is
greater than 1 E8
and there's a couple of things to unpack
here 1 E18 is equal to 1 ether which is
equal to 1 1 2 3 4 5 6 7 8 9 10 1 2 3 4
5 6 7 8 or put another way it's equal to
1 * 10 raised to the 18th in solidity a
double asri or double multiply sign is
how you do a power or an exponent this
value here is the value in way of one
ethereum in your smart contracts and at
the lowest level this is how they
process numbers in this giant wave
format so if we wanted people to be
forced to send at least one whole eth
with this fund function we would just
say require message. value is greater
than 1 E18 you can use something like
eth converter.com see to convert one
ether between ether whey and gay is
actually another value in between ether
and Wei and we saw gu actually when we
saw gas costs normally gas costs are
shown in forms of guay this required
keyword is a checker it's basically
saying hey is message. value greater
than 1 E18 if not then revert this
transaction and if we want we could add
a little revert message we could say
like didn't send enough eth we can
actually deploy this we can actually
compile and deploy this on a remix
vmy scroll down and if we hit fund and
if we pull up our terminal we hit fund
we actually see we get this little X
here meaning our transaction didn't go
through and if we hit the drop down oh
again same thing same thing we know that
this error is because we have this
require statement in here in our
transaction is reverting or not going
through so we know that with this
transaction we need to send at least 1
eth or or 1 E18 way worth of eth in the
value section of our transaction so if
we scroll up we can actually just change
the unit to Ether put one in here scroll
down and now if we hit fund oh it
doesn't go through because we have
strictly greater than so excuse me Let's
do let's do two now I'll scroll down
we'll hit fund and we see we get a green
check mark and we see the fundme balance
actually has improved to two if we
update the value to two again and we
scroll down we had fund again we see our
transaction went through and we have
four if we try to do less like let's
change this to way and we'll do you know
th way scroll down we hit fund up it
fails because 100 way is less than 1 E18
way right because 18 E18 way is this
much way so obviously th000 or however
much I put in is much less so this
require says if this first section is
false then go ahead and revert with
whatever this second section
is reverts can be a little bit confusing
and a little bit tricky so what is a
revert a revert undoes any actions that
have been done previously and sends the
remaining gas associated with that
transaction back so what does that
actually mean well let's say for example
in our fundme contract we have a u 256
public my value and let's have my value
initialized to one now in our fun
function let's say my value equals my
Value Plus two so every time this fun
function successfully goes through we
add two to my value however if we get to
a revert statement even though we added
two to my value previously since our
contract reverts this would actually
revert this action or reset it back to
its initial state so if this transaction
reverts my value would go back to one or
whatever it was previously if we compile
fundme we delete our previous deploys
we're on the remix VM we'll deploy
fundme we'll scroll down we have my
value which defaults to one if we call
fund right now without any value we pull
up our terminal we can see the
transaction failed my value is still one
even though this line technically
executed this line executed but then
this line hit and it reverted what was
done here so if we scroll back up though
we go to Ether we'll put one in for now
scroll back down now we'll hit fund oh
needs to be more than one excuse me
we'll add two here scroll back down now
we'll hit fund that transaction did go
through which means my value will now be
equal to three and again if I set value
to zero we call fund it reverts so my
value is still three so then the
question might be oh well did we spend
gas to do this if my transaction didn't
even go through well unfortunately the
answer here is yes if you send a failed
transaction you will spend gas because
computers executed this line and then
they executed this line and just failed
so users can actually specify how much
gas they send with every function let's
say there was a ton of computation after
this require line we would need to send
a ton of gas to operate and run our fund
function however once it gets to this
require line and it reverts however much
gas that we sent to execute the rest of
the computation would just get refunded
to whoever initiated the transaction
like I said sometimes the refunds and
some of that can be a little bit
confusing so again for now just know
that if a transaction reverts it undoes
anything it does previously and you can
consider consider the transaction failed
however if you send a reverted
transaction you will still spend gas but
okay let's delete this value for now
delete it from the global scope and
delete some of these like that in fact
every single transaction that we send
will have these fields it'll have a nuns
or the transaction count the account the
gas price the gas limit that we've seen
on ether scan a two aka the address that
the transaction is sent to a value which
is going to be this amount that we're
talking about we'll also have data which
is going to be what we send if we make a
function call or deploy a contract and
then it'll have this vrs components
we're not really going to go over these
VR ands because this is that
cryptographic magic that's happening
when a transaction is signed but just
know that that's in there for sending
value we can populate some of these
fields the gas limit for example is
populated to 21,000 data is going to be
empty and then that two is going to be
the address of the transaction want to
send to for a function call we can also
still populate the way that we want to
send so we can call a function and send
a value at the same time in remix it has
a little drop down here way gu finny and
ether we're going to ignore finny for
now but of course we have our whey gay
and ether again where one ether is worth
this much gay and this much
whey so right now our contract is pretty
minimal right we're requir iring the
message. value is greater than one whole
ether but we want to actually require
that it's less than some value like
let's say we want to have users spend a
minimum of $5 as opposed to one whole
ethereum so let's first specify that $5
we can do that at the top of our
contract we'll say U 256 minimum USD
equals 5 and we'll make this public
instead of internal we'll update this
minimum USD in the future to make this
more gas efficient so what we want to do
is we want to require that our fun
function requires that the message.
value is greater than let's say greater
than or equal to minimum USD however
minimum USD is in terms of USD or
dollars and message. value is in terms
of eth or way in terms of ethereum so
how do we convert the amount of ethereum
to its price in dollar this is where
oracles and chain link comes into play
the dollar price of an asset like
ethereum is something that we've
assigned to ethereum outside of the
blockchain in the real world so in order
to get this abstract concept of the
price of the Native cryptocurrency of
the blockchain working with so we need
to use a decentralized Oracle Network or
something called an oracle to get this
price so before we keep going let's
learn a little bit more about
decentralized oracles chain link and how
they work so that we can understand how
to get the price of ethereum into our
smart contracts as we've talked about
blockchains are deterministic systems
which means that they themselves can't
actually interact with real world data
and events they don't know what the
value of an ethereum is they don't know
what random numbers are they don't know
if it's sunny outside they don't know
the temperature they don't know who's
President they don't know any of this
information these blockchains also can't
do any external computation maybe you
have some amazing artificial
intelligence model that you want to
integrate with a smart contract smart
contracts by themselves can't do
anything with that as we've mentioned
this is because blockchains are
deterministic by Design This is so that
all the nodes can reach consensus if you
start adding variable data or random
data or values that return from an API
call different nodes could get different
results and they would never be able to
reach a consensus this is known as the
smart contract connectivity problem or
the Oracle problem and this is bad news
because we want our smart contracts to
be able to replace traditional
agreements and traditional agreements
need data and they need to interact with
the real world this is where chain link
and blockchain oracles come into place a
blockchain Oracle is going to be any
device that interacts with the offchain
world to provide external data or
computation to Smart contract
however the whole story doesn't even end
there if we use a centralized Oracle we
are reintroducing a point of failure
we've done all this work to make our
logic layer decentralized but if we get
our data through a centralized node or
through a centralized API or we decide
we want to make the API call ourselves
we are reintroducing these trust
assumptions that we've worked so hard to
get rid of we're essentially ruining the
entire purpose of building a smart
contract so we don't want to get our
data or do external computation through
centralized nodes those are bad news
chain link is the solution here chain
link is a decentralized Oracle Network
for bringing data and external
computation into our smart contracts as
we mentioned before this gives rise to
these hybrid smart contracts which
combine onchain and offchain to make
incredibly featur powerful applications
chain link is a modular decentralized
oracal Network that can be customized to
deliver any data or do any external
computation that you like so for example
a lot of people say oh I can just make
an https call to some
API and we'll be good to go the
blockchain nodes can't make these https
calls because they wouldn't be able to
reach consensus if they called the node
at different times or they did something
else all the consensus would be broken
so instead we need a decentralized
network of chain L oracles to do this
and then in transaction this network of
nodes will return the data to our smart
contracts for us now chain link networks
can be completely customized to bring
any data or any external computation
that you want however doing the
customization can be a little bit extra
work there are a ton of chain link
features that come out of the box
completely decentralized ready to Plug
and Play into your smart contract
applications what are those features the
first one is going to be chain link data
feeds and that's the one we're actually
going to be using for our application
here chain link data feeds currently at
the time of recording are powering over
$50 billion in the defi world the way
they work is a a network of train link
nodes gets data from different exchanges
and data providers and brings that data
through a network of decentralized chain
link nodes the chain link nodes use a
median to figure out what the actual
price of the asset is and then deliver
that in a single transaction to what's
called a reference contract a price feed
contract or a data contract on chain
that other smart contracts can use and
then those smart contracts use that that
pricing information to power their defi
application we can see an example we see
an example at data. chain.
link and you can change networks you can
change price feeds you can change whole
bunch of information to see some of the
most popular price feeds let's look at
ethusd for
example on ethusd we can see this whole
network of independent chain link node
operators that are each getting
different answers for the price of vusd
they're getting aggregated by the
network and then delivered on chain we
can see how often they're updated these
ones are updated for 05 deviation
threshold or a few hour heartbeat which
everyone hits first we can see when the
last update was we can see the number of
Oracle responses
Etc we can see the contract address
directly on
chain we can even look at the contract
on ether
scan we can see some of the history we
can see all the responses of the
different
Oracles and then at the bottom we can
see the different users and sponsors
keeping this network
up similar to transaction gas whenever a
node operator delivers data to a Smart
contract the chain link node operators
are paid a little bit of Oracle gas in
the chain link token right now these
users of the protocol are sponsoring
keeping these feeds up and are paying
the Oracle gas associated with
delivering this data on chain here's an
illustration of what the current model
of these data feeds look like a network
of these chain like nodes each reaches
out and gets the information about an
asset and then signs the data with their
own private key in a single transaction
then one node will deliver all the data
with all the different signatures to a
reference contract if that node doesn't
deliver the data another node will send
it instead reputation is incredibly
important when you're a chain link node
operator if you miss data updates if you
forget to send transactions you'll
probably be quickly kicked off these
networks and have no chance of making
any more money in the future these data
feeds are used by some of the largest
protocols in the space such as
synthetics Sushi swap compound and a
with several billion dollars each we can
take a look at an example over at docs.
chain. link work with evm contracts
we're going to hit evm chains scroll
down to data
feeds we'll scroll down to the solidity
section and we can see an example of an
entire contract that uses and reads from
one of these tring price
feeds we can even open this up in remix
and work with it in remix it looks like
this example is reading from a price
feed on coven the reason we're actually
going to use a test net to see this work
is that there's a set of chain link
nodes monitoring the test Network to to
show you exactly how this works out once
we get deeper into the course we'll show
you how to actually run tests and work
with Chain Lake nodes without actually
being on a test net which will make your
development much faster but I highly
recommend walking through this section
along with me so that you can see
firsthand how this actually works so
let's go ahead faucets. chain. linken
we're going to switch to the coven
Network and we're going to get some Coen
eth but remember look at the network
flag and use whatever network is in the
documentation so to get some Coen we're
going to come to the faucet we're going
to turn off test link we'll just stay
with eth I'm not a robot
and then send request once our Coen
ethereum has reached our wallet we can
go ahead and close and we can take a
look in our wallet and see that we do
indeed have 0.1 eth on koven now let's
go back to our remix we'll compile this
contract we go and deploy this on
injected web 3 and again the reason
we're going to use injected web 3
instead of JavaScript VM is that there's
no network of chain link nodes watching
our little fake JavaScript VM there are
network of Chain Lake nodes watching the
test St so we'll scroll down we'll
switch contract to the price consumer V3
and we'll hit deploy mamas will pop up
and after a brief delay we can see our
price feed consumer down here and we can
hit get the latest price which shows us
the latest price of ethereum in terms of
USD you may be wondering why the number
looks so weird that seems like a really
large number for the price of ethereum
in terms of USD and this is because
decimals don't actually work so well in
solidity and we'll get to that in a
little bit there's a decimals flag
associated with this price feed address
that tells us how many decimals to
include with this price it's also in the
documentation however I know that this
one has eight decimals so this is saying
the value of ethereum right now is
[Music]
$3,262 it may of course be different
when you go go ahead and try this now
there's a number of things that happen
in this contract that I'll explain in
our fundme example but if you want to
take a look now and see if you can
figure out what's going on I recommend
you do so price feeds are one of the
most powerful out of the-box
decentralized features you can use in
your smart contract to level them up
especially for decentralized finance if
you're looking for different addresses
of different price feeds you can check
the contract addresses section of the
documentation choose the network that
you
want and then scroll down and then look
some of the different addresses of the
different price feeds for example this
address will give you the price of 1 in
token in terms of ethereum this address
will give you the price of the Apple
stock in terms of USD and so on and so
forth the next decentralized application
right at the box is going to be chain
link vrf or chain link verifiable
Randomness function once we do our
Lottery example a little bit later we'll
talk about how Randomness can be
manipulated in blockchain blockchains
are deterministic system which by
definition means that they can't have
Randomness if you can determine what a
random number is it's not really random
anymore is it so we need a way to get a
provably random number by looking
outside of the blockchain and oracles
are perfectly positioned to do exactly
that chain link verifiable Randomness
function is a way to get provably a
random number into our smart contract to
guarantee fairness and guarantee
randomness of applications many
protocols like pull together axi
Infinity ether cards avag gois and more
chain link vrf for lotteries randomizing
nfts for gaming and for more we're going
to do an example of chain link vrf in a
later section once we get to the lottery
section if you want to see if you can
play with the randomness yourself right
now I recommend you're going to docs.
chain. link evm chains and scroll down
to get a random number and this will
teach you how to get a provably random
number into your applications the next
decentralized out ofth the box feature
of chain link is chain link Keepers
which is decentralized event driven
execution as you've seen in order to
kick off some type of transaction
somebody needs to spend the gas and
somebody needs to sit down and hit the
go button or hit the transact button or
hit the send button this is obviously a
centralized Vector if you have a
decentralized application that needs to
run at specific times or after specific
events are triggered chain link keepers
are the solution to this chain link
keepers are chain link nodes that listen
to a registration contract for different
events that you specify to fire maybe
you say every 10 minutes you want to do
something or once a week do something or
if the price of some asset hits some
number or maybe a liquidity pool is at a
certain level whatever event that you
want to code you absolutely can the
chain link nodes constantly listen for
these triggers to happen and check the
different contracts for these triggers
once a trigger returns true the chain
link nodes will then perform whatever
action that you tell the chain link
nodes to do we're also not going to go
over the chain link Keepers examples
right now because we're going to get to
them in a later module however if you
want to try them out go to docs. chain.
linkum going and go to making compatible
contracts and feel free to read the
documentation and try it out yourself
the last outof the-box feature of chain
link is the most customizable but also
the hardest to get correct end to end
reliability is the ultimate promise of
our smart contracts and we want and need
them to be able to do anything we want
to be able to take any input and get any
output chain link functions is the last
decentralized out of thebox tool and it
allows you to make any API call in a
decentralized context through a network
of chain link nodes we're not going to
be going over that at all in this video
but be sure to check out the
documentation if that's something that
you're interested in to me chain link
functions is going to be the future of
Defi and smart contracts and if you're
looking to make something novel and if
you're looking to make something that's
never been done before I 100% recommend
you check out chain link functions later
on after this course or whatever you
want to do as of filming it came out
about a month or two ago and people are
just beginning to build amazing things
with training functions so be sure to
check this out after or during the
course we're going to be using the chain
link Automation in a later section in
this course again if you want to try
these out in remix on a real test net
you can go to the documentation and play
with them
here now I know we haven't actually
written that much code but we've gone
over a ton so I want to do a quick
review in order for a function to
receive native blockchain token like
ethereum you need to mark that function
as payable if you want to force a
transaction to do something and you want
it to fail if that wasn't done you can
use a require statement a transaction
that reverts means it undoes any work
that it did previously and returns any
gas to the user to get the value sent
with a transaction you can use the
solidity Global message. Val chain link
is a technology for getting external
data and computation into our smart
contracts and most importantly getting
that data in a decentralized context in
this example we're going to be using a
chain link data feed or a chain link
price feed which is a decentralized way
to get pricing information from Real
World assets into our smart
contracts now in order for for us to
figure out if the amount of ethereum
sent with a transaction is greater than
or equal to our minimum USD of $5 we
need to convert the amount of ethereum
into its value of dollars so how are we
going to do that well the first thing
that we're going to need to do is we're
going to need to get the price of
ethereum or Avalanche or polygon or
whatever native blockchain token that
we're working with so let's create a
function to do that we'll create a
function get price and this function is
just going to get the price of ethereum
in terms of USD and then we're also
going to create a function called get
conversion rate rate which is going to
convert a value to its converted value
based off of the price for now we're
going to make them both public functions
so we can play with them test them and
do whatever we want with them to get the
price of ethereum we're going to use a
chain link data feed and we go through
the documentation to get that
information so in the documentation I'm
going to scroll down using data feeds
they've got an example here right and
solidity and if you wanted to like I
said you could easily open this up in
remix now you can see this example in
the documentation what's actually going
on working with a chain link price feed
there's a contract out there add an
address and we're going to call this
latest round data function on that
contract gives us a whole bunch of data
but we really only care about the price
so we're going to want to do the same
thing we want to reach out to that
contract that's currently storing and
having the price updated so since we
want to reach out to and work with the
contract we're going to need two things
right what are those two things well we
need the address and we need the AI the
address of the contract is going to be
really easy we can get the address by
going to the chain link documentation
and let's go to this price feed
addresses section
we'll scroll down we want to be on
ethereum okay great let's look for seia
looks like it's way down here and all
right awesome e2d great there's an e2d
price feed so now that we have the
address how do we get the ABI well
before with simple storage we imported
the entire contract from the top and we
compiled and we got the API like that we
could do that here but that's kind of a
lot of code and we don't actually care
about what the whole contract looks like
we only really want to know what the
functions are so we can call that latest
round data function remember if we're on
remix and we go down to the compilation
details the ABI is really just this list
of functions that we can call on a
contract the ABI itself doesn't actually
need to include any of the logic it just
needs to say hey these are the functions
you can interact with and here are their
inputs and here's whether or not they're
payable and here's whether or not their
view functions Etc like I said though
this kind of is a white lie you can also
use a function selector or some other
ways but we're just going to ignore that
for now how can we get the ABI there's a
concept in solidity known as the
interface if we go to the chain link
GitHub we go to smart contract kit /
chainlink we can see a lot of different
contracts in the chain link repository
we go to contracts SRC this might look a
little bit different based off of when
you're looking at it
v0.8 interfaces and we go to aggregator
V3 interface if we scroll down we can
actually see a whole bunch of function
declarations but none of them are
actually implemented it's just function
the name of the function some stuff
external view blah blah blah but then
just the semicolon and nothing inside of
them this is what's known as an
interface if you compile this this will
actually give us that ABI because it
defines all the different functions that
you can call on a contract it just
doesn't have any of the logic again we
don't really even need to know what the
functions do we just need to know how to
interact with the contract and if a
contract is deployed it'll have that
logic in its deployment so what we can
do is we can copy this whole thing
scroll all the way to the bottom hit the
copy button and paste it in our remix
now hold on though if you're following
along you don't have to copy paste it in
with me cuz I'm going to teach you
something in just a minute that makes
this a little bit easier this pasted
code alert comes up we're running
solidity code so this is going to be
okay since we're only working on test
Nets here we're going to be okay that we
don't have to worry about p a code alert
if you want to take a second to read it
please do but we're going to paste this
code in here just like we did before
with simple storage for now you don't
have to follow along I'm about to show
you an easier way just follow along and
watch now that we have this interface
aggregator V3 interface we can use this
interface to make API calls because now
we have the address and we have the API
and we can even compile this and it'll
compile fine so we can say aggregator V3
interface at address this and the
combination of these two give us
whatever code is at this address with
all the functions from the aggregator V3
interface and just to test this out we
can do something simple like dot version
since if we scroll up looks like there
is indeed a version function put a
little semicolon at the end so let's
actually go ahead and actually copy this
line give it its own function called get
version this we'll have this public view
Returns what is the version up here
return a un 256 return a un 256 paste
that line in here aggregator V3
interface at its address version we'll
say return all of that now I'm going to
go ahead and deploy this to the seoa
test net just to show you what this
would actually look like however I'm
going to recommend you don't do that for
now just know that this will work this
way you won't have to wait forever for
your transactions to go through on the
test net so to do this I'm going to go
ahead scroll to the top go to injected
metamask change the contract from
aggregator V3 interface to fundme going
to go ahead and hit deploy my metamask
is going to pop up I'm going to go ahead
and hit confirm and we're going to
scroll down and now we have a big blue
button called get version which I'm
going to go ahead and click and we can
see we get a four return because at this
contract address on the blockchain it
has the functionality for get version
returning 4 and for the rest of this
lesson I'm going to be showing you guys
and testing this on an actual test net
however I recommend that you don't test
all of these as I along just watch me do
them because again waiting for
transactions on a test net can be really
annoying sometimes a test net might be
having issues because again it's people
running them out of the goodness of
their heart so for this lesson just
follow along write the code with me and
then maybe at the end deploy everything
so this is a really easy way and a
common way that people use to interact
with other contracts outside of their
projects they get the interface of that
contract using the interface keyword
they compile it and the compiler
actually gives us an API and then you
just wrap an address around with that
interface keyword and you can call any
function at that address and and this is
one of these things as we work with more
and more it'll start to make more sense
in the beginning it might be a little
hard to grasp but just bear with me for
now the more we do it the better you'll
get don't get discouraged take a deep
breath and exhale and let's keep
coding and if this is confusing to you
this is again where we can work with our
AI friends or any of the forums that
we're working with again very soon I'm
about to show you how to ask really good
questions and make really good prompts
but one we could ask here is hey I'm
confused how does this solidity function
return the value four when I didn't
Define any logic in aggregator V3
interface and I just posted that code
from get version here because a common
issue that I see new developers run into
is they go oh wait wait how does this
version return four my aggregator V3
interface doesn't have any code in it
why why does putting an address in here
make it work like what's going going on
and let's see if our AI is able to help
us here so this is chat gbt version 3.5
again I prefer version 4 but this is the
cheaper one and it says in the code you
provided the get version function is
calling the version function of an
instance of the aggregator V3 interface
contract it appears that the contract
address here is being used to create an
instance of aggregator V3 interface the
aggregator V3 interface is an interface
contract that defines a set of functions
that must be implemented by another
contract it serves as a way to interact
with the contract at the given address
by providing a common interface the
version function being called in your
code is likely defined in the actual
contract that implements this uh and
this is pretty much correct right and so
it gives us some more context here this
is exactly correct this address has a
version function and US surrounding it
with this aggregative E3 interface like
typ casting it in these parentheses like
this is just telling our solidity
compiler hey there's a version function
at this address or there's a latest
round data function or all the functions
all the functions in this aggregator V3
interface are at this address if this
address doesn't have a version function
this would just break and this is a good
example of again where we can actually
follow up with these AIS they're
typically very good at keeping context
so we could even ask what would happen
if that contract address didn't have
that
function and we see if the
implementation contract at the given
address does not have a version function
or if it has a different function
signature calling version on the
contract would result in a compilation
error or a runtime error so it wouldn't
result on a compilation error but the
transaction would revert so so this is
pretty helpful here but again we always
want to double check this so this is
where we'd probably go back to the
discussions forum and follow up
there so now that we actually have the
interface we can start calling these
functions and calling these addresses
however having a ton of these interfaces
is really going to clog up our contracts
and clog up our files and be really
gross to work with is there a better way
for us to do this well when we worked
with simple storage yes there was we
just went ahead and used Imports right
but that's when we had all the code in
our locally in our directory we don't
have all the code locally we didn't
create the aggregator V3 interface we
didn't create the price feed contracts
so can we do something like import
simple storage. but with a contract
outside of our project well again we
could copy paste it to its own file and
import add k T V3 aggregator V3
interface. so and of course we're going
to use this named import syntax because
we're awesome developers we could copy
paste it like this and do exactly what
we did before we could create a new file
called aggregator V3 interface paste the
code in there or we could actually
import directly from GitHub if we go
back to the documentation associated
with using data feeds we scroll down to
using data feeds here scroll down we see
at the top they do this import like this
import at chainlink contracts as C blah
blah blah this import actually has the
same setup as as the path of what's in
the GitHub repository so instead of us
copy pasting from GitHub we can actually
import directly from GitHub or mpm we
can copy this line back in our remix we
could paste it in like this remix is
smart enough to know that this at
chainlink contracts is referring to the
what's known as an mpm package chainlink
contracts chainlink contracts is what's
known as a package manager and it keeps
different versions of combinations of
code for us to download at chainlink
contracts is created directly from chain
link repository remix downloads all this
code from mpm which is Created from the
GitHub so it essentially downloads it
from the GitHub so us doing this import
like this is the same as is just copy
pasting the entire interface at the top
of our contract now we have this
aggregator V3 interface that we want to
work with we can go ahead and compile
and bada bing bada
boom so great so now that we have the
interface here which will give a
minimalistic ABI for us to interact with
the contract how do we actually get the
pricing information well again if we go
back to the docs we can see right here
gives us an example of the code we can
use to get the latest price but let's
write it ourselves just so that we know
what's going on we'll say agregator V3
interface and we'll actually create a
new variable called price feed equals
aggregator V3 interface contract at this
address which again only works for
sapoia now we can call this latest round
data function on the price feed so we'll
say price feed. late round data and if
we look at the interface on GitHub we
can actually see latest round data
doesn't just return one variable it
returns a whole bunch of different types
of variables and to return multiple
types we do some syntax that looks like
this and we'll say uint 80 round ID and
you can even flip back and forth between
the documentation make sure you have it
right int price which again we know in
int defaults to an INT 256 you uint 256
started app uint 256 Tim stamp and then
uint 80 answered in round there's a lot
of code in here since this function
returns so many variables we have to set
something up to capture them but we
don't care about any of these other
stuff we just care about price so what
we can do is actually just remove them
and leave the commas in there so we're
going to remove started at remove time
stamp remove answered and round and I
hit command s to compile we're going to
get these yellow squiggly lines which
are warnings but we're going to fix them
in a minute now we have in price equals
Price feed. latest round data because we
only care about getting the price from
the return the reason price is an into
56 is because some price feeds could be
negative now that we have the price this
price variable is going to be
representing the price of eth in terms
of USD and it's going to return a number
that looks like this because again slity
doesn't work with decimals so we know
that this price feed has eight decimals
but it'll get a return like this boom
like this it'll return a value that
looks like this
if we want to double check how many
decimals there are in a price feed it
actually has a decimals function which
allows you to check that as well now as
we know message. value is going to have
18 decimal places how do we know that
well because we know that one ether is
equal to this many way and this many way
has 18 zeros 1 2 3 4 5 6 7 8 9 10 1 2 3
4 5 6 7 8 so this massive number is
equal to 1 ethereum right 1. 1 2 3 4 5 6
7 8 9 10 1 2 3 4 5 6 7 eight so right
now message. value and price actually
have different decimal places price has
eight message. value is going to have 18
so to get them to match up we have to do
return price times 1 E10 or to add those
additional 10 decimal places and yes I
know we have a red line I'll fix this in
a minute price as we know is a in 256
and message. value is going to be a u
256 so the types are actually different
so we want to get the price and terms of
U 256 instead of in 256 to convert them
we can again do a thing called type
casting there are a lot of different
types that can be easely converted
between each other not all types can be
typ casted but an INT and a un 256 can
be so to make our price a u 256 we would
just do uint 256 and wrap price like
this or we could just wrap both of them
like this now of course since we're not
modifying any state but we are reading
storage we can make this a view function
and then we'll say it returns a uint 256
like so now if we compile we get rid of
all those errors and warnings now math
could be a little bit tricky in solidity
but the more you do it the better you'll
get and the reason math can be tricky is
because there aren't any decimal places
so you need to only work with whole
numbers the more you work with it the
better you'll get
though awesome so now we have a get
price function which is going to return
the value of ethereum in terms of USD as
a u 256 now all we we have to do is
convert our message. value in terms of
dollars using this get price function to
do that we're going to use our get
conversion rate function this get
conversion rate function is going to
take a u 256 eth amount as an input and
we're to convert this eth amount to its
value in dollars this will be a public
view function that will return a uint
256 so first we're going to get the
price of ethereum by doing U 256 e price
equals our get price function that we
just defined and then we're going to do
U 256 eth amount in USD equals eth price
time eth amount and then we actually
have to divide by 1 E18 the reason we
divide by 1 E18 is because both of these
have 18 decimal places and if we
multiply 1 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7
8 9 10 if we multiply these by each
other where both of these are
representing one we're actually going to
get a number that's absolutely massive
with 38 decimal places so we need to
divide by 188 to reduce it back down to
what it should actually be an important
rule with working with math and solidity
is you always want to multiply before
you divide the reason for this is since
again only whole numbers work in
solidity you were to do 1 iD two you
would end up getting zero so you always
want to multiply first when we get to
the foundary section of this course
testing all this math is going to be a
lot easier if you're really struggling
with some of the math bits right now I
wouldn't let that slow you down because
one of the things that AI is really good
at is doing a lot of these math
conversions but in any case this eth
amount in USD is the number that we're
looking for so we can say return e them
out in USD and awesome now we have a get
conversion rate function let's walk
through this together just so that you
can understand what's actually going on
let's say we want to see how much one
eth is worth well we're going to get the
eth price which let's say it's $2,000
but it's going to be $2,000 with one2 3
4 5 6 7 8 1 2 3 4 5 6 7 8 9 10 18 zeros
so e might look something like this so
that means we're going to do this 2,000
with 18 decimal places times 1 E which
is going to be 1 1 2 3 4 5 6 7 8 1 2 3 4
5 6 7 8 8 9 10 we're going to multiply
those together and then since we're
going to get an additional 36 zeros then
we just divide by 1 E18 and that's how
we would get
$2,000 equals 1 E it's going to be 2,000
of course with 18 decimal places one of
the good reasons for using whole numbers
in solidity is that it's not possible to
have decimal places so we don't lose any
Precision which is really good so
normally we should test this function
before continuing but since we're doing
all this on a test that and I promise
you that I tested this all beforehand
we're just going to go ahead and keep
going so now that we've done all this
work if we want to make sure that our
users are sending at least $5 we can do
get conversion rate of message. sender
needs to be greater than minimum USD
because get conversion rate takes an eth
amount as input uses the price pricing
information to get the dollar value back
and we're going to check to see that the
dollar value of the message. value is
greater than the minimum USD however
since get conversion rate returns a
value with 18 decimal places we need to
update our minimum USD to say 5 * 10
raised to the 18th or we could also do 5
E18 or we do 5 * 1
E18 I personally like this 5e8 syntax
but whatever works for you I'm going to
deploy this to a test net just to
demonstrate this working but again you
do not have to so we're going to go
ahead delete our previous deployments
injected web 3 deploy metam Mass pops up
going to go ahead and confirm after a
long delay we'll get our deployed
contract here we have all this stuff we
can call get price and we can see the
value of ethereum right now is this with
18 decimal places which is awesome so
it's around
$1,896 so if I were to try to fund this
with maybe 100 way I know for a fact
that way isn't going to be enough so if
we call this fun function we're actually
going to get this gas estimation failed
gas estimation error failed with the
following message blah blah blah error
execution reverted didn't send enough
eth which is actually exactly the error
message that we have here it's exactly
what our error message is here in our
require didn't send enough eth so if we
try to fund it we're going to get didn't
send enough eth and this gas estimation
failed is a pretty common error that
you'll see in remix and solidity and evm
in general it's kind of just the boiler
plane answer for something went wrong
luckily we got the actual error message
here so we could debug here's what's
actually going on now you see here we
could still send this transaction like I
said we would actually spend gas to send
a failed transaction and this isn't
something that we want to do so we're
going to go ahead and cancel however if
we did send maybe 1 1 2 3 4 5 6 7 8 1 2
3 4 5 6 7 8 9 so if we go to Google
actually we can even see like an e to
dollar conversion rate so if we sent
0.01 0.01 eth right now is worth $8
dollar it might be different depending
on when you actually do it so we send
0.01 e in our remix and we can do that
by doing 1 1 2 3 4 5 6 7 8 9 10 1 2 3 4
5 6 so it's 1 e16 and we hit fund now we
actually see metam Mass pops up we don't
get that gas estimation error we can go
ahead and confirm and we can see that
our function is working as expected
which is great it's reverting
transactions that have less than $5 and
it's letting transactions go through
that have at least $5 awesome and if we
select minimum USD we can obviously see
that here and we can see we have 0.01
eth here fantastic and since we don't
have a withdrawal function here we
actually can't pull it out which is
another reason why I say hey maybe don't
test this right now but great we've
confirmed our get conversion rate is
working so let's move on
fantastic so what's the next thing that
we should do in this contract well we
probably want to keep track of the users
who send us money in this contract so we
can keep an array of addresses called
funders and keep updating that depending
on who actually sends US money so up at
the top we'll make an address array or
an address list we'll make it public and
we'll call it funders and anytime
somebody sends US money we'll say
funders do push message. sender like
message. Val message. sender is another
Global variable we can use in solidity
which refers to whoever called this
function the sender of the transaction
to this contract so if we're on sapoia
and we initialize a transaction for a
metamask the message. sender is going to
be this account right here and then
maybe we want to even make a mapping of
addresses to to make it easier to look
up how much money each funer has sent so
we'll make a mapping of an address to a
u into 256 we'll call it public address
to amount funded now something that's
newer in solidity is you can actually
name the types in your mapping so you
could say address fun mapped to un 56
amount funded usually this is what's
known as a little syntactic sugar it's
just to make it easier to read what this
mapping is Right fun to amount funded
and then our variable name is very
explicit address to amount funded now if
somebody funds our contract we'll of
course do address to amount funded the
message. senders address plus equals
whatever they previously have funded
Plus message. value whatever they're
additionally adding all right great and
now we have a way for us to keep track
of funders sending money to our contract
and have an easy way with a mapping to
look up how much they've spent in
total now I know we've gone over a lot
of advanced solidity here so let's do a
quick refresher of what we've learned so
far whenever we interact with a contract
we always need the address and the ABI
compiling an interface allows us to get
that ABI very easily for us to interact
with another contract when we combine
the contract address with the interface
we can easily call the functions on that
contract chain link price feeds are an
easy way to get data especially pricing
data from The Real World into our smart
contracts when working with math in
solidity and the evm in general decimals
don't work so we need to always make
sure we're using the correct number of
units whenever we interact with our
contracts message. value and message.
sender are known as globally available
units in solidity and they refer to the
send a of a message of the current call
or the number of way sent with a message
or transaction there's a whole bunch of
these and you can view them all in the
solidity
documentation all right great so we've
got a way to actually get this pricing
information pretty easily however our
code is getting a little bit cluttered
with these get price and G conversion
rate you'd think that these are
functions that would be reused pretty
often anyways for anybody looking to
work with chain link price feeds so is
there an easier way for us to work with
this pricing information maybe doing
some math like this is pretty common and
we'd want other contracts to be able to
import this conversion functionality and
a way that we can do that is actually
creating something called a library
there's a site out there called solidity
by example which has great examples of
using libraries and what they work with
libraries are similar to contracts but
you can't declare any state variables
and you can't send ether a library is
embedded into the contract if all
Library functions are internal otherwise
the library must be deployed and then
linked before the contract is deployed
that's a little bit confusing don't
worry too much about that right now
using libraries can actually add
functionality to different values and
what do I mean by that well I mean we
can have our get conversion rate
function be a function of any value of
type you 256 means we could take this
get conversion rate and do something
like message. value. getet conversion
rate so we can create our own custom
function with any type we could work
with get conversion rate as if message.
Val was a class or an object or a
contract that we actually created to do
this let's go back to our files create a
new one create a new one called price
converter
soul and this is going to be a library a
price converter Library so how do we
create a library and what is a library
well a library is going to be very
similar to a contract we're going to
start of course with spdx license
identifier we're going to do pragma
solidity and we'll give it a version of
0.818 the little carrot and instead of
typing contract we're actually going to
type library for the name of the library
and we're going to call this Library
price converter so libraries can't have
any state variabl and all the functions
have to be marked internal so what we're
going to do is we're going to go back to
fundme doso zoom out a little bit we're
going to grab get price get conversion
rate and get version delete them well I
hit copy first go back to price
converter paste them in here and work
with them in here of course we're going
to need the aggregator V3 interface so
we're going to go back to our funme
we're going to copy this named import
from aggregator V3 interface paste it in
at the top here hit command s and we're
going to go ahead and compile this
successfully fundme is no longer going
to compile but we're going to fix that
in a little bit now the first thing that
we're going to need to do in here is
make these all internal so we're going
to say internal like this we do internal
get conversion rate and internal get
version now that we have our price
converter Library we can actually import
it back in our fundme and attach it to a
un 256 and let's actually delete this
aggregator V3 interface line for now and
we'll do import price converter
fromprice converter do soul and now to
attach the functions in our price
converter library to All U 256s we'll
say using price converter or uint
256 of course if we compile our fundme
we're going to get an issue because it
doesn't really know what get conversion
rate is so for now let's actually just
comment out this line I'm going to
remove these comments up here as well so
what we can do now though is we can do
message. value. getet conversion rate
get conversion rate and in your library
whenever you're working with a library
the first input variable for a library
is going to be the type that you're
using with the library so message. value
is of type un 256 so this gets passed
inside of get conversion rate as the
first variable into U 256 e amount even
though we don't pass any variables
inside of these parentheses here for get
price and get version we don't really
care to have an input parameter at all
so it'll pass it in but not do anything
so now instead of require get conversion
rate of message value we can actually do
let's uncomment this line now and let's
delete this line we can actually do
message. value. getet conversion rate
conversion rate and now if we compile
this this is going to compile
successfully this works because we're
attaching the price converter library to
all un 256s so now all un 256s have
access to this get conversion rate
function and since message. Val is a un
six it can call. get conversion rate and
it'll pass itself so that message. value
as the first input parameter to the
function here if we wanted another
variable in here like U into 6 something
else that would be the first parameter
inside these parentheses so maybe like 1
2 3 or something right this one 2 3
would be the something else but message.
value would still be the initial
parameter which in this example would be
eth amount so let's go ahead and undo
that and undo that but all right great
we've moved a lot of the math into our
own Library congratulations nice
work one of the most common libraries
that was used for a long time was this
Library called safemath dossou and in
your solidity Journeys you'll probably
see it pop up from time to time now
we're going to go off on a little bit of
a tangent here about safe math and the
library safe math and this is an excerpt
from my course last year so you might
see stuff like rink B and some other
stuff but just focus on the safe math
stuff just know when we refer to the
JavaScript virtual machine that's
talking about the remix virtual
machine one of the most common libraries
that was used for the longest time was
this Library called safemath dossou and
you'll probably see it a lot of
different places we're going to go off
on a quick little tangent here and teach
you about safe math so let's close
fundme and close price converter and
let's create a new file called safe math
tester. soul and let's start with some
basic stuff in here safe math was all
over over the place before version 0.8
of solidity and now it's almost in no
contracts what happened why is safe
maath no longer used as much well let's
create a sample contract this is a
section that you don't have to follow
along if you don't want to code along
with me but if you want to you
absolutely still can this is going to be
a contract we are going to deploy on a
JavaScript virtual machine uh we can use
any version of solidity before version
0.8 of solidity so for example we'll use
pragma carot 0.6 6.0 and we'll create
contract safe math tester. Soul now if I
create a un 8 I set it to
public big number and I set this to
255 oops safe math tester let's go ahead
and compile safe math tester with
0.67 fragma solidity the maximum size of
a u 8 is going to be 255 this is going
to be the biggest number that we can fit
in an U 8 and if I were to deploy this
to a JavaScript VM or even a test
Network save math tester let's go ahead
and deploy
it if I hit big number we're going to
get
255 well what happens if I create a
function called add that sets big number
equal to big number + one let's save
that delete that old contract and deploy
right now big number is 255 what happens
when we add one to big number when 255
is the max size a uint 8 can be well
let's hit add now let's check what big
number is big number gets reset to zero
so what's going on well prior to version
0.8 of solidity unside integers and
integers ran on this concept of being
unchecked which means that if you passed
the upper limit of a number it would
just just wrap around and start back
from the lowest number it could be so if
I call add a whole bunch more times and
hit big number now it's eight if I were
to hit this add button a ton more times
and get it back to 255 it would then
continue to wrap over to zero so one of
the most popular libraries that was out
there was this safe math Library which
would basically check to make sure that
you weren't wrapping around a un 256 or
an in 256 basically it was a way to say
hey you've reached the max this number
can be and now your transaction is going
to fail if we switch this to 0.8 of
solidity delete the old contract go
switch this to
0.8 we'll go ahead and compile it and
now we deploy this to JavaScript
VM if I hit big number we get 255 but if
we hit add it actually fails and we
still get 255 in version 0.8 of solidity
they added this bit where it
automatically checks to make sure if
you're going to do what's called
overflow or underflow on a variable we
can actually revert back to the
unchecked version by using an unchecked
keyword so if we wrap this big number
equals big number + one in this
unchecked bracket let's delete our old
contract we'll compile we'll
redeploy we hit big numbers 255 now we
hit add we hit big number again it
reverted back to zero so that's a little
bit more about safe math checked and
unchecked so version 0.76 and below this
code that you see in front of you is
going to be the exact same as this code
in 0.8 and above with this unchecked
keyword now you might be thinking in
newer versions of solidity why would I
use this unchecked keyword well you'll
find out later that this unchecked
keyword makes your code a little bit
more gas effici so if you're absolutely
positive that your math is never going
to reach the top or bottom limits of a
number then might make sense for you to
use the unchecked keyword let's head
back over to our fundme contract where
we are now using the price converter
library that we just
created awesome we have a lot of the
basics of the math that we need in our
fundme contract it's all right so this
is great people can actually send us
money and we're going to keep track of
them as well which is fantastic so the
next thing obviously that we're going to
want to do is we're going to want to be
able to withdraw that money out so now
let's go ahead and Implement our
withdraw function when we withdraw all
the money we're probably going to want
to reset all the mappings back down to
zero to show that hey we've withdrawn
all the money and there's nobody left to
do this we're going to use something
called a for Loop a for Loop is a way to
Loop through a list of something or to
do something in a repeated amount of
time if you're familiar with other
programming languages it's the exact
same concept we wanted to get all the
elements in this list for example which
where one is at the zeroth index two is
at the first index three is at the
second index and four is at the the
third index which I know is a little bit
confusing these are the different these
are the indexes these are the elements
we would Loop 0 through three to get all
the elements out of this array to do
this loop we're going to use the four
keyword we're going to say four put some
parentheses and in a for Loop we can add
a couple things and by the way this is a
way to do comments inside of a line and
solidity you do a back slashstar star
back slash and now everything in here is
a common so in a for Loop you first need
to give it the starting index then you
give it the ending index and then you
can give it the step amount for example
let's say we want to start on the zeroth
index we want to go all the way up to
the 10th index and we want to go by up
each time we would do 0o 1 2 3 4 Etc
well let's say we want to start with the
third index we want to go to the 12th
index and we want to up by two every
single time well we would do three five
7 9 Etc so our starting index is going
to be a un 256 and we'll call it under
index and we're going to say we're going
to start with zero and we're going to
end once the funer index is less than
the funders length so I know I said up
here it's the ending index but instead
it's a Boolean once the funders index is
greater than fund. length which is how
you can get the length of an array then
we're going to end and then finally
we're going to say every single time we
do a loop we're going to say funders
index equals funders index + 1 now
there's a shortcut you can do to do some
variable equals itself + 1 and that's
just Plus+ this plus plus means every
time we go through the loop just add one
and we actually don't need that here and
then we put these curly braces to say
okay execute everything inside of this
Loop here for the duration that we
specified here and this final piece
means that every time we run through all
the code inside of these brackets we're
going to add one to this funders index
that's how we go from0 to 1 2 3 4 5 6 7
Etc to access the zero withth element of
our funders array we're going to say
funders of fun index and this is going
to return an address since it's an array
of addresses so we'll say address fun
equals funders of funer index and we
want to use this to reset our mapping
address to amount funded so we can say
address to amount funded at the funer
address is now equal to zero so we're
going to reset whatever we add added
when they funded us down to zero because
we're withdrawing all the money out and
additionally how there's a nice little
shorthand like plus plus down here up
here in the fund another nice little
shortcut whenever you want to add
something to whenever you want to add
something to something that already
exists instead of doing something equals
itself plus the new thing you can just
do plus equals this means that we're
going to set address to amount funded of
message. sender equal to itself Plus
plus message. Val so let's walk through
this for Loop a little bit we're going
to start with the zero withth index
we're going to get the fun at the zero
with index in our funer array we're
going to take that address stick it into
our mapping and reset the amount that
they've sent us to zero then we're going
to do funer Plus+ we're going to check
to see that funer plus funer index Plus+
is less than funders do length obviously
fun 0 + 1 is going to be one so we're
going to check if one is less than the
total amount of fun fers and then we're
going to get the address of the fun at
the first index reset them to zero get
the address at the second index reset
them to zero third index etc etc until
we finally reach the index that is equal
to or greater than the length so if we
have 10 funders and we reach funer index
10 the for Loop will exit and be
done but we still haven't done two
things we need to reset the array still
and then we also need to withdraw the
funds since we've accumulated all this
message. Val in the fund function to
reset the funders array we could do the
same thing we did with the mapping and
reset each single address at each index
or we could just create a brand new
funders array which is what we're going
to do so to reset the array we're now
going to say funders equals new address
array and to start off at a length of
zero previously we used the new keyword
to deploy a different contract now we're
using the new keyword to reset the
funders array to a brand new blank
address array this part is a little
confusing don't let it hold you back and
lat later in the course why we make the
choices here that we do so great we've
gone ahead and reset the array so now
how do we actually withdraw the funds
for this section I'm going to go ahead
and again refer to a previous course
that it did because the content is
exactly the same just remember
JavaScript VM is remix VM
so great we've gone ahead and reset the
array but how do we actually now
withdraw funds from this contract how do
we send the funds back to whomever is
calling this now to actually send ether
or send native blockchain currency there
are actually three different ways to do
this we're going to look at all three
and say what the differences between the
three of them are the three different
ways are going to be
transfer send and call let's go ahead
and start with transfer since transfer
is the simplest and at surface level
makes the most sense to use so if we
want to transfer the funds to whomever
is calling this withdraw function we
would do we would say message.
sender.
transfer and then we'd get the balance
of our contract here by saying
address this the this keyword word
refers to this whole contract. balance
and we can get the native blockchain
currency or the ethereum currency
balance of this address like this and we
can just do that only thing that we need
to do is we need to cast we need to typ
cast message. sender from an address
type to
a payable address type so message.
sender is of type
address whereas payable
message. sender is of type payable
address and in solidity in order to send
the native blockchain token like
ethereum you can only work with payable
addresses to do that so we just wrap it
in this payable typ Caster so this is
the first way that we actually send
ethereum or send tokens from different
contracts to each other we wrap the
address that we want to send it in in
this payable keyword we do transfer and
then we say EX exactly how much we want
to transfer but there are some issues
with transfer here we are on solidity by
example for sending ether which again is
a fantastic resource to refer to if you
get lost the method that we just looked
at was this transfer method now we saw
way earlier in the course that if I sent
ethereum from one address to another it
cost about 2100 gas or 2,100 gas our
transfer function is capped at 2300 gas
and if more gas is used it throws an
error the next one that we're using is
going to be send which is also capped at
2300 gas and if it fails it'll return a
Boolean so with transfer if this line
fails it'll error and revert the
transaction with send it won't error
it'll return a Boolean of whether or not
it was successful so using send will do
pay
message.
sender.
send address
this balance but we don't want to finish
our call Here If This Were to fail the
contract wouldn't revert the transaction
and we just wouldn't get our money sent
so we want to do Boolean send
success equals this whole bit here and
then we want to require send success and
if this send fails we'll throw an error
saying send
failed this way if this fails we will
still revert by adding our require
statement here transfer automatically
reverts if the transfer fails send will
only revert the transaction if we add
this required statement here so great
what's the third way that we can
actually send ethereum or native
currency well it's with this call
command Now call is going to be one of
the first lower level commands that we
actually use in our solidity code
because this call function is actually
incredibly powerful and we can use it to
call virtually any function in all of
ethereum without even having to have the
ABI we'll learn the advanced ways to use
this call much later for now we're just
going to learn how to use it to send
ethereum or your native blockchain
currency call is going to look very
similar to send we're going to do
payable
message.
sender. call and this is where we'll put
any function information or any
information about the function we want
to call on some other contract we
actually don't want to call a function
so we're going to leave this blank we
can show that we're leaving it blank by
just putting in these two quotes here we
instead want to use this like a
transaction and as we saw in our
deployment there's always this message.
value bit so we're going to use this
call function as if it's a regular
transaction and we can add stuff like
message. Val so in here we're going to
add these squiggly brackets and we're
going to say
value
address
this
balance this call function returns
actually two variables and when a
function returns two variables we can
show that by placing them into
parentheses on the left hand side the
two variables it returns are going to be
a Boolean that we're going to call call
success and also a byes object called
Data returned since call allows us to
actually call different functions if
that function returns some data or
Returns value we're going to save that
in the data returned variable it also
returns call success where if the
function was successfully called this
will be true if not this will be false
and since bytes objects are arrays data
returns needs to be in memory now for
our code here we're actually not calling
a function so we don't really care about
data returned so similar to what we saw
with the price contract we can just go
ahead and delete that and leave the
comma to tell solidity yeah we know this
function returns two variables but we
only care about one and then similar to
the send piece above we're going to do
require call success call failed meaning
that we're requiring call success is
true otherwise we'll revert with an
error that says call failed now if
learning the difference between these
three is a little complicated for you
right now don't let that slow you down
feel free to come back to this after
you've learn more about how some of
these lower level functions work and a
little bit more about how Gas Works
solidity by example does a fantastic job
though of saying what the differences
between all three are transfer has a
maximum of 2300 gas and throws an error
if it fails send has a maximum of 2300
gas returns a Boolean if it fails call
forwards all gas so doesn't have a
capped gas and similar to send returns a
Boolean if it is successful or if it
fails as of recording right now using
call is the recommended way to actually
send and receive ethereum or your
blockchain native token for now if this
part's a little bit confusing for you
for now now just look at this and see Ah
that's how we send and transfer ethereum
or native blockchain currency tokens and
I'm going to delete this part for the
video but but I'll keep those comments
in the code repository associated with
this
course all right great and actually the
exact same code from that video we're
going to use for this as well so we're
going to use this call call success to
work with sending a balance however
there's a bit of an issue here right now
anybody can call this withdraw function
and take all the money out of this
contract we don't want that we want
anyone to be able to fund the contract
but we don't want anyone to be able to
withdraw money from the contract we only
want the owner of the contract to be
able to withdraw so how do we set this
contract up so that the withdrawal
function can only be called by the owner
of this contract well we want to set
this contract up so that whenever we
deploy it whenever we create this
contract an owner gets assigned to this
contract we assign some address to being
the owner and then then we add some
parameters so that withdraw can only be
called by that address so what we could
do is we could set up some function
called call me WR away and when we
deploy this contract we would just
immediately call this call me RightWay
function which will set us up as the
owner however that would take two
transactions and remember we're
Engineers we want to work incredibly
hard to be incredibly lazy so instead
solidity has something called a
Constructor and if you're familiar with
other programming languages a
Constructor is the exact same as really
every other programming language and the
Constructor is a keyword and a special
function in solidity so we can create a
Constructor function without the
function keyword we just call it
structor and we also don't even need the
public keyword you'll see remix even
highlights it pink this is going to be
that function it's going to be a
function that is immediately called
whenever you deploy your contract this
function will be called in the exact
same transaction that is used to deploy
your contract for example if I were to
take this minimum USD added in our
Constructor and say minimum USD equals 2
this minimum USD would immediately get
updated to two right after this contract
is deployed in that exact same
transaction since we want this
withdrawal function to only to be able
to be called by the owner of this
contract in our Constructor we can set
up an address right away to be the owner
of this contract so let's create a
global variable called address public
owner and then right in our Constructor
we'll say owner equals message. sender
message. sender of course being the
sender of the caller which in this
example is going to be the deployer of
the contract don't worry we're going to
demo all of this very soon to show you
everything that's going on if you want
to test all this right now absolutely go
for it just remember it's going to take
you a little bit longer on a test net
and I'm going to show you how it all
works anyways now that we have our owner
set up we can actually modify our
withdraw function so that only the owner
can call this function easily enough
we're already familiar with the require
keyword we could add a require the
message. sender of whoever calls this
withdrawal function must be equal to and
this is how you do equals in solidity
with this double equal sign a single
equal is set a double equals means
equals so message. sender must equal the
owner and if it's not the owner we could
revert with something like must be owner
awesome so now we have a quick way to
require that whoever calls the
withdrawal function is indeed the owner
awesome
but let's say we have a lot of admin
functions or only owner functions or
functions that should only be called by
the owner would we have to put this line
on every single function remember we
want to work incredibly hard to be
incredibly lazy we don't want to have to
copy paste this line to every one of
these functions and this is where
something called modifiers come into
play so we're going to go ahead and
actually delete this line and at the
bottom we're going to create our first
modifier a modifier is going to allow us
to create a keyword that we can put
right in the function declaration to add
some functionality very quickly and
easily to any function to create a
modifier you use the modifier keyword
and then you set it up very similarly to
a function so our modifier is going to
be called only owner we don't give it a
visibility like functions and in here we
can put our code so again we'll say
require the message. sender is equal to
not set to is equal to the owner and if
it's not the owner we're going to say
sender is not owner like this and then
underneath we're going to put this
little underscore with a semicolon what
we can do is we can take this only owner
keyword and stick it in the function
Declaration of our withdraw and what's
going to happen now is it's going to
execute what's in this modifier first
it's going to execute this require and
then this little underscore says and
then add whatever ever else you want to
do in the function so we're going to
execute this require then whatever else
is in the function and for our withdraw
a function it's going to be everything
else in here in our modifier if we had
the underscore above the require this
means that we would execute the code
inside the function first and then the
require so the order of your underscore
matters so now with this modifier
keyword in the withdraw function
whenever you call the withdraw function
we first go up there's a modifier I got
a drop down here we'll execute this oh
here's an underscore time to go back to
the function let's do what else is in
the rest of the code and then it'll come
back down to the only owner modifier and
say oh is there anything else to do oh
there's nothing else so I guess we're
good so let's see this all go through
end to end and remember you don't
actually have to deploy this to a test
net if you don't want to but if you want
to follow along feel free to do so of
course as well get started let's of
course compile file fundme Doo looks
good let's delete any contracts deployed
previously let's make sure we're on
injected provider menam mask and let's
make sure that we are on a test net we
are indeed let's make sure we have a
little bit of test net eth in our wallet
and we sure do and let's go down to the
contract and make sure we're on the
right contract if you try to deploy some
like an interface you'll get an alert
like this this contract might be
abstract blah blah blah so we're not
going to do the interface we're going to
do the fundme contract of course we'll
hit deploy metamask will pop up we'll go
ahead and hit confirm on the metamask
and then we're going to have to wait a
little bit for the contract to actually
finish deploying if we pull up the
terminal we can see the contract go
through and we can also see it in remix
here now we've got a number of buttons
in here we've got our red fund button of
course which is because we have our fund
function which is payable and this
allows us to send eth with this function
we have our withdrawal function which is
just orange because it is not payable
although it is going to be withdrawing
money out of the contract and then we
have our typical blue View and pure
functions the owner of course is going
to be our metamask since we are the ones
who deployed this contract minimum USD
is going to be five and these are of
course going to be empty we can call our
fund function only if we send some value
with it if we try to call fund without
any value we're going to get this gas
estimation error failed and we'll even
see didn't send enough eth in the ER log
so let's go ahead and cancel this again
we could send this but that would be a
huge waste of gas so we'll cancel it and
let's get a value that's going to be
enough so I believe 0.01 eth should be
enough let's say 0.01 eth it looks like
that's about $18 so back in remix let's
do 0.01 e in terms of wayy which is this
value here paste that in
and we'll scroll down now if we call
fund it does indeed go through and we
can go ahead and hit confirm on this as
well and we see that transaction pop up
on ether scan and we might have to wait
a little bit for this transaction to
finish finish going through finish
indexing Etc so let's give it a couple
minutes oh looks like it's gone through
fantastic we can even see in the fundme
contract the balance has gone up to 0.01
and we can see if we look at funders at
index zero we can see our address and if
we copy our address and paste it into
the mapping address to amount funded we
do indeed see an amount in here with
this transaction fund being called of
course on The testnet Ether scan we can
see all the data and information
associated with this and we can even
scroll down and see the input data we
can see that this was calling the fund
function we'll learn more about the
input data later so now we could do is
we could do the reverse we could go
ahead and withdraw and that should reset
the mapping and the array back down to
zero for our modifier to work we have to
use withdraw on this account if we
switch to an account that isn't the
owner of this contract and we go ahead
and reconnect and we scroll down we make
sure value is zero and we scroll down
and try to hit withdraw we'll see we get
gas estimation failed and we'll even say
sender is not the owner so we'll go
ahead and cancel that we'll switch back
to account one we'll make sure we're
working with account one now we'll call
withdraw we'll see ass does indeed pop
up and we can go ahead and confirm and
in just a minute we'll see the balance
reset and if we call our funders and
mapping they should also have been reset
so let's wait a little bit now if I try
to call address to amount funded with
that same address we now get zero and
now if I look at funders at index zero
it actually airs and this isn't
correct following our more advanced Lo
Concepts if you don't understand them
the first time don't let them stop you
they're not required to know to continue
the following is an excerpt from a
slightly older edition of this course
you'll see that I don't use named
Imports like a noob and a few other
pieces of the code look slightly
different but this next section we're
going to go over a lot of really
Advanced solidity pieces here that are
going to really Advanced solidity
fundamentals these are going to be
fantastic for saving gas making your
code look a lot cleaner and just better
coding practices overall for those of
you who are looking to go super far with
this definitely be sure to pay attention
to this section because this will make
you look like a bad as when you code
later on just remember when we say
JavaScript VM we just mean remix VM
additionally whenever we deploy to the
rink B test net just know that you
should be deploying to theoa test net or
whatever the most upto-date test net is
or just don't deploy to the test net and
just follow
along we're going to modify this
contract to make it a little bit more
professional it's not going to be end to
end amazing but it's going to be a
little bit better and you'll see why in
a minute so the first thing that we're
going to do is we're looking we're going
to look at some of these variables here
in particular owner and minimum USD
owner gets set one time in our contract
here and then it never changes again
minimum USD gets set one time even
outside of the Constructor if we have
variables that only get set one time we
can actually use some tools and solidity
to make them more gas efficient for now
let's compile our fundme contract and
then deploy it to a jscript virtual
machine remember we can go ahead and
deploy it right now however ever funding
and withdrawing and doing any of the
money stuff isn't going to work because
again we don't have a chain Lake Network
on our JavaScript VM so those aren't
going to work so well but for what we're
going to do right now we don't really
care so much here's what we do care
about we do care about how much gas this
costs to actually send we do care about
how much gas this costs to create right
now creating this contract costs about
$859,000 gas and we're going to add a
couple of Tricks right now to bring this
number down we're going to add some
stuff back in in a bit which will bring
it back up but for now we're going to
learn some tricks to bring this number
down the two tricks that we're going to
learn are the constant keyword and the
immutable keyword in their solidity
there are two keywords that make it so
that your variables can't be changed and
those keywords are constant and
immutable you can learn more about them
in the solidity documentation if you
assign a variable once outside of a
function and then never change it so if
if it's assigned at compile time you can
go ahead and add this constant keyword
we'll learn later about storage but when
you add a constant keyword this minimum
USD no longer takes up a storage spot
and is much easier to read to so now we
recompile this and we deploy this new
contract let's see if we saved any
gas we look in the transaction logs now
we can grab the transaction cost of how
much this cost to deploy and let's
compare it to how how much it was before
wow we saved almost 19,000 gas that's
almost as much gas as it cost to send
ethereum typically constant variables
have a different naming convention
typically you'll want to do them all
caps like Min eum underscore USD so all
caps with underscores so now let's just
find minimum USD and replace that with
all caps as well with this interaction
we know that this variable is a constant
variable and it's much cheaper to read
from now if we go ahead compile this and
redeploy in our fund Rec contract even
though this is a view function remember
view functions do have gas costs when
when called by a contract as a constant
variable we can see the execution cost
of this variable
21,45 gas so let's put a little note
right underneath it if we remove the
constant variable we delete this
contract we redeploy collect fundme and
we hit minimum USD again we can now see
how much gas this was cost if it wasn't
a constant variable we can see the gas
cost did indeed go up now on chains that
are much cheaper this gas difference
probably won't make that much of a
difference but on more expensive chains
like ethereum this is going to make a
big difference for example on ethereum
we can actually see current gas prices
on ethereum here we can see the current
gas price of ethereum is about 141 gay
so we'll go to our converter way to way
we'll copy the way price times this
we'll get the gas price of calling our
minimum USD which is this number here
which if we put back in our ethereum
unit converter we can see cost this much
gas and if we times that by the
approximate current price of ethereum
which is around
$3,000 calling minimum USD as a constant
is going to cost $9 calling this that at
a non-constant is going to cost almost
an entire dollar more you you can see
how all these little gas optimization
tricks are going to make your life a lot
better so let's keep this constant
keyword in here we'll learn more about
constant and storage in later sections
of this course now as you're just
getting started with this course and
with solidity do not struggle and do not
worry about making your contracts as gas
efficient as possible in the beginning
and especially right now just write your
contracts as best as you can once you
get really good at gas and once you get
much later on in the course and much
more advanced with solidity then you can
start going back and working on gas
optimizations but do not let gas
optimizations hold you back or if you
start stressing over it just let it go
don't worry about it and just write your
code as best you can so long story short
do not stress about gas optimizations
right now now another variable we only
set one time is going to be our owner
variable owner equals message. sender we
set this this one time in the
Constructor variables that we set one
time but outside of the same line that
they're declared and we set them for
example in the Constructor we can Mark
as a mutable typically a good convention
for marking immutable variables is going
to be doing I underscore so that we know
that these are immutable variables they
have very similar gas savings to the
constant keyword owner of course is a
variable that we can't set on the line
here because inside the global scope
there's no function going on how over
inside functions because inside the
global scope there's going to be no
message. sender there's only going to be
a message. sender when we're inside of a
function so inside here we might say I
owner equals mesh. sender and then of
course we'll scroll down and we'll
change this require only owner now
equals I owner now if we compile that
and deploy it we can see how much gas we
can see how much gas calling I owner is
going to be by with the IM muteness we
get
2158 which we'll go ahead and copy for
now and we'll put right here we'll say
immutable now if we remove the immutable
keyword let's close this
redeploy now if we scroll down to I
owner scroll up the logs we go down to
the call scroll down we see the
execution cost was much more so we'll do
double backslash paste that in here gas
we not on immutable so you want to keep
some of these tricks in mind when it
comes to storing variables the reason
that these two save gas is because
instead of storing these variables
inside of a storage slot we actually
store them directly into the bite code
of the contract and like I said don't
worry too much about that for now later
on in the course we'll teach you more
about storage and a lot of this
low-level stuff that comes with these
contracts but for now just know that
these exist and they're nice gas Savers
if you're only setting your VAR Ables
once all right great so we've just made
our contract a little bit more gas
efficient little gas efficiency
improvements are going to be Concepts I
sprinkle throughout this course and when
we get to the more advanced section I'm
going to break down exactly what's going
on and why all these gas efficiencies
exist and what's going on behind the
scenes for these gas efficiencies to
occur it's a little bit in the weeds
which is why I'm going to gloss over it
right now so if it's confusing don't
worry I wouldn't let these gas
efficiencies be the thing that's slow
you down awesome so we have these two
gas optimizations how else can we make
this contract a little bit more gas
efficient well one of the ways we can
make this more gas efficient is by
updating our requires right now with our
requir statement we actually have to
store this sender is not an owner as a
string array every single one of these
characters in this error log needs to
get stored individually this the string
may not seem very big but it's a lot
bigger than the alternative with what we
can do as of 0.8.4 solidity you can now
actually do custom errors for our
reverts we declare them at the top and
then use ifs instead of require and then
just add our revert statements this ends
up saving a lot of gas since we just
call the error code as opposed to
calling the entire string associated
with the error so for example with our
require down here and with actually with
all of our requires what we could do is
instead of having this require we could
create custom error so at the top what
we could do is we could say
error not
owner and you'll notice that this is
actually outside of the contract here
now what we can do is we can take this
eror not owner scroll down into our only
owner instead of doing a require we'll
do an if statement we'll say if message.
sender is not I
owner then we're going to go ahead and
reverse
with a not owner error this ends up
saving us a lot of gas since we don't
have to store and emit this long string
here now in a lot of code today you'll
still see require a lot of places
because these these custom errors are
pretty new in solidity so you'll want to
get used to writing it both ways I
wouldn't be surprised if in the future
the Syntax for some of these errors
looks like this so that it's more
readable but for now if you want to do a
more gas efficient way than requires you
can can use something like this we could
update all of our requires here for
these custom errors but for now I'm
going to leave both in just to show you
the differences this revert keyword does
the exact same thing that required does
without the conditional beforehand so
you can actually go ahead and and revert
any transaction or any function call in
the middle of the function
call now let's look at one more way to
improve this contract sometimes people
will try to interact with a contract
that takes ethereum or the native
blockchain token without actually going
going through the required function
calls that that are needed for example
on a JavaScript evm here I could
actually try to send this contract money
without calling the fund function
however if I were to do that what would
happen would our fund function get
triggered no it wouldn't get triggered
we wouldn't keep track of that fun we
wouldn't have that person's information
updated in this contract so if later on
we want to give rewards or something we
wouldn't know about those funders and
this wouldn't be great cuz people would
send our contract money without us ever
knowing and we wouldn't be able to give
them any credit or anything additionally
maybe they called the wrong function by
accident and they they weren't using
metamask and they weren't using a tool
to tell them hey this transaction is
likely going to fail so what can we do
in this case what happens if someone
sends this
contract eth without calling the fund
function right now if we were to send
this fundme contract eth it would just
go to the contract contract right and
this contract just wouldn't keep track
of those people but there's actually a
way for when people send money to this
contract or people call a function that
doesn't exist for us to still trigger
some code and now there are two special
functions in solidity one is called
receive and one is called the
fallback now in solidity there are
actually a number of special functions
and two of these special functions are
the receive special function and the
fallback special function a contract can
have at most one receive function
declared using the receive external
payable without the function keyword
this function cannot have arguments
cannot return anything and must have
external visibility and a payable State
mutability what does that actually mean
and or look like well let's create a
separate contract to go ahead and play
with this so in here we're going to
create a new file called fallback
example. soul and in here we're going to
add our basic pieces SPX license
identifier MIT pragma
solidity
0.8.7 and we'll do contract fallback
example like so feel free to pause the
video to catch up to this point once we
create our fallback contract let's
create a variable to go ahead and try to
test this function we'll create a un 256
public result variable and let's create
this receive function so we'll say
receive it's going to be an external
payable
function we don't add the function
keyword for receive since solidity knows
that receive is a special function
whenever we send ethereum or make a
transaction to this contract now as long
as there's no data associated with the
transaction this receive function will
get triggered what we can do in here now
is we can say result equals 1 so let's
go ahead and test this out on the
JavaScript virtual machine we compile
this so we're going to go ahead and
compile this we'll go deploy it on the
JavaScript virtual machine we're going
to deploy our fallback example and we're
going to see what result is initialized
to since we haven't set anything for
result result of course is initialized
to zero but what if we were to send this
contract some ethereum well receive
would go ahead and be triggered here we
can actually send this contract some
ethereum directly by working with this
low-level interactions bit here don't
worry about what call data means for now
just know that this area down here is a
way we can send and work with different
functions and we can add parameters to
this transaction by going up here and
adjusting the variables up here if we
keep call data blank it'll be the same
as if we were in metamask and just
hitting send and then choosing this
contract address again we can't actually
use metamask since this is a virtual
machine and not one of the networks that
we're working with so if I do for
example I change this value to one way
and I keep everything blank and I go
ahead and hit this transaction button
which again is going to be the same as
hitting this send button but only
sending one way what do you think will
happen well let's try it we can see in
the log area that we did indeed send a
transaction and if you look at the
description here you can even see it
says from so and so to fallback example.
receive it looks like it called our
receive function which should have
updated our result to one so if we hit
result now we can indeed see that result
has been updated to the value of one
well let's go ahead and delete this
let's deploy this contract again and
this time let's have value be zero does
receive get trigger this time so let's
pull this down let's hit transact let's
leave the call data blank we'll leave
value at zero so this will be the same
as if we had sent zero ethereum to this
contract let's hit
transact looks like that went through do
you think result is going to be one or
zero you thought one you were correct a
receive function gets triggered anytime
we send a transaction to this contract
now and we don't specify a function and
we keep the call data blank when working
with any other contract like fundme for
example when we call one of these
functions we're actually just Po in this
call data bit with certain data that
points to one of these functions up here
if we send a transaction and we add data
to it we could actually call one of
these functions now let's try this again
let's delete the contract again we'll
redeploy open this up result is
currently zero receive like I said only
is triggered if our call data to it is
blank now this time if I add some call
data to this transaction you think
receive will be triggered this time if
we hit transact and remix we actually
get a popup saying fallback function is
not defined this is because whenever
data is sent with a transaction solidity
says oh well since you're sending data
you're not looking for receive you're
looking for some function so let me look
for that function for you hm I don't see
any function that matches the 0x0 0 so
I'm going to look for your fallback
Function Remix is smart enough to know
that we don't have a fallback function
the second special function in solidity
is called the fallback function this is
very similar to the receive function
except for the fact that it can work
even when data is sent along with
transaction so our fallback will look
something like this
fallback
external
payable result equals 2 fallback is
another one of these functions where
we're not going to put the function
selector because solidity is expecting
this actually you're already familiar
with one other special function if we go
back to our funme our Constructor for
example is another type of special
function there's no function key keyword
solidity knows that this Constructor is
immediately called when we deploy this
contract so now we have our fallback
function let's go ahead and compile this
let's delete our old
contract let's go ahead and deploy this
new contract let's click here we hit
result we do indeed see it's set to zero
now if I add this 0x00 0 and I send this
and I hit transact this is equivalent to
calling our contract here without a
valid function so our contract goes hm I
don't recognize what you're trying to
tell me here I'm going to refer you to
our fallback now if we hit result we see
that it's been updated to two if we take
this away solidity will go hm it looks
like you're trying to send some ethereum
or call this contract without specifying
what you want to do well I have a
receive function so I'm just going to go
ahead and forward you to that so if we
call transact we hit result we see it
updates back to one add some data hit
transact we see it updates to two no
data updates to one solidity by
example.org has a wonderful little chart
that we can use to figure out whether
not receive is going to get triggered or
fallback is going to get triggered if it
is empty and there's a receive function
it'll call the receive function if it is
data and there's no receive function
it'll just go to the fallback function
and if there's no fallback function it
might just it might error out so this is
a lot of really fantastic information
here how can we apply this to our fundme
contract here well what we can do now in
our fundme is we can add these fallback
and receive functions just in case
somebody actually sends this contract
money instead of calling the fund
function correctly so what we can do is
let's add a receive function so if
somebody accidentally sends it money we
can still process the transaction we'll
say receive is going to be external
payable and we'll just have the receive
function call fund and we'll do the same
thing with our fall
function we'll have fallback external
payable we'll just have it automatically
call fund now if somebody accidentally
sends this money without calling our
fund function it'll still automatically
route them over to the fund function
this means too that if somebody doesn't
send us enough funding it'll that
transaction will still get reverted so
let's go ahead now and let's switch to
rink B to test this on a real test net
I'm on rink be and my metamask let's
switch over to injected web 3 and we'll
scroll down we'll choose our fundme
contract and we'll go ahead and deploy
this menam mask pops up I'm going to go
ahead and confirm the transaction and we
see our fundme contract here right now
we can see the own we can see I'm the
owner we can see minimum USD and we can
see of course that it's a blank contract
and there's nothing funded in here if we
copy the address and then go to Rinky
ether scan
paste the address in we can see that
there's no ether in here and the only
transaction associated with this has
been the contract creation we saw what
happened before when we hit the fund
function our contract was updated with a
new balance and that funer was added to
our array let's see what happens now if
we just directly send this contract
money without calling the fund function
here if we did this right our receive
function should pick it up and kick the
transaction over to fund so let's copy
this address we'll go to our
metamask we'll hit send paste the
address in here we'll do 0.02 eth again
because this should be more than the
minimum amount in USD we'll hit next
I'll go ahead and confirm this and after
a slight delay if we did this right well
we should see this transaction having
called the fund function here now that
our transaction has gone through and
after a brief delay and waiting for
ether scan to update we do indeed see
that our balance has updated to
0.02 which of course this makes sense
and we see in the transactions list here
we see that this actually went through
as a as a transfer instead of what's
calling the fund function let's go ahead
and remix and see if our funders was
updated it looks like it was at the
zeroth position of funders we have our
address and if we take our address and
pop it into address to amount funded we
can see exactly how much we had funded
this means that since we added this
receive function in here we
automatically had to call our fund
function up here so awesome work we were
able to add a receive function to help
people who accidentally call the wrong
function or accidentally send this
contract money instead of correctly
calling the fund function now if they
had directly called the fund function it
would have cost them a little bit less
gas but at least this time they're going
to get credit and added to to our
funders array for having sent our
funding contract
money we've even learned some Advanced
sections of solidity and this is going
to be the last time that we start our
projects in remix we're going to be
moving over to a code editor now where
we can get even more advanced with our
solidity and our setups for the most
part you've gone over the vast majority
of solidity Basics there are a number of
things that we still haven't learned yet
and the reason we haven't gone into them
is because they get more advanced and
understanding the real use doesn't
really make too much sense until a
little bit later some of the things that
we're going to go over are enims events
try catch function selectors ABI
encoding hashing and then U slash and
then u/ assembly however if you've
gotten this far you probably can read
most solidity code and understand what's
going on which is absolutely fantastic
so you should give yourself a huge round
of applause for getting this far in
doing this let's do a quick summary of
this more advanced section and make sure
we understand what we learned in Sol
there are a couple special functions
some of them are receive fallback and
Constructor these functions don't need
to have the function keyword and instead
can just be called like so receive and
fallback are two very special functions
if data is sent with a transaction and
no function was specified the
transaction will default to the fallback
function if that fallback function
exists if data is empty and there's a
receive function it'll call the receive
function there are a couple of keywords
that can help us save gas in the long
run some of those keywords are going to
be constant and immutable constant and
immutable are for variables that can
only be declared and updated once once
we say minimum USD is 50 * 1 E18 this
minimum USD can never be changed again
and this helps us save gas IM mutable
can also save gas similar to constant
however immutable variables can be
declared one time in the Constructor
once an immutable variable is declared
it can't be changed later on in fact if
we even tried to update an immutable
variable or a constant variable and we
compiled a compiler would give us an
error saying can't write to immutable
here or if we tried to change a constant
variable our compiler would say hey you
can't assign to a constant variable
sorry in remix if we want to send ether
to a contract that's on the JavaScript
virtual machine we can deploy that
contract and then in the contract we can
just hit the transact button without any
call data and update the value that we
send with the transaction if call data
is blank it'll trigger a receive
function if it exists but if there's
data that doesn't specify any of the
other functions it'll trigger the
fallback function
all right my code's done time to ship it
free box to you dog water zero earn zpr
in the age of AI debugging and getting
into software engineering has never been
easier here the exact six steps you need
to take to unblock yourself from any
software engineering area you'll ever
get number one Tinker try to pinpoint
your air you can usually use an AI buddy
to help you out here pinpointing your
air will potentially solve your problem
before even going to an AI and allow you
to craft a better question to an AI once
You' pinpointed the issue you can move
to step two which is ask your AI you can
use chat gbt find Bing's AI or if you
want to get wrong answers Google's
barred there's six principles to prompt
engineering so that you can get the best
out of your AI write clear and Specific
Instructions give as much context as
possible use delimiters to clearly
indicate distinct parts of the input and
especially look out for something called
hallucinations hallucinations are when
your AI gives you an output that it
thinks is right but it's completely
wrong for example if I write about
writing solidity and variant tests in
Foundry disgraces Us by saying we have
to mpm install it from open Zeppelin
these can be tough to spot but once you
try it out you'll see it doesn't work
and finally you want to understand the
limitations of the AI you're working
with and iterate constantly large
learning language models are trained on
human conversations so you can interact
with them as if you're having a
conversation but it's important to know
the limitations of these AIS as most AIS
have a limit on how many tokens or words
they can keep in context at one time AI
is trained off human language so if
you're good at asking other humans
questions you'll probably be good at
asking robots questions too asking
questions is a skill so keep practicing
I've got a link in the description to
learn. deeplearning.ai which is a free
course to help software Engineers be
better prompt Engineers now when the AIS
can't help you you'll have to go back to
the old standbys actually doing work
yourself and one of the first pieces of
work is reading the documentation you
probably should have done this already
however we can still use chat gbt cuz a
strategy that I constantly use is I'll
copy paste sections of the documentation
at chpts context and say some like the
above are the docs for Tool X based on
those docs how do I do why so Google
might be crying because chat PT is
eating its lunch but Google still has
what AI doesn't have the entire internet
previously anytime I ran into an issue I
prayed someone else to run into it
before I made a post on it so I could
Google search that exact issue there's a
new tool called fine that combines web
search with AI as it does a web search
and it crawls through all the data of
the sites reads them all and then gives
you an answer based off of what it reads
five asking a forum sometimes the
information just isn't out there and we
need to ask human beings we always want
to ask our question on a webbed index
Forum like stack exchange stack Overflow
pirana or Reddit this way webcrawlers
and more likely AIS can scrape the data
from these sites and learn from us that
way the next time we have this question
we can get our answers quickly asking on
Discord and Twitter are because your
knowledge will get lost to the
unsearchable hellhole of conversations
that Discord is and web crawlers don't
index them the super secret alpha is to
ask a question on stack exchange and
then post your stack exchange link to
Discord you should 100% always ask your
questions and format them with markdown
and if you're not sure how to do
markdown you can ask chat to to help you
format your questions and markdown ask
on the support GitHub or forum is the
tool you're working on open source
awesome ask a well formatted question on
their git page not open source never use
that tool again this is how we improve
our tools by creating issues engaging
with each other and even taking on
issues and contributing to the open
source code and then finally iterate do
all these same steps over again and as
always keep hopping through the code and
until next time stay riveting my fellow
blockchain ear
[Music]
all right fantastic so now we know a
little bit more about the different
tools and techniques we can use when we
do in fact get stuck we can use
something like chat TBT forums to ask
questions we obviously want to Google
search and especially for this course
you definitely want to make sure you use
the discussions Channel but I wanted to
give you some very specific tips about
working with this course number one
limit your self triaging to 15 or 20
minutes for example if we're trying to
compile our price converter doou and
maybe we forgot to add the address in
here right and we're going ahead and
compile and we're getting this error
this is exactly one argument expected
for explicit type conversion now this
should be pretty obvious what the error
is hey it's expecting one argument and
we obviously just removed that argument
but maybe you're having a really hard
time and you're trying all this
different stuff and you can't seem to
figure it out limit yourself to 15 or 20
minutes we do not want to be messing
around for so long that we can't figure
something out right something like this
would be very easy for us to compile
copy this error go to chat gbt and say
something like hey I'm getting an error
compiling my solidity here is the error
do three back ticks paste it in here
like that three back ticks is markdown
and like we said in the video we want to
use delimiters to clearly identify what
is Code versus what is not oops and I
hit and I hit enter whoops the daisy
we're actually going toit stop
generating and we're going to copy paste
the question again now we're going to
say here is my solidity it's wrong then
we'll copy the solidity
line once again three back ticks we'll
say solidity here we'll paste it in
three back ticks to end it hit enter and
it'll probably give us the answer here
and sure enough the error message
suggests that you need to provide an
address when using explicit type
conversion so we go ah okay whoops we
need to actually add an address in here
it gives us an example and we can go
back to our code and you know paste that
address in here and be good to go so
limit self triage to 15 20 minutes
that's going to be the first tip number
two don't be afraid to ask AI but don't
skip learning the purpose of this course
is for you to be able to learn
everything here AI is going to get
things wrong and it's only the people
who actually have learned what's going
on under the hood who are going to be
able to call out when AI gets something
wrong when AI gets something wrong it
does something called hallucinate and we
talked a little bit about that in that
AI video we just watched so
hallucinations are when the AI makes
something up that it thinks is right but
it's completely wrong and that's
something we absolutely need to watch
out for when we're coding and when we're
learning a perfect example of this is
with Foundry which is a tool we're about
to learn very soon in order for us to
install Foundry we actually need to run
this Command right getf founder. sh it's
the first thing that it tells us to do
at the time of recording chat gbt has
not been trained on The Foundry tool so
if I ask it a question like I'd like to
initialize a Foundry project with
solidity can you show me how to do that
and we'll let enter so the first
sentence out the gate is wrong it's not
aware of Foundry so it tried to guess
what Foundry was and it got it wrong it
is not a CR space framework for building
blockchains at all and it is directly
related to solidity so it's really
important that we use AI to augment our
learning but we don't skip over the
learning with AI it's really good to
bounce questions good ideas off of but
in order for us to be even able to
recognize when Foundry is hallucinating
and making stuff up we need to have that
knowledge ourself step three of course
use the forms web3 education. deev will
have a place for you to ask questions
but in the meantime definitely be sure
to use The Foundry full course
discussions use this to your advantage
and use this to help other people out
who have questions this is a community
project we're all going to be helping
each other out learning number three
Google the exact error if AI doesn't
know the forms aren't know Google the
exact error maybe somebody else has come
across this error previously asked the
question online and you can just Google
it and then of course post your question
in stack exchange or piranha and like we
said in that AI video you want to use
markdown and format your questions as
best as possible so if you're unfamiliar
with how to use markdown if you're
unfamiliar with how to format your
questions again please be sure to ask
chat GPT or some other AI how to best
format your question you can even simply
say ask chat GPT could you give me an
example of a well formatted stack
Overflow question with Cod or code and
it'll actually give us a really good
formatted question so it gives us the
question it formats the code for us it's
using this with the three back ticks
that I showed you in order to get this
code block here it's using three
backticks and it's being very verbose in
giving all the details of the question
so be sure to ask questions like chbt
awesome again let's say we're in here
compile get this error exactly when
argument expected for explicit type
conversion if we copy this error go to
Google we paste just the error in we'll
remove this our specific code looks like
the first thing we get in Google is
actually contract inheritance and we can
see that this is actually exactly the
error that we're getting it looks like
this does actually explain the answer
but it's a little bit confusing to
understand here so maybe you would copy
paste this into chat gpts context right
there's a lot of creative ways you can
approach debugging some of your issues
obviously when you're out in the wild
and you're actually building things
yourself obviously the education site
and the discussions channel of the giup
repo the people in these aren't going to
have context for the new creative thing
that you're working on so I want you to
get used to doing that methodology that
we're teaching here right asking your AI
buddy if your AI buddy doesn't know
Googling asking questions on stack
exchange ethereum asking questions on
piranha piran is arguably better because
you're asking your questions in a
decentralized location as opposed to a
centralized server but I definitely want
you to practice asking questions and go
to piran go to stack exchange make
accounts for these so that when you do
run into an issue because you will
you'll know where to post them high
encourage you to pause and post a
question on one of these forms right now
now just so that you get used to it just
so that you get out of your shell and
you're going to suck at asking questions
in the beginning and that's okay you
will get better at asking questions as
you continue with this course asking
good questions is a skill in itself and
if you learn how to ask very good
questions that's the secret sauce to
being amazing at AI prompting as well
now the final step in all of this is
actually going to be posting an issue on
GitHub SLG a surprisingly incred
important part of being a software
engineer and being a developer in web 3
is interacting with the community the
vast majority of these tools that we're
working with are going to be something
called open source meaning that the code
associated with them is actually
available for anybody to view this tool
Foundry that we're going to be working
with is one such example and if you see
it has this issues tab where there's
just a ton of issues people are posting
while using this tool this is how code
is able to be improved and move forward
all this code is public for people to
use and work with and if there's a
question that isn't answered you can
post here and tell the developers of
this tool hey I'm running into an issue
maybe we should make a project
Improvement I would say be very
respectful with the way that you make
issues you definitely want to do some
searching on issues to make sure that
nobody else has asked the question that
you're working with and be to sure to
use these other resources first like
panha like stack exchange but in the
future once you leave this court it's
going to be incredibly important for you
to participate in the ecosystem by
making issues by making poll requests
and actually improving some of the tools
that we're going to be working with
yourself even ethereum has a GitHub and
if there's any improvements that you
want to make you can add an EIP to
actually improve ethereum we'll talk
about EIP some more later you can
improve some of the clients that
ethereum runs so interacting with each
other is incredibly important and in
fact if you don't have a GitHub we are
going to get you set up with GitHub
right now because GitHub is the platform
that most developers use to share code
and write code and interact with code in
between each other so if you don't have
a GitHub let's sign up right now and
we're going to use the GitHub to create
our own portfolios of all the different
cool coding projects that we've created
this way when you go to apply for a job
you can say hey go look at my GitHub
I've got all these really cool projects
so we're going to make you a GitHub
right now if you don't have an email
you're going to need an email I made a
burner account just for this video and
I'm also going to walk you through
formatting a question and I know I'm
belaboring the point here but I really
really want to stress the importance of
formatting these questions really well
so we're actually going to show a clip
from my past video so we're going to be
using the full blockchain cility course
JS but again for this video just be sure
to use the GitHub repo associated with
this course and not that other old
GitHub repo all right let's watch this
video in fact if you haven't already
let's sign up for for GitHub right now
and let me walk you through formatting
one of these questions because the
better you format your questions the
better chance you have of actually
getting the answer and remember when
asking questions on these forums when
asking questions in these discussion
communities people answer these
questions out of the goodness of their
heart right so if you don't get a
response there's a chance that maybe
nobody knows maybe it's your question
isn't formatted very well and Etc so
we're going to learn how to ask really
good questions here and if you're new to
blockchain do not skip this section okay
this is going to be that piece that's
going to give you the superpower to
unblock yourself from any coding issue
you run into so don't skip this part be
sure to follow along okay so if you
don't have a GitHub already you do need
an email to get started so I'm going to
go ahead and sign in I made a burner
account just for this video so what
we're going to do we're going to go
ahead and sign up GitHub enter your
email and we hit create account they're
going to send us an email so we're going
to come back to our email going to get
our launch code here paste it
in answer a little bit of
information we're going to choose the
free
version and fantastic we've now created
a GitHub
profile awesome so now we've created a
GitHub so I'm actually using a GitHub
that I used in my last course so that's
why I have all these repositories over
here now in order to create a new
discussion disc Over The Foundry full
course f23 let's go over to the
discussions tab we'll hit new discussion
and we'll hit General and I'll say
something like test discussion be like
feel free to say hello here start
discussion now I'm going to show you a
question that's formatted poorly and I
want you to never ever ever ask a
question like this and if you see
somebody ask a question like this please
help them format their question
correctly hey why my code not be good
and then let's just have it be issue
like this right what's wrong wrong with
this okay well why my code not be good
obviously isn't clear what's going on
the code isn't formatted well and even
an AI would have a hard time answering
this so let's fix this to be a little
bit better as we know we want to copy
the exact error we're getting so we'll
say We'll copy the error we'll go back
we'll say I am receiving this error
we'll do the three little back ticks
paste our error right in here like that
actually let's be even more exposit I'm
receiving this error while compiling
here's my code re betic we'll put
solidity here copy the whole line that
is erroring paste it in here and someone
help me figure out what the issue is
right and you see how this is much much
better right we have these two blocks
that pop up because we did the back
ticks and the secret is that this is
going to get you a much better answer
from an AI as well right if we edit this
we can copy the whole thing in markdown
go over to chat jbt paste it in zoom out
a little bit and we're going to get it
actually an answer hey you're receiving
this air because you're trying to create
an instance of aggregator V in phas
without providing the necessary argument
blah blah blah oh and it actually gives
an updated version of that but it helps
us out here so ask format your questions
correctly you will get better answers
from both AIS and humans and I know I'm
spending a long time on this but I
really really need you to understand
that the secret to prompt engineering is
actually just being able to ask better
formatted questions with human beings
and it's better for interacting with
human beings as well now the other thing
that I did really well here was I only
posted the relevant code to the error
that I was getting what we see a lot of
people do is they just copy paste their
entire code base into here this is not
very helpful as it's going to make
somebody who wants to help you their job
a lot harder if they have to read your
entire code base right we reply here
this is so much more reading for them to
do it's going to take them a lot longer
and they might not actually read it and
we didn't actually highlight this with
the back ticks and it goes the same
thing with AI if you give your AI too
much text it can't read all of the text
because again some of these AIS have
limitations in how much text they can
read so it's the exact same thing with
working with human beings so feel free
to take some time to either in chat BT
or whatever AI you're using or in this
test discussion forum to post some well
formatted question questions and
remember you can use AI to help you get
those formatted questions in markdown be
sure to ask chat WT to give you the
output in markdown so if you haven't
worked with markdown before that's okay
you'll learn as you go along but one of
the biggest differences especially when
working with markdown that's going to
make your code so much more readable and
I 100% need you to always do this
whenever you ask questions is you see
how this got like some syntax
highlighting in this above question well
if we go click edit again we can
actually see why up here we did those
three back ticks and then we typed the
word solidity when you do these three
back ticks in your questions if you type
the word or you type the language next
to the first three back ticks it'll
actually add some formatting to make it
more readable so if we scroll down to
this poorly formatted question you can
see that this is just all white and like
impossible to read it would be at least
slightly better if we hit edit and next
to these three back ticks we wrote
solidity if this like Java code or
python code we could write python or
Java or whatever but since this is
solidity we'll write
solidity I'll hit
update and you can see that it is
substantially nicer and it is much more
readable now so even though this is
still a bad question obviously because
we just copy pasted all of our code it's
at least much more readable so anytime
you do a code block like this of any of
your code absolutely 100% be sure to do
the three back ticks and then the
language of the block of code so just
remember this there are no bad questions
but there are poorly formatted questions
make your questions well formatted for
both human beings and for AI and then
most importantly be sure to join these
forums and like I've said 100 times
interact with these people interact and
help and give back the more people that
use and are good at the tool that you're
working with the more likely that
they're going to help you sometime in
the future and this is how I've met so
many people in the industry is just
giving back in interacting with other
people so whenever you ask a question
especially in the beginning cuz in the
beginning you're going to have more
questions than not be sure to at least
try to go back and answer a question
think of it as question and answer debt
every time you answer a question make a
little mental note and say ah in the
future I need to at least try to answer
one of somebody else's questions this is
how we grow and move so much
faster now this next piece that I'm
going to show you is outside of this
course but it's a resource that I wanted
to show you in case after this course is
done you want more resources to learn
about ethereum and learn about the EVN
it's with my good friend Austin who's
going to show you speedrun ethereum and
definitely something you might want to
check out after taking this course
what's up I'm Austin Griffith happy bow
tie Friday I want to show you the best
way to get started building on ethereum
is speedrun ethereum.org
[Music]
you'll build a decentralized staking app
you'll learn that the superpower of
ethereum is allowing you the Builder to
create a simple set of rules where an
adversarial group of people can
coordinate financially you'll build a
token vendor you'll build a dice game
and you'll learn about Randomness on
chain and where it works and where it
doesn't and what you can do about that
you learn about a DEX and what a hyper
structure is and how people can use
liquidity to swap you'll learn about
State Channel and scalability and sign
messages and multisig wallets and
account abstraction and SVG nfts lots of
fun stuff along the way like I said not
just the how but the why go to speedrun
ethereum.org and get started today uh
it'll have you do a quick video uh and
then it says to use scaffold eth to
start tinkering I want to show you how
to do that first of all all this stuff
is open source uh it's all ungated and
open source just get in and get get in
get learning okay but this scaffold e
thing uh scaffold e is a great way to
Tinker with solidity and kind of get
your your your bearings right so let me
show scaffold 2 just for a second if we
zoom in uh I've already kind of uh gone
through the whole readme and installed
everything I want to show this right
here here's a smart contract and I have
my front end that's uh Auto adapting to
the smart contract and so uh when in
speedrun ethereum it tells you to Tinker
with each one of these Concepts let's
just go look at mappings or strs or
modifiers let's just go look at get a
mapping and let's grab a mapping right
and let's copy and paste it right into
our smart contract so something called
my map I don't even know what it is
right and then we yarn deploy and we'll
see that my map show up over here and
this is kind of the feedback loop I want
you to get into where you can grab some
stuff from solidity by example paste it
into your smart contract deploy it
locally and then Tinker with it there's
my my map let's see what vitalic bance
is in my map
it's zero oh okay so check out speedrun
ethereum check out scaffold e get
started building cool things on ethereum
today happy bowai Friday hearts hearts
hearts see you
now the reason I especially wanted to
show you all of these debugging things
right now is because we are about to
move off of remix remix has been this
phenomenal IDE or this phenomenal
integrated development environment that
allows us to quickly try things and
quickly deploy things but we're actually
going to move off of remix to a more
professional setup and we're going to be
using a modern set of tools that most of
the rest of the development community
also works with and I'm going to tell
you this right now often installing
these new tools and often just getting
your local development environment set
up not using remix or not using what's
called a cloud IDE can often be the
actually most difficult step in this
whole process so I want you to be
absolutely Vigilant in using all of the
resources that I just showed you using
the chat using chat GPT using piranha
using stack Exchange eth using web3
education. once we get this up and live
be sure to use these tools and don't let
installing these slow you down because
in my mind installing these can be the
hardest part of this whole course and
it's okay things might not work the
first time and that's okay just be sure
to ask questions and be very specific
with the errors that you're seeing and
installing these things that's what
we're going to learn how to do right now
so remix is a phenomenal tool but now
we're going to move over to this more
professional setup called called Foundry
Foundry is one of the most popular smart
contract development Frameworks similar
to hardhead or brownie if you're
familiar with those and it's known
specifically for its speed Foundry is
easily the fastest to work with smart
contract development framework one of
the unique aspects about Foundry is that
whereas hard hat is Javascript based
brownie is python based Foundry is
completely solidity based so we don't
have to learn any other programming
languages other than solidity to work
with Foundry and similar to everything
that we we've been doing so far all of
the code for all of our Foundry products
are going to be in the GitHub repo
associated with this course however the
documentation for Foundry I think is
also phenomenal so be sure to use this
as you code along and something very
interesting that I really love to do
most of these pages are pretty small so
even if your AI isn't trained off of
Foundry which as a recording it's not
what we can do is something called
context injection when we have issues so
we can copy the entire page of Doc
mentation we can say I'd like to start
I'd like to install Foundry here are the
documentations for installation how can
I do it do the three back ticks paste
the whole thing in there and by giving
our AIS the documentation for working
with Foundry it's actually going to give
us outputs to install Foundry so this is
a methodology you'll see me use from
time to time this context injection you
can find more
in the GitHub repo once again associated
with this course on installation and
setup Mac OS and this should be Linux
and then we have some Windows setup
stuff down here we're going to go over
how to set up all the important things
for this course so be sure to use this
as a reference now a great question you
might be asking is well what's even the
purpose of Foundry why do we need to use
this other tool remix is working great
well in remix you notice that we did a
lot of stuff manually like I came in
here I had to go to compile maybe I
wanted to test something out I would go
deploy it uh I got a put a price feed in
here a price feed in here deploy okay
does the get version work Uh something's
wrong with my get version okay my o i
owner works okay minimum USD works oh
crap I got to go make some little change
here you know maybe I want get version
to actually return you know 7 + 2 or 7 +
1 now I got to go you know delete this I
got to go redeploy I got to go click
this I got to go down I got to click and
then if I have a hundred things that I
change testing all of this is going to
take a really long time and anytime you
do something anytime us as human beings
changes our code in some way there's a
chance that we break something and
remember these smart contracts are
immutable so if we break something if we
mess something up that's really bad
because that mess up will be permanent
on the blockchain so we want a framework
that helps us deploy our smart contracts
test our smart contracts and interact
with them in a much more programmatic
way rather than we having to manually
click around right if I changed 10
functions and I wanted to test the work
I would have to go click 10 buttons
that's ridiculous in Foundry we can do
all of that in one command or one button
so that's why we're going to be using
Foundry here and I'm so excited for you
to be using this Foundry tool because
like I said it's the fastest smart
contract development framework out there
right now but additionally it's also the
framework of choice for smart contract
security engineers and Auditors and I
expect more and more projects in the
future to be built in Foundry so
incredibly excited for you here now for
the rest of the course I'm going to be
we're using a code editor called Visual
Studio code this is one of the most
powerful code editors on the planet and
if you've already got it set up feel
free to go ahead and skip this part
you'll often hear people refer to this
as VSS code or Visual Studio code or
just Visual Studio however it's
important to not that Visual Studio code
this is different than Visual Studio
which you might see look like this so
visual studio code is what you want not
Visual Studio Visual Studio is a
different application make sure you're
on Visual Studio code now if you choose
so and you're a total Hardo you can
absolutely work just with your terminal
or just with Powershell or just with
whatever coding environment that you
want like atom or Sublime however for us
we're going to be working with Visual
Studio code and I'm going to be going
through setting up visual studio code
the way that I like to set it up you can
absolutely set it up whatever way that
you feel comfortable now we're going to
go through three different installation
processes and pick the one that's most
appropriate for you the first one is
going to be for mac and Linux users the
second one is going to be for Windows
users and then our third one is going to
be a last ditch effort if for whatever
reason you can't get Windows or Linux or
the Mac instructions to work we're going
to use a git pod installation now I
highly highly recommend that you try to
get everything working locally without
using git pod however if for whatever
reason you can't get those installation
pieces to work we will have git pod
instructions for all of the repos that
we work with here but to get started
we'll start with the mac and Linux
installation
instructions the first thing you're
going to want to do is download the Mac
or if you're working with Linux download
the Linux installation of Visual Studio
code once you have it installed it'll
look a little something like this and if
it's a fresh installation it'll even
give you some tips and tools to actually
get started if you've never worked with
Visual Studio code before I highly
recommend going through any get started
or getting instructions tips that come
with opening Visual Studio code
additionally we have a visual studio
code crash course in the GitHub repo
associated with this course now one of
the awesome things about Visual Studio
code is it has this thing called
terminals which are commandline promps
that allow us to run scripts basically
it's where we're going to be running all
of our code the way we can open up the
terminal is we can go ahead and hit
terminal and select new terminal and
you'll get something like this now you
might have bash or zch or some other
type of shell the type that you have
doesn't really matter because on Mac and
Linux it's going to be Linux based and
like I said sometimes installing this
can be the hardest part of this entire
course so so don't get discouraged and
please use stack overflow stack exchange
ethereum and the GitHub repo to to move
past any issues you run into now if
you're on Mac or Linux you can actually
hit control back tick to actually toggle
your terminal mode this will pull the
terminal up and down for you getting
familiar with keyboard shortcuts will
actually make your life a lot easier cuz
you'll be able to move around Visual
Studio code much more effectively we
have a link to a list of keyboard
shortcuts additionally in the GitHub
repository associated with this section
as we move along I'll give tip on
different keyboard shortcuts that you
can optionally use otherwise you just go
ahead and click as well you can click
the trash can to delete the terminal go
back up terminal new terminal to pop it
back up now the next thing that we're
going to need a little bit later we're
not going to need it for this section
but it's good to install it now is going
to be git we will have links to the
installation instructions in the GitHub
repository installing git on Linux
you're going to use one of these two
commands and on Mac OS if you just type
git on the command line it should go
ahead and prompt you to install it so if
we're back in our command line and we
just type get it should prompt you to go
ahead and install it and if you do g--
version you should get something that
looks like this you can also use a Mac
OS git installer by clicking this link
here and running through the
installation process all right now that
you have git and visual studio code
installed we can continue on to the next
section awesome if you're not planning
on using Windows or git pod feel free to
skip the next two
sections and for this Windows setup
we're going to be learning about a tool
called WSL and to introduce that to us
we have my friend basili who has done
amazing work helping me on some of my
past courses and he's going to be
helping us here today so take it away
this tutorial is going to be useful for
any Windows version from Windows 10 and
above let's get started by installing or
code editor in this case Visual Studio
code so let's type BS code on the
browser and hit
enter s or version for Windows select
the destination and click save and the
installation process is going to be the
same as any other program so let's
select an accept the agreement click
next add code to the pat create a
desktop icon next and
install this shouldn't take a lot and
this is how the editor is going to look
like the first time we install it we can
customize the theme create shortcuts and
sync with another
devices and if you want to go deep into
Visual Studio code well I suggest you to
pause the video for a moment and go
through all these steps one by one now
we could 100% go forward and install the
rest of our Tools in a Windows
environment but basili is actually going
to explain to us that the windows
environment isn't really actually the
best way and the best place to do our
installations Microsoft has definitely
increased their support for developers
in the recent years but when it comes to
Smart contct development there is a
better option to consider using WSL the
windows subsystem for Linux trust me is
a game changer you see a smart contract
development often involves working with
tools and utilities that are commonly
found on Unix based environments while
Windows has come a long way in
accommodating developers there can still
be some challenges when it comes to
ruining certain command line tools and
setting up the right development
environment not mentioning that if you
want your code to run on any machine
using a units based system Mac and Linux
is better for your developer needs here
is where WSL shines by installing a
Linux distribution through WSL you can
access to a full-fledged Unix light
console right on your Windows machine
and don't worry you don't need to be a
hacker or wear a hoodie to make it
happen is actually quite simple so let's
do it for that let's open the windows
terminal this is a pre-installed
application on Windows
11 and so something you can easily
install through the Microsoft store on
Windows 10 just type terminal and here
you are going to have the windows
one so let's install WSL by typing WL
minus minus install hit enter is going
to trigger us a admin operation and
installation is going to start and here
we just have to wait until the process
finishes once the process is done this
will require you to reboot your
operating system system so I'll see you
on a second once rebooted this is going
to automatically open this terminal and
the installation process is going to
proceed now you have to input a new Unix
username for me is going to be chare and
then you have to set up your password
don't worry the password is always
hidden on Linux operating systems and as
this as that we already have a operating
Linux terminal inside our Windows
machine so we can now close this now if
we open a new instance on the Windows
terminal we click here on this drop-
down arrow we can have now this obuntu
shell on which we are going to inst all
the development requirements we are
going to use during the course so the
next step is to make Visual Studio code
compatible with WSL so let's do
that let's go to the extension stab
let's search for remote development and
install all these extensions this is
going to automatically install the
compatibility to connect or Visual
Studio code with WSL and as you can see
over here I have a new econ called open
a remote window if I click here I can
directly connect to WSL however there is
an easy way to do this let's close Vis
Studio code and on the Linux terminal
let's just create a new folder for
example Mader solidity course let's move
to that folder and now let's open Visual
Studio code inside this folder just type
code dot hit enter this is going to
install the latest server for w cell on
Visual Studio code and once this is done
we are going to have a new instance of
Visual Studio code but using WSL let's
just trust the outdors and as you can
see here I'm getting this WSL Ubuntu
Banner over here and and is because I
already connected this with the Linux
instance so you have two options from
now on you can start using just the
windows terminal to execute all the
things we are going to need or you can
use the integrated terminal which comes
with Visual Studio code just go to
terminal new terminal and now we are
going to have a terminal using the exact
same W cell instance so we can start
using PSE sudo commands for example to
the AP update and this is going to work
properly now just take something in
consideration maybe you are going to
develop all your projects on a folder
called development inside your documents
on Windows and you can do so however if
you take a look to the Linux terminal
with ls command as you can see here you
are going to have just access to the
local files and folders inside of the
WSL instance and I highly recommend you
to do that because of course you can do
something like typing the address of
your local development folders and use
the projects from here but the
communication from the WL console and
the local Windows files are actually
quite slow so I prefer just to keep
Simple and use all the folders inside W
cell remember that you have to just
manage simple commands such as LS to
know all the folders on the current
directory and CD to navigate through
them now if you go back to your vs code
and you hit terminal new terminal and
open up a terminal we're going to want
to then install git we're not going to
use git for this lesson however we will
definitely be using it in the future see
if git is installed type g-- version
sometimes Linux will automatically come
with get installed and you'll see
something output like this however if
you are the ones who decided to keep
using po sh
and just Windows instead of WSL don't
forget to go to the official git page
and install it for Windows the process
is as same as we did before pretty
standard just the common sequence of
clicking next and of course please to
read the license agreement and now if
you've made it this far you should be
able to follow along with the mac and
Linux constructions as if you're running
on a Mac and a Linux even though you're
running on a Windows just be sure that
whenever you're in your vs code you take
a look at the bottom left and make sure
you're on WSL yuntu like I said before
if you want to run in Powershell or in a
Windows environment you're more than
free to do so but like I said if you've
made it this far huge congratulations
awesome
work and then finally our last setup is
going to be using a tool called gitpod
starting from lesson five the lesson
that we're on right now ether's JS
simple storage all of our code repos are
going to come with a button in the repo
scroll down they'll come with this open
in git pod button now git pod is a cloud
development environment where you can
actually run your code on a remote
server it's kind of similar to remix IDE
but it allows you to run Visual Studio
code in the browser or connected to
another server this is good because then
you don't have to do any installation on
anything since all the tools that you
want to use are just going to be running
on this remote server this has its
downsides though obviously since you'll
only be able to code if git pod is up
and working for you additionally when it
comes to private Keys you absolutely do
not want to run any code with a private
key that has real money in it on gitpod
why well once again since you're running
your scripts on a remote server those
servers have access to your private keys
but since you've pinky promised that for
this course you're not going to be using
a metamask or a private key with actual
money in it it should be fine the other
downside is that these often cost money
to use and git pod isn't free but it's
an option if you absolutely cannot get
any of the installation working so if
you go ahead and you hit this opening
git pod button you'll get a welcome to
git pod showing up uh we're going to go
ahead and continue with GitHub since
you've signed up for GitHub here you
want to go head and authorize git
pod and it'll go ahead and start
creating this workspace for you and
you'll notice it looks exactly like
Visual Studio code since I opened the
repo up in gitpod it came with all the
code and you can even open this
workspace up in vs code desktop so this
is might be a little bit confusing but
basically you can run off of git pod
using your local Visual Studio code and
if you see G pod here that's how you
know that you're running off of git pod
if you see this popup do you want to
open this workspace in vs code desktop
you can hit open and it'll ask you if
you want to open up visual studio code
which I'm going to go ahead and hit yes
and you'll get something that looks like
this on your Visual Studio code it'll
tell you that it wants to install the
git pod extension and then open that git
pod URL so you can go ahead and install
it reload window and
open and it's going to go ahead and
start connecting to our the git pod
workspace and this is going to be the
same as running git pod in the browser
here or you can also do it manually by
hitting the git pod in the bottom left
and then type in open in vs
code and then you should be able to run
it in your Visual Studio code for now
I'm going to recommend that if you're
using git pod just stay in the browser
just so that you know okay I am running
this on a remote server and just as a
reminder for you that you're not
actually locally developing and
hopefully this will be a trigger to not
actually put any special private keys or
anything like that but you can make
workspaces you can make new folders and
you should be able to run all the
commands on here as if you were running
locally with Visual Studio code to open
up the terminal you hit this little bar
in the top left go to terminal new
terminal or use control Tilda exact same
as Mac OS and Linux keyboard shortcuts
to create a new folder we can change
directory CD do dot
mkdir new folder mkd makes make
directory called new folder and then
we're going to change our directory into
new folder and hit enter and now we're
in that new folder for each section you
can either open up the entire source
code right into gitpod or you can create
a new folder for each section yourself
and start from blank and then you would
just type code period
and you'd be in a brand new
folder and if you're using Windows this
should say WSL or yuntu or something
like that and if you have all that that
means we're ready to go now a quick note
something that you'll see me do a lot
and you can do this as well often times
when my terminal gets really really big
or there's a ton of commands in here
gets a little bit overwhelming for me so
one thing that you can do is you can
type clear and hit enter to clear it or
what you can do is you can hit command K
if you're on a Mac or control K if
you're on a Linux or a Windows and it's
one of my favorite keyboard shortcuts
that I use all the time Additionally the
trash can and the X here are very
different if I go do a couple of enters
here and we're down here if I hit the X
here and then pull my terminal back up
by doing the toggle or by doing terminal
new terminal you'll see all those lines
are still here but if I hit the trash
can and then pull the terminal back up
you you'll see it actually refreshes M
has a special command that prints stuff
out trashing your terminal is basically
deleting whatever is running in it and
the x is just hiding it and it's hitting
control Tilda or toggling our terminal
or whatever command it is on your
environment that's equivalent to hitting
the hide not the trash so if we want to
remove and start a terminal over we hit
the trash can and then we pull it back
up
so after we have that set up the next
thing that we're going to want to
install is actually Foundry itself in
The Foundry book you can find this in
the installation tab or you can go to
get found. sh and it'll have this
command that you can actually just go
ahead and copy Windows users we're going
to teach you how to do it the Linux or
Mac OS way so just stay tuned so we're
going to go ahead and copy this and run
this command again we can go terminal
new terminal and there are also some
shortcuts to do this I'm just going to
go ahead and paste this in here and hit
enter you will need internet access for
this to work because it's actually
downloading Foundry from this website
let me just move this up zoom in a
little bit here and you'll see me do
this a lot in the terminal I'll type
clear a lot to remove anything that's
been coded or output in our terminal
here or you'll also see me do command K
like that which clears the screen when
I'm typing in the terminal you'll see me
hit control w a lot which actually
removes
the most recent block of code you've
written you'll also see me do control U
which deletes the entire line so I'm
going to use command C for copy and
command V for paste a lot for those of
you on Windows and Linux it might be
control C and control V and if you're
unfamiliar you can Google the keyboard
shortcuts for for copying and pasting
for Windows or Linux if you're on a
Windows these keyboard shortcuts might
be a little bit different we've got a
list of keyboard shortcuts in the git
repo associated with with this course
but if you just run that curl command
you'll see an output at the bottom down
here that says something like detected
your preferred shell is whatever your
shell is here and added Foundry up to
path run Source or simply start a new
terminal session to use Foundry up and
once you run that we can go ahead and
run Foundry up and this will actually
install an update Foundry to the latest
version now whenever we want to install
an update Foundry we can just run
Foundry up like this it'll automatically
install everything and Foundry comes
with four components Forge cast Anvil
and chisel we'll know we've installed
these right if we run Forge D- version
and we'll see an output that looks
something like this now something
important to note if you hit this trash
can in the top right this actually kills
the terminal it's different from the X
which is just close the panel we close
the panel and then we reopen our
terminal by hitting terminal new
terminal like this this actually creates
a new terminal which we can kill
like this but our old terminal is still
up in order to actually delete this
terminal we have to hit the trash can
now you want to try this out now delete
your terminal like we just did open up a
new terminal and run Foundry up if this
doesn't run we might have an issue with
your path and you might need to add
Foundry to your path if this is an issue
that you have please make a discussion
on the GitHub repo assed with this
course or check please first check this
lesson six of the GitHub repo associated
with this course and we'll add some
debugging tips to make sure that that
does indeed happen or if there is no
debugging tips here make a discussion on
the course but first be sure to check to
see if that discussion already exists
and you should be able to do Forge D-
version however what can happen is if
you trash can the terminal and open up a
new terminal if you run Forge D- version
now it might say Forge command not found
this means that you have to rerun this
command this Source command that Foundry
told us to do if you're working with
bash most of the time this bash RC file
automatically gets loaded but sometimes
it actually won't depending on what your
setup is if this happens for you another
thing that you can do is you can type CD
and go to your home directory and type
this line Echo source and then whatever
Foundry up told you to do double carrot.
Bash profile and hit enter for example
when we just ran Foundry up right here
it gave us this command here this Source
users patrick. bashrc that's what we
would want to Echo however this will
change depending on your terminal setup
so look to the GitHub repository for the
command that you should be using for
your setup please make a discussions
thread if one does not already exist
what this will do is it'll add this
command to the end of your bash profile
make sure you do double like this
otherwise you could override whatever is
currently in your bash profile now I'm
going to give you a command that if you
screw up you could accidentally override
some stuff if you've never used bash
profile before you kind of don't have to
worry about it though the other command
you can run is something like this if
you do get an issue we can just ask an
AI something like how do I get my do
bash RC to load by default and there's a
couple of different ways for this
depending on what system using and what
you're working with all I'm going to say
though is if this happens to you if you
run Forge D- version and instead of
getting an output you get something like
command not found ask an AI or come into
the discussions of the channel and as
people run into this we'll build and
start a discussion and if enough people
have issues we'll create a new file here
to help people debug that issue so what
it looks like chat gbt does give a
pretty good output of what we can do we
can edit our bash RC our bash profile
our profile Etc and work with it like
that so if you run into that issue
there's plenty of things we can do to
fix it don't worry but if you're a
little nervous feel free to use the
discussions channel of the course got it
okay great if you see an output like
this you've done it right if you see an
output like we don't know what you're
doing you've done it wrong all right
great and again installing these can be
some of the hardest parts of this course
so don't get discouraged if this doesn't
work right away if it worked right away
for you that's actually amazing
now also the control back tick shortcut
toggles the terminal visibility between
up and down I also have command J as a
toggle for panel visibility as well this
is a key binding that you'll see me use
pretty often because we often will flip
back and forth between the terminal and
our code which is going to be up here in
fact if we click this explore button on
the left we can select this area select
new file do something like
hello.txt or better yet hello. Soul
we're going to add some code in here
what's important to know is if you see
this white dot in the top section here
this means that this file isn't saved
command s or controls depending on if
you're on a Windows or Mac or Linux will
save it and make that white dot go away
unsaved saved unsaved saved it's
important to recognize if a file is
saved or not because if it's not saved
it might not do what you think it should
do so I kind of by default will always
automatically save by hitting command s
and it's a good practice to get into
just always autosave everything you do
we can also delete this file we just
created by right clicking it and
selecting delete move to trash final
thing that we want to install and we'll
install a lot of these as we go along is
actually an AI extension something in vs
code to help us actually have ai inside
of our Visual Studio code if you select
this little box looking thing that says
extensions you get a search box box
which allows you to search for
extensions the AI that I work with the
most is GitHub co-pilot but you can use
whatever AI you want or you could just
not even use an AI get a co-pilot does
cost money to use so feel free to also
not use it there's some other free vs
code extensions that use AI so feel free
to browse around and choose which one
you like for me I'm going to go ahead
and install GitHub co-pilot you'll get a
little guy in the bottom right for your
vs code that will let you know that
you've done it correctly you'll need to
sign into GitHub which is something that
we've recently made in order for it to
work now you'll see me using GitHub
co-pilot pretty often when I write my
code because I have this little doad on
down here I can start writing some code
and GI up co-pilot will start giving me
suggestions as to what I should write
for example if I were to add
spdx by since identifier get up copilot
actually automatically starts to gray
out and give me a suggestion if I tab I
can autocomplete my code with GitHub
copilot suggestion alternatively what I
could do then for example I could keep
coding and I can see it's already giving
me a suggestion here and if I hit upkey
enter I'll actually open up this bit on
the
side where get up co-pilot will give me
a ton of different solutions on what it
thinks I'm trying to write and I can
just pick one of these Solutions
obviously some of these aren't doing
anything we'll learn about about the
command pallet soon and we can also use
any of the GitHub co-pilot commands that
come with the command pallet an
alternate to vs code is a tool called
VSS codium so VSS code is a tool that's
owned by Microsoft and it sends up
Telemetry data up to Microsoft so
basically it can send data about ways to
make your experience better with vs code
for people who have a more security
mindset this is an open- sourced version
of vs code that I highly recommend you
check it out another extension that you
might want to add is GitHub co-pilot
Labs get up co-pilot Labs has AI
features that are experimental so it
might be worth installing as well all
right fantastic at this point you should
be 100% set up with Visual Studio code
and git if you're using git pod that's
great as well and if you're using
Windows you should be 100% using WSL
because the rest of the commands are
only going to work if you're using WSL
and we're only going to be working with
Linux bash or zsh commands moving
forward if you want to be a Hardo like I
was saying do everything in Powershell
that's great too moving forward what I
want you guys all to do is open up your
terminal the different ways I showed you
and create a folder by typing in mkd
foundary hyphen f23 and then you do CD
foundary f23 you'll notice something
else I do a lot is I'll type the first
couple letters of the folder I want to
go into and then I'll hit tab which will
autocomplete a lot of stuff for you in
the terminal sometimes it doesn't work
you'll get better at figuring out what
Auto completes and what doesn't I hit
enter this means I'm now inside of my
Foundry
f23 folder and I can run commands inside
of this folder moving forward I want you
to put all of your repositories inside
this folder this way moving forward in
the future when you start actually
working on projects in real life you can
refer back to this folder and refer back
to code that you wrote and refer back to
your notes to make sure that you
understand stuff moving forward we've
got git D- version Forge D- verion we
have cast d D version which cast came
with Forge and Foundry we have Anvil --
version and we also have chisle D-
version I'm going to type clear or hit
command K to clear everything in the
terminal and all right now that we have
everything set up let's go ahead and
start creating our simple storage
project in a professional environment
this is going to be the exact same
environment that the big protocols use
these are the environments that Unis
swap a curve Etc these billion dooll
groups use you are learning the exact
same tools as them additionally for
those of you who are interested in
security and auditing Foundry is the
most popular tool amongst Auditors so
for those of you who want to become
security researchers you're going to
learn the exact same tools that the best
of the best use you ready I sure am so
let's go ahead and create a new folder
inside of this folder here to do this
we're going to type
mkdir foundary simple storage f23 and
then we're going to CD into Foundry
simple storage f23 and you'll notice I
hit tab there to autocomplete again now
everyone's terminals are going to look a
little bit differently mine tells me the
exact path of the folder that I'm in but
I have a Alias called video shell which
just shows me the current folder that
I'm in and I'm going to use that for the
rest of the video so if you see my
terminal look like this it means I'm at
this location now if you're inside of
this folder you can actually type in
code and then hit a period and then you
should get a new Visual Studio code
which is now defaulted to that folder if
you don't you can also hit file open
folder and select the folder that you
want to open which will also open up a
new Visual Studio code inside of that
folder if you open up your terminal now
you'll see that we are indeed in in the
folder for this project and now on the
left hand side over here this Explorer
piece we create a file you'll see it pop
up in the left hand side of our Explorer
touch is a command to create or touch a
file and we go ahead and click it and
type stuff in this file now all these CD
and mkd and all these commands are known
as bash or zsh or like Linux terminal
commands and we're going to be using
them a lot throughout this course if you
want it's a great lesson on working with
bash and CCH and Linux commands on the
free Cod Camp YouTube but at the same
time most of the time chat gbt and most
AIS are actually very well-versed in
bash and Linux commands so anytime you
have a problem doing something you can
often just ask one of these AIS and it
can help you out as of recording this
one just came out a couple weeks ago so
it's incredibly up to date so if you
want to get the basics down it's only
about 45 minutes long I definitely
recommend watching this so you can at
least be familiar with some of the power
that Bash has you can absolutely
continue on with the course as is and
just use AI to augment you but for those
of you who want to get more knowledge
definitely check that out and again the
reason I have this- f23 is to let
everyone know that this is associated
with The Foundry
2023 course but awesome we can actually
begin getting set up with our own local
environments similar to that remix VM
that we saw when we were working with
remix we can work with our own local
blockchain and do a bunch of stuff
locally as you can tell by the name of
this project and from what I was saying
earlier this is going to be our simple
storage project but coded with Foundry
which again is a smart contract
development framework that's going to
make our deployments and interactions
with our code much more professional to
get started with Foundry what we can do
is we can open up our Explorer to see
what's in here let's go ahead and delete
high. txt move to trash I'm going to do
my video shell command here which won't
work for you but it works for me what
we're going to do is we're going to run
a command to create a new Foundry basic
project for for us and if you go through
The Foundry documentation this is going
to be basically this creating a new
project section of the documentation and
if you want to follow along with the
documentation you can do that as well
but to do this we're just going to run
Forge in knit like this and we'll see it
created a ton of folders over on the
left hand side for us and if you run
into an error because you accidentally
have some files in here for example if I
run Forge init right now it's going to
say oh it's not an empty directory what
we can do is type Forge init D- Force
period to say let's do it in this
directory hit enter and it's actually
going to give us an error because it's
going to go hey it already has
everything that I was going to do so it
just it's just not going to do anything
but if you have files in here already
you just add this-- Force piece now if
you get a different error about git
Basel is actually going to help us
triage that so take it away and we are
getting this error and this is pretty
common don't worry reason is because
even though git comes pre-install it on
our WSL install we still have to
configure our username and our email so
we can just use this commands change
this one my actual email and now let's
also configure the username after we
have these configurations we can run
that command again P init hello fundry
and if we check this out we have our
first fundry project ready to be used
with all the things we are going to need
and let's walk through what we have over
on the left hand side here so we have
this GitHub slork flows file which we're
going to ignore for now but we'll
explain this later we have lib which
we're also going to ignore for now but
we'll explain later we have script with
a file in here which for now we're going
to go ahead and
delete we have SRC which is where we're
going to put all of our smart contracts
that we want to deploy right now it
comes packed with this counter. Soul
which we're also going to delete move to
trash and then we also have test which
we haven't learned about yet but we will
and for now once again you guessed it
we're going to go ahead and right click
and delete source is going to be the
main section that we're going to be
working with SRC stands for source and
you'll see in a lot of projects this is
where they put all of their main
contracts test is where we're going to
put code to test what's in SRC and
script is where we're going to put code
to interact with our contracts that are
in SRC get ignore is going to be files
that we're not going to push up to
GitHub if we push our code to GitHub
which is going to be really important
get modules we get ignore for Now teach
about that later and founder. toml is a
file that is going to give us
configuration parameters about working
with Foundry and as we go along in this
course we're going to update this folder
because we're going to update how we're
going to work with Foundry now for us to
get started here we're going to add our
simple storage code into the SRC or
Source folder if you close your remix we
can just come on back to the repo
associated with this course we'll scroll
down to to the remix simple storage
select the code base and we'll go here
and just copy all the code in here come
back over to vs code in an SRC we'll
right click new folder simple
storage. paste it in here and hit
save now one of the first things that
you'll notice is this is formatted
horribly it's just all white text this
cute little eth logo comes up which is
really nice but we want to way to
actually format this code correctly so
there are a lot of different vs code
extensions that actually will format our
solidity code for us one of them is the
solidity if we if we simply type
solidity in the extensions bar we'll get
a whole bunch of options that we can use
I'm a big fan of the hard hat solidity
extension even though hard hat is
another framework it also can format our
code in Foundry another one that a lot
of people like is the solidity visual
developer so that's another option if
you want to use that one
and this one by Juan Blanco is probably
the most used on the planet but we're
going to go ahead and hit install to
install this nomic Foundation solidity
vs code extension and if we go back to
our simple storage. soou you'll see it
is now formatted with syntax
highlighting similar to what we saw in
remix if it doesn't automatically
highlight for you here what we can do is
hit command shift p or control shift p
which opens up our Command bar here and
we can type in settings and we want to
open our user settings in Json you can
also hit code and then settings as well
in here and a lot of you might have
nothing in here so what you can do is
you create these little brackets to say
hey whatever is in here is going to be
our new settings and we want to type
these little quotes little brackets and
say solidity like this little set little
colon here some more brackets and since
I'm using GI up co-pilot it's even
starting to give me suggestions which
I'll explain much later but we could do
editor dot but you could paste in this
editor. default formatter NCH
foundation. hardhead solidity I'll have
this code in the repo associated with
this course so you can just copy paste
this if you want to I've got a whole
bunch of other stuff in here so I'm
going to go ahead and delete this though
but that way your solidity code will
default format using that hardhead
extension that we just installed great
additionally this
also isn't formatted very well so we'll
go to extensions we'll type in toml and
we'll install this better toml here
close this now if we go to Foundry doomo
we'll see this is now highlighted very
nicely too great now just remember
whenever you see this little dot here
this means that it's not saved so hit
command s or file save and do that a lot
the other thing that's really good about
us adding that default formatter is in
our code here you know maybe this isn't
formatted very nicely right maybe we
we've got this over here and and this
over here and it's kind of not looking
very nice here if I go ahead and save
without formatting it'll save it here
but what we can do is if we add that
auto formatter now if we do command
shift p again that brings this up this
command pallet up you can also get it by
hitting view command pallet and we type
format document it'll format our code
automatically depending on what
formatter we're defaulting to since we
opened our Json and we defaulted to the
solidity hard hat it'll automatically
format with that if your code isn't
autof formatting that's okay don't worry
about this too much be sure to use AI a
web search and the forums to get your
formatting good the other thing that I
like to do is we'll go over to settings
again we're not going to go to the Json
we're going to open the user settings
and we're going to type in format on
Save and we'll check this box on this
way every time we save it'll
automatically format so if I have this
and I hit save it'll automatically
format my solidity code for me if I
don't want it to format again we open
the command pallet with command shift p
or view command pallet and we can say
save without formatting and it'll save
it see the white dot is gone and it will
not be formatted but I'm going to save
and reformat it because I like it
formatted and just to note we pretty
much never want to open these default
settings Jason so avoid that one
all right great and just with this
little pieces of code and Foundry
installed we can go ahead and compile
our simple storage. Soul right in our
terminal so what we can do is we pull up
our terminal and we can type in Forge
build or Forge compile and this will
compile our code like so once we compile
we see a couple new folders show up one
of them is out and this file in out has
all the different information that the
remix compiler would have for example it
has the ABI we go back to remix we go to
the compiler tab we go to one of our
contracts we scroll down we can see we
have the ABI section or it's also in the
compilation details in vs code we can
even click this little drop down thing
next to it and it'll minimize the ABI
and we can see the rest of this stuff
like B code method identifiers and all
this other stuff which we'll learn about
later we also get this cache folder this
is a folder that you could basically
ignore now anytime in our terminal we
hit up we can actually cycle through
commands that we've recently run so if I
run some crazy long command like this
Echo here which is a bash command don't
worry about it and I want to run it
again I can just hit
up all right great so one of the things
that we did in remix quite a lot was we
deployed our code to a remix VM or a
JavaScript virtual environment we want
to be able to do the exact same thing in
Foundry in order to test and interact
with our contracts Foundry actually
comes built in with a virtual
environment in the shell and if you run
Anvil you'll get an output that looks
and we pull this to the top you'll get
an output that looks something like this
Anvil and we get some fake available
accounts with some fake private Keys
you'll also get a wallet pneumonic the
derivation path which you can ignore
some details about the blockchain and
then this endpoint or RPC URL which
we're going to learn about soon for now
if you want to close this hit contrl C
or just delete your terminal to end
running the Anvil blockchain now moving
forward we're going to work with Anvil
but I do want to give you an
intermediary step that's going to be
with the ganach eth chain and we'll have
a link to this in the GitHub repo
associated with this lesson ginach is a
oneclick blockchain and gives us a user
interface or an app for us to look at
our transactions in an easier way so if
you go ahead and download it for your
system we can get started there now a
note for Windows users if you're using
WSL the setup here is a little funky we
ran into some issues with it in our
previous course and we'll have some
troubleshooting tips for those of you
who are using Windows and WSL if you
want to work with ganach everything that
we're going to be doing moving forward
though does work work with Anvil ganach
just allows us to see transactions a
little bit better than viewing all this
stuff in the terminal so if you're
having a hard time with ganache don't
worry we can do everything that we're
doing with Anvil which should work for
you no problem once you have ganach
installed when you open it up it'll look
something like this and if we hit quick
start for ethereum we'll actually create
a brand new locally running blockchain
with a nice little UI to view things
same as Anvil and same as REM we get
some addresses we get each of them has
balances they come with some dummy
private keys and dummy addresses and the
likes what's nice about this is that we
can see the blocks we can see different
transactions and if we're working with
truffle we can see contracts we're not
going to work with truffle though but
these are going to be very helpful for
us to view stuff additionally we're not
going to use ganache again in the future
so if you have trouble setting up with
it don't worry just use Anvil I'm going
to use it to show you what's going on
remember though
don't use these private keys on a public
blockchain it's for development purposes
only because everyone knows these
private Keys cuz they're dummy private
Keys now in order for us to learn how to
actually deploy to this blockchain or
how to deploy to Anvil if we're working
with Anvil we need to understand how
even remix was able to deploy to a
public blockchain when in remix when we
switch to injected provider of metamask
we know that metamask popped up it asked
us to add our password and we went ahead
and got connected and if we looked in
metamask we saw our account is indeed
connected to saoo when we hit deploy our
Rass popped up again and it was able to
deploy our contract to a real test
Network well how did it know where to
send our transaction how did it know
where to send our contract well let's go
ahead and open up our metamask here if
we click the three little dots and hit
expand view we hit the little button now
and we go to settings and we go to
networks you'll actually see in here
that each one of these Networks ethereum
mainnet Gil sapoia Linea or whatever you
have comes with a whole bunch of
information let's go to eth mainnet and
check that out for a second it has a
name an RPC URL a chain ID currency
symbol and block Explorer this RPC URL
is the actual https endpoint that we
actually send API calls to when we're
sending transactions so whenever you
interact with metamask and you send a
transaction or you deploy a contract
you're actually making an API call to
whatever is in here you'll see this is
an infura endpoint and infura is known
as a node as a service project that
allows you to send transactions to a
blockchain node without having to run
one yourself if you wanted to send
transactions to your own blockchain node
you would just Swap this out with your
own blockchain node address we can't
actually change the ones that come built
into mamass but we can add new networks
which is what we're going to do now in
here if we scroll to the bottom we can
hit add Network manually and we can add
information about our own custom Network
so for us we're going to make this new
network called local host or local chain
or whatever you want to call it for RPC
URL if you're working with ganach it's
going to be this RPC server right here
if you're working with Anvil at the
bottom we have this listening here so
what we would do is we would copy this
or we would copy this from ganache and
paste it in here just note that you
always need the HTTP or https col slash
most of our local applications aren't
going to be https they're just going to
be HTTP so if you're working with ganach
let's go ahead and copy the ganach
endpoint paste it in here like so every
single blockchain gets their own chain
ID it's an easy way for us to know which
blockchain that we're interacting with
gach has 1337 and Anvil doesn't say it
but it's 31 337 so Anvil is
31337 since I'm using the endpoint here
I'm going to typee in 1337 if you're
using Anvil it would be
31337 but what's kind of nice is
metamask can actually identify what
you're using and identify the chain ID
and basically tell you what chain ID to
use just a note it looks like the newer
versions of ganos are using a different
RPC server and a different network ID
and make sure you're on this hard for
the merge here as well although in
practice I've found that even when you
have
5777 it still is expecting 137 7 so be
sure to use the correct chain ID when
you're working with this currency symbol
we're going to do eth and since this is
a local blockchain we don't actually
have a block Explorer ether scan has no
way to connect to our own local
blockchain so we don't get a block
explore for this one but if I go ahead
and hit save now it says Network added
successfully and I can go ahead and
switch to my local host chain boom and
now we can see it in my list of networks
of Local Host I've got no asset no nfts
and no activity now if your local Anvil
or ganache chain isn't running after
you've put it in your metamask if you
actually try to swap to your Anvil or to
your local host or to your ganache
you'll just get this spinning wheel of
death here right and eventually you'll
get this little a that'll show up and
you'll have to switch to a different
network so if you ever want to switch to
one of these that isn't running it won't
work you'll have to either run it or you
can hit X here and then in your metamask
you could just delete one of these right
here while while we're not running our
ganache or our Anvil we're just not
going to have one of these selected
great and so this is where on both Anvil
and ganache they have these available
accounts in these private keys since I'm
using ganache what I can do is I can
select this show Keys copy this private
key and import it into my metamask so I
can go up hit this little button I can
hit import account paste my private key
in here and hit import now you'll see in
my menas I have a couple different
accounts account three the one I just
imported has 100 eth why does it have
100 eth well because I'm using one of
these dumm accounts from ganach and
again if you're using Anvil they have
they start with a th000
eth this process that we just did to add
our new ganache local chain is also how
we're going to add any evm compatible
chain on the planet we'll just hit add
Network and metamask actually comes
built in with a lot of these and for
example if we wanted to work with
arbitrum 1 we could just hit add and it
would add all this information in for us
approve Network added successfully but
if metamask doesn't have those built in
that's the process now if we go back to
settings network Local Host this
endpoint is the most important thing you
need to send a transaction to a
blockchain you need a connection to a
node in order to send transactions to if
you wanted to send transactions to your
own node you would run something like G
which is an execution client and then
something maybe like teu a prism which
is a consensus client and send
transactions there I'm not going to go
over this right now but I highly
recommend that those of you who are
curious maybe you take some time and you
try to run your own ethereum node I run
many ethereum nodes and it's a lot of
fun that's kind of a weird thing to say
it's fun to run nodes whatever it is fun
to run nodes each one of these
blockchains has different methods you
could send to them to do things if
you're familiar with apis and HTTP
endpoints and you go to this ether eum
jsonrpc
specification site you can actually see
all the different methods that ethereum
blockchain nodes can make and most evm
blockchain nodes can make and when we
actually sign and send transactions it's
these calls that we're actually making
like e sign sign transaction send
transaction send raw transaction Etc
we're actually not going to be going
over interacting with these because
Forge actually handles a lot of sending
these transactions itself if you want to
learn how to send a raw transaction
making raw API calls to your own
ethereum node or an ethereum node as a
service like infura or Alchemy you would
do that in a different programming
language like bash python or
JavaScript all right awesome now that we
have our endpoint and our private key we
pretty much have everything that we need
to deploy to our own local blockchain be
it ganach or Anvil same as working with
a real blockchain we need an actual
balance to spend gas to deploy our
contract now there's actually two ways
that we're going to learn to deploy
contracts and the first way is actually
with just working with the command line
if we're in our command line if we're in
our terminal here and we do Forge d-el
we can actually see all the different
commands that Forge comes built in with
the one we're going to be working with
right now is this create command and if
you read it it says it deploys a smart
contract which is perfect that's exactly
what we want to do and if we're in our
Command here let's hit clear and we do
Forge create d-el we can you see a ton
of different options for deploying our
contract click show Keys copy the
private key again if you're using Anvil
use the private keys there if we do
Forge create simple storage which is the
name of our contract it'll compile and
then it'll throw an error actually or it
might actually work but because I'm
working with this RPC server but this
RPC server is different from the one
that Forge actually defaults to so
instead what I can do is Forge create
simple
storage-- RPC URL copy this paste it in
here it might be upset with the
uppercase so let's just make that
lowercase and I'll hit enter and this
won't work either well of course we
forgot to add a private key so if I hit
up I can hit--
interactive as well and now it'll prompt
me for a private key now and a really
important note that I want to tell you
never use a real private key in your vs
code if you're using an application that
potentially will send your information a
much better option is to use your own
terminal as opposed to something like vs
code which might send data or get pod
since we are just developing and we're
just practicing it's fine to paste our
private Keys here because this is a
private key that's not going to have any
real money right it's a fake private key
so for now we can go ahead we can go
back to our ganache or back to our envil
hit show Keys copy this private key key
paste it in here it won't show up if you
hit paste but I'll hit enter and we'll
go ahead and see information about our
transaction now if you're working with
ganach we can now hit done here we go to
blocks we see we created a new block we
go to transactions we can see that we
sent a transaction and we created a
contract and then you can see logs about
working with this as well fantastic if
you're working with Anvil and you send a
transaction you're not going to see any
of those details for those of you who
want to continue to see these blocks and
these transactions and want to keep
working with ganach feel free to do so
moving forward we're going to work with
Anvil so I'm actually going to close
ganache now I'm going to hit clear in
the terminal and I'm going to run Anvil
here and what I'm going to do is I'm
going to create a new terminal by
hitting the plus button here and we're
going to run that command again but
we're going to run it with a private key
from Anvil so if we go to here we do
Forge create this time we don't have to
put an RPC because Forge defaults to the
Anvil one but I can say simple storage
inter active it'll do enter the private
key I will paste it and we'll go ahead
and deploy go to Anvil we don't get any
logs like this but we can see we went
ahead and actually deployed it to our
Anvil blockchain awesome work another
way we can do this Forge create is by
running Forge create simple storage if
we wanted to be incredibly explicit we
would do D- RPC C- URL copy this
HTTP col paste it in there-- private key
and back in Anvil copy the private key
paste it in like this and we will get
the same
thing now here's what I'm going to tell
you and this is incredibly important
pasting in your private key like this is
no bueno very bad we pretty much never
want to have our private key in plain
text
especially our production or our private
keys with actual money putting this
private key in PL Tex is not a big deal
because this is a fake dummy one it's
also bad to have our private keys in our
shell or bash history if I hit up once
on my terminal I can see the private key
in here which is why the interactive is
a little bit better because it at least
offis skates the private key to remove
your private key from your history in
bash you can do history- c now if I hit
up I can't see any commands and if I do
history I can see my entire history
which is just the history keyword now if
I type clear I'll do history now I see
history clear history great and we don't
have the private key in our Command
history anymore we will learn more about
proper private Key Safety in the future
but I want you to do something for me
right now in a new file I want you to
rightclick and I want you to write
promise. MD we're going to hide the
terminal and in here we're going to say
I promise to never use my private key
associated with real money in plain text
in fact take this and tweet this I
promise to never use my private key
associated with real money in plain text
and I can't spell and that's fine and
then if you want to add me or you want
to add cyron audits or whatever go ahead
and send that we are going to have more
of these promises that you're going to
do but this is the first one that I need
you to understand right now it's cool
because these are dummy keys but in the
future it will definitely not be cool
and I'm stressing this because I've seen
a lot of multi-million dollar companies
not follow this and get their private
Keys hacked great now of course though
the basic way to deploy to any
blockchain would be Forge create the
name of your contract add the RPC URL
and then add your private key we're
going to learn how to get RP crls for
free using Alchemy for any blockchain
that we want and like I said more safe
private key methodologies in the future
but now you've just learned how to
deploy your contracts to any chain from
the command line this is
great all right great so now we've
learned how to actually deploy a
contract to any blockchain that we want
using the command line now I'm going to
teach you the second way we're going to
deploy our contracts and and this is the
way we're actually going to do it for
the rest of the course when we're
deploying our code we want to make sure
we have a continuous reproducible way to
deploy our smart contracts and when we
test our code in the future we want the
tests to test the deployment processes
as well as the code so instead of just
doing the command line we're actually
going to write a script for us to deploy
our code and because Foundry has
everything written in solidity this
script that we're going to write to
deploy our code is also going to be
written in solidity and this is where
solidity as a contract language versus
solidity as a scripting language is a
little bit different Foundry has a whole
bunch of built-in stuff to give our
solidity even more functionality outside
of just smart contracts and you'll learn
about how later in the course but for
now we're going to learn how to create a
script to deploy our simple storage
contract and the way we create a script
to do it is first we come to our script
folder we'll rightclick new file we'll
create deploy simple storage.
s.o this S.L is just a Foundry
convention most of the time scripts have
a s doou instead of just being doou and
in here we're actually going to write a
contract in solidity to deploy our smart
contract which sounds a little bit weird
but don't worry too much about that this
deploy script is going to be written in
solidity but it it shouldn't be
considered a contract that we actually
ever want to deploy it's just for
deploying our code but it is written in
solidity so since it's written in
solidity we'll do the same thing as
usual spdx license identifier MIT and if
you're using GitHub co-pilot it might
even Auto suggest like this and I'm just
going to go ahead and hit tab I'll do
pragma solidity
0.818 and then I'll create contract
deploy simple storage like so and I'll
hit save if you go to The Foundry docs
we can actually scroll down to this
solidity scripting section in the
tutorials and you can learn how to
actually write scripts and work with
scripts the first thing that we need to
do in order to tell that Foundry that
this is a script is we need to actually
import some additional code now one of
the things that we saw in here was this
lib folder and this lib folder actually
starts with another folder called Forge
STD this Forge STD stands for Forge
standard library in here there's a ton
of helpful tools and Scripts for working
with Foundry and to tell Foundry that
this contract deploy simple storage is
actually a script we need to import from
Forge STD so we're going to do import
Forge
dstd script. soul and we'll have our
contract deploy simple storage inherit
all the functionality of this script by
saying is script and I know we learned
about inheritance before so you should
know what that means is script and then
additionally our deploy simple storage
is is going to need to know about our
simple storage contract so we'll go
ahead and import that import we'll go
down a directory since we're in the
script folder and we need to go to the
SRC folder these two dots is how you go
down a directory we'll do slash SRC vs
code even might help prompt you here
Dash and it again Auto prompted for me
and I hit Tab and now we've imported
simple storage now since we know that
this is the noob way to do Imports we're
going to do the cool way by using named
Imports instead of nameless Imports okay
great now inside every deploy or script
contract we need our main function which
is going to be called run and this is
going to be the command that gets called
when we go to deploy our contract so
we'll create a function called run we'll
make it external and we can have a
return a simple storage contract and in
here we're going to use a new keyword
that we haven't used before we're going
to say VM start broadcast VM is a
special keyword in the Forge standard
Library the VM keyword is a special
keyword that we can only use in Foundry
it's related to something called cheat
codes we're not going to go over that
too deep right now you can see a whole
list of Foundry cheat codes in the
documentation and Forge standard Library
references which have even more cheat
codes as well this VM stuff is only
going to work in Foundry if you actually
were to try to deploy this in remix or
some other framework it wouldn't work
these VM cheat codes only work in
Foundry it's not valid in regular
solidity but if we're inheriting Forge
STD code this VM keyword exists if
you're using the hard hat solidity
extension we can actually control or
command click into VM and we can
actually see where it's defined but if
that's confusing ignore that for now
this vm. start broadcast says hey
everything after after this line inside
of this function you should actually
send to the RPC and then when we're done
broadcasting we're going to do vm. stop
broadcast so everything inside of these
is what we actually want to send and
deploy the reason we have this is
because maybe we have some stuff like we
want to set some boilerplate code before
we actually send transactions and we
don't want to spend any gas to like set
starting value to one right so any
transaction that we want to actually
send we need to put in between these vm.
start broadcast and vm. stop broadcast
and for us to deploy our simple storage
contract we just do simple storage
lowercase simple storage right these are
different simple storage the variable
simple storage the contract equals new
simple storage like this and remember
what does this new keyword do well the
new keyword creates a new contract in
solidity it's also going to create a new
contract in between our VM dostar
broadcast this being in between these VM
dostar broadcast is going to send a
transaction to create a new simple
storage contract if this is a little bit
confusing for you right now that's okay
it's going to make more sense as we go
on later in the course but for now just
do this and follow along with me and
then of course we can say turn simple
storage okay great now if we pull our
terminal back up
we can see we have Anvil running right
now we can actually kill it with contrl
C we'll clear to the top and what we can
do now is run Forge script script deploy
simple storage. s.o hit enter and look
oops looks like I got some different
solidity versions let's change this to a
carrot in here let's change this to a
carrot in here this being an 18 so that
they're both on the same version let's
type clear close these or minimize these
out we'll hit up twice and we'll run
this again and now what you'll see is
it's compiling it compiles both the
script to deploy and our simple storage
contract using 0.8.9 because we did the
car compiler successful script
successful tells us the gas and then we
went ahead we returned our simple
storage contract which was deployed here
now you might be asking wait wait wait
wait Patrick we we don't have Anvil
running we don't have a local blockchain
running where did this deploy to well in
Foundry if you don't specify an RPC URL
it'll just automatically deploy your
contract or run your script on a
temporary Anvil chain so once I ran
Forge script it saw there was no RPC URL
so it spun up a temporary Anvil
blockchain deployed our simple storage
and then tore it back down at the end
you can see at the bottom if you wish to
simulate on Trin transaction pass an RPC
URL so if we do clear we run Anvil and
then create a new terminal we could run
Forge script script deploy simple
storage at s.o and I'm hitting tab to
autocomplete that-- RPC URL go back to
Anvil copy this go back to bash
HTTP slash we actually almost deployed
this to the blockchain we actually did a
simulation of deploying to our chain
here it gives us one more piece of
information to broadcast these
transactions add-- broadcast and wallet
configurations to the previous command
and now we get a new folder which gives
us information about our previous
deployments in case we forget for
example if we deploy a contract we can
flip back here and see where we actually
deployed code so let's pull up our
terminal once more and actually deploy
this to the blockchain so we'll hit
clear I'll hit up we have our RPC URL so
now let's do D- broadcast and we'll do
D- private key and we'll grab a private
key from Anvil and paste that in here
and hit enter boom and we see at the
bottom onchain execution complete and
successful we see we get some
transactions here we waited for receipts
Etc so fantastic so we learned how to
actually deploy our smart contracts
through these script in command now
awesome
job now let's learn a little bit more
about what actually just happened right
because right now sending transactions
is still kind of this magic thing right
so let's hide our terminal and let's go
up to our Explorer let's pull this out a
little bit and let's go into here now
what's important to note is that there's
actually a couple different folders in
here dry run is the folder whenever we
don't have a blockchain running
otherwise this gets separated by
chain ID and we'll talk about this a
little bit later but if we go into one
of these either dry run or or even just
run latest we'll see details about the
transaction we'll see a hash transaction
type contract name address blah blah
blah this right here this transaction
section is actually what is getting sent
on the Chain when we do Forge script or
Forge create this is the transaction
that we send to that RPC URL right this
is the API data if you're familiar with
https post this is the data that we
actually sent send we send the type
which for now just everything is type
two because we're in the merge don't
worry about type one for now we have a
from which is of course the from address
that we want to have we have a gas here
and this is the hex value of gas now if
we pull our terminal back up we'll clear
this out I'm about to show you an
amazing trick that's going to make your
life a lot easier Down the Line cast
actually can convert between hex and
numbers really easily and cast comes
built in with Foundry we do cast D- to
base paste our hex in here and write DEC
for decimal it'll convert this hex value
to its decimal value 0x 714 C2 whatever
is just this number and I use this cast
to base all the time you can put some
value in here and then what you want to
convert it to and it's a very easy way
to see what some value is there's some
other stuff in cast as well if you do
cast d-el there's some other ways to
convert different units to each other
like from way spites 32 and some other
stuff but two base is going to be one
that we're going to use a lot so we have
the gas we have the value with the
transaction yes since deploying a
contract is just a transaction we can
add a value to it if we want in our
deploy script right in here we would
just do some brackets we would say like
value and like one ether if we wanted to
deploy this with one ether we can't send
a value here because in solidity you
can't set the option value if the
Constructor is not payable we'd have to
make the Constructor payable but we
could send value just like any other
transaction there's this huge data piece
here this is actually the contract
deployment code and the contract code in
here we have the nuns which is going to
be that number that's only used once and
then don't worry about access list for
now but this is all the transaction
information and then of course we have
our RPC now what's not stored in here is
is a couple other pieces of the
transaction and additionally there are
these v r and s values that count for
the transaction signature it's not
getting saved here because it's
technically part of this from anyways
they're public values and these RS andv
allow our private key to sign the
transaction so what's really happening
when we send this the reason we need our
private key is we need the private key
to actually sign the transaction that we
built and that's happening a little bit
under the hood so whenever we send a
transaction there is a signature
happening we are signing a transaction
and then we are sending it and that's
important for later in the course they
don't save it here but signing the
transaction does happen when you sign a
transaction it's very similar to doing
that hex thing we showed you way way at
the beginning of the course with the
blockchain only the private key can sign
the transaction this is how when we send
our data to a node it knows that it's
able to execute it because it's signed
by our private key I'm not going to go
too deep into that right now this nuts
piece is a little bit important every
single wallet
has a counter of transactions which is
basically the nuns whenever you send a
transaction you give it a nuns or this
value this number only used once to
basically count your transactions this
is really good because if you want to
replay transactions you would just send
the same transaction data with the same
nuns for example if we have a
transaction that didn't go through
you'll see that this is in this run
latest with the dry if we run this again
if we hit up you'll see that if we run
our transaction again with our Anvil
deployed here we'll actually deploy
another transaction if we go back to our
broadcast folder we see there's actually
two runs and a new run latest if we go
to our run latest now you'll see that
the most the latest run now has 0x1 so
this increments every single time we
send a transaction your nuns increments
every time you send a transaction and
again contract deployments are
transactions now we went over a lot of
stuff in here but the most important
takeaway I want you to have from this is
anytime you change State on the
blockchain it does it in a transaction
and the differentiator is going to be
what's ever in this data field this data
field contains the op codes to tell the
blockchain hey I'd like to create a new
contract we're not really going to go
too deep into what these op codes are or
this evm bite code we'll briefly talk
about op codes later in this course but
if you want to really learn about op
codes and assembly we have another
course on security coming out that we'll
go over that but this is the most
important thing to take away when we're
in remix and we're sending transactions
with these buttons we're doing the exact
same thing we're populating the data
field of a transaction but instead of
the data being associated with creating
a contract the data is associated with
sending a
transaction right great now that we've
actually deployed our contracts though
we should learn how to interact with
them in the same way that remix allows
us to interact with them with our
buttons here now there's two ways to
actually interact with our contracts one
is going to be doing what we did before
with scripts but the other way is
actually going to be doing directly from
the command line so we're actually going
to learn the command line Parts in this
project and then we're going to learn
how to do scripts in a later project so
let's pull up our terminal here and just
to make sure that we have this deployed
let's hit up a couple times and we'll
rerun this deploy script now in just a
second we're going to learn how to
actually interact with our contracts
from the command line as well similar to
how remix has all these but buttons that
we can press however first we're going
to make this a little bit better and
we're going to take a couple of
different approaches to not having this
in the command line as you saw before we
could use Forge create interactive paste
our private key in and it wouldn't be in
our command line we actually can't use
interactive for when we're sending
scripts at the moment I'm sure in the
future they'll make it a little bit
easier for us to do this but right now
we really don't want to have to do--
private key and paste our private key in
PL Tex so what else can we do what
alternatives can do we have now what I'm
about to show you once again only do
this for your development environments
do not put a real private key in here
the reason I'm showing you this is
because it is much quicker to test
however it's terrible to use in
production so this is cool for
development purposes this is not cool
for actual production purposes what
we're going to do is we're going to
create a new file called EnV and
whenever you create a EnV the first
thing you should do is go to a g ignore
file make sure that a EnV is in this G
ignore I'll explain what the dog ignore
does in the future but for now just have
that be the first thing you do in our DV
file we can put in what's called
environment variables these are
variables that might be a little bit
sensitive that we don't want to actually
write in the command line or
accidentally expose to the public one of
those of course is going to be our
private key so let's go to Anvil scroll
up grab that private key copy and paste
it in here and we have this private key
equals this typically you'll also see
RPC URL equals what's our Anvil RPC Rel
let this right here so we'll do
HTTP SL slash paste that in there and
great now that we have those in there
what we can do is now run source. EMV
which will add these environment
variables into our shell here and we can
do Echo private key like that and we'll
see our private the key actually show up
like so we can also do Echo dollar sign
RPC URL and we'll see our RPC URL
actually show up like this and then what
we could do is we could go back to our
Forge script and instead of typing in
our private key we would just do dollar
sign private key and dollar sign RPC URL
so now our RPC URL and our private key
at least aren't being run in our command
line so that it's not stored in our
Shell's history the issue of course is
that okay well now we have it stored in
this EnV anytime you have your key
stored in plain text you should be
afraid you should be a little bit
nervous so we can actually take one more
step to make this even more secure and
this is going to be one of the steps
that I recommend that you take when
you're actually working with production
code you definitely do not want to
launch production code with aemv file
and I'm going to summarize all this very
soon just stick with me I promise this
is a little bit boring but it's
incredibly incredibly important that you
get this right and I'm going to try to
prevent you from getting wrecked now
Foundry is a tool that is constantly
being improved and updated and there's
an issue in The Foundry repo right now
called improve wallet management us
using key store I would love a way for
you to actually encrypt your private
keys so that none of you accidentally
push a private key up to GitHub or
expose a private key that it's in PL
text if you run Forge script d-el and
you scroll up you get this wallet
options section where you can actually
pass the path to an encrypted key store
file and a password a key store is a
file that has your private key but
encrypted by a password instead of
having your private key in PL text you
would have it encrypted and you would
just need the password to decrypt it
that is a much safer way to deploy your
contracts I've added some context in
another issue on Foundry as well and if
you all could come in here and give this
a thumbs up that would be fantastic a
way to encrypt your private key into a
key store file natively doesn't exist in
Foundry yet but I've put out a bounty
for someone to actually implement this
so be sure to just check the G up repo
associated with this course to check to
see whether this feature is implemented
so what I'm really trying to get at is
for the moment a private key in ourv
file is cool so long as we don't expose
the EMV file but for real money you're
not going to do that we're not going to
do that okay for real money we're going
to use the dashes interactive to paste
our private key or we're going to use a
keystore file with a password once
Foundry adds that there are some tools
like dap tools e sign that you could
optionally download if you want to
deploy and interact with wallets that
have real money in them and it does have
this import keyword where you can import
your private key into a key store file
and then you would just obviously
encrypt that with a password so for the
moment this is your setup but in the
future this is going to be your setup
okay this is cool now but not in the
future and additionally if you go to The
Foundry full course f23 you go to
discussions and this will also be in and
this will also be somewhere on this side
at some point you'll see this the EMV
pledge which has a whole bunch of
information about working withv files
and keeping your private key safer for
the rest of this course we are going to
be working with this syntax because it
is easier however I'm really hoping that
Foundry in the future adds this key
store encryption by default so that we
don't accidentally expose our private
keys and I'm not doing this to scare you
but I'm doing this to impress upon you
the importance of making sure you keep
that private key and that pneumonic safe
the other reason that we're okay to put
our private key in ourv file is that
you have already promised me that you're
only going to work with a development
private key or a private key that you're
not going to add any real money into so
if you expose it it'll be fine but you
still want to practice not exposing it
so please take some time to read this
and then if you do agree to everything
just say I will be safe as a comment on
this DV pledge so I'm going to read it
out and it's important for you to
understand this moving forward so it's
going to be a little dry here but I am
just going to read it I solemnly swear
that I will never place a private key or
secret phrase or pneumonic in ainv file
that is associated with real funds I
will only place private keys in ainv
file that have only test at eth link or
other cryptocurrencies when I'm testing
and developing I will use a different
wallet than the one associated with my
real funds I am aware that if I forget a
DOT get ignore and push my keyphrase to
GitHub even for a split second or show
my keyphrase to the internet for a split
second it should be considered
compromised and I should move all my
funds immediately this is a really
important line even if you show your
private key to anywhere on the internet
for even a split second it is considered
compromised and you should move all your
funds immediately if I unsure if my
account has real funds in it I will
assume it has real funds in it if I
assume it has real funds in it I will
not use it for developing purposes I
aware that even in my metamask if I hit
create account or add account on my
metamask or other eth wallet I will get
a new private key but it will share the
same secret phrase slne monic of the
other accounts generated in that
metamask these are some additions that I
made from the last course for this
course I will only use funds associated
with my brand new neverbe used metamask
or other wallet and again most browsers
you can choose a different profile and
install a metamask on a different
profile and use that metamask for this
development purpose if I must use a
private key associated with real funds
in the future until I'm 100% sure what I
am doing I will always either use
encryption methods like the DAP tools
keystore file I'm not going to show you
how to work with this because some of
the installs might be a little bit
tricky but they have a way to actually
import and encrypt private keys to a key
store file use the foundaries built in
key store Creator which is an
implemented yet anybody here who is a
rust developer or knows some rust or
wants to participate definitely be sure
to check out this issue which is on
Foundry and I would love somebody to
take a crack at this or if you must use
the command line as a way to pass your
private keys and then delete the command
line history immediately afterwards if I
never actually deploy anything to main
out myself or work with the private key
with real funds I do not need to be
concerned for any of you who are getting
a little bit nervous about this just
remember if you don't work with any real
money you don't have to worry about this
okay so a lot of you people who are who
are newer here who are going to be going
through this course we're not going to
use any real funds so you won't have to
be worried about this for those of you
who are doing the extra credit which is
with real funds you will need to keep
this some mind moving forward and I
would try to load your real metamask
with real money with small amounts so
that if it all gets stolen you won't
lose sleep at night okay great and I'm
telling you all this to arm you with
this knowledge that you can be more
secure moving forward take a look at
this read this internalize it and if you
want to copy paste this on Twitter in a
huge tweet thread shout this from the
rooftops put this in an article make a
tick tock with this Dov pledge have an
absolute blast the more people who know
about this and the more people who
understand this the better thank you for
coming to my TED Talk all right so I
know that was a lot of private key
information and there's going to be more
soon too so but the reason I'm harping
on this is because I really really
really really really want to make sure
that all of you don't actually mess this
up since you are the developers you are
going to be the ones responsible for
dealing with all this and I want to make
sure that you get it
right one final option that we can do as
well which again saves us from having to
have our private key and plain text is
going to be using something like third
web deploy so we actually have Kira from
the third web team team to explain third
web deploy now she is going to use the
MPX command which comes with nodejs and
mpm installation which we haven't gone
over in this course but we will leave
some links in the GitHub repo associated
with this course to download that if
you're interested so take it away Kira
in this video we're going to learn how
to easily deploy any contract to any evm
chain using one simple command this
command requires no setup hardcoded
private keys RPC URLs or scripting
required third web handles all of the
complexities for you because there's no
need to export your private key this is
much more secure the deployment is done
through the dashboard UI using your own
wallet so with that said let's jump into
deploying our contracts so let's say we
have cloned this repo or written our own
contract this can obviously be any
contract at all but I have gone ahead
and cloned this simple storage contracts
just to demonstrate how we can deploy
our contract as you can see in the
sidebar um so yes I've opened this up in
my code editor in the sidebar there is
nov file I haven't set up an RPC URL I
haven't exported my private key there is
no setup needed here I want to reiterate
this you do not need to pre-install
anything there are no dependencies so to
deploy our contract we are going to run
the simple command npx third web deploy
so what this done is detected our
project type which is Foundry and also
could be hard hat or Brownie and then it
has compiled our contract and then it's
allowing me to select which contractor
deploy so I'm going to select the simple
storage contract so this is now
uploading the contract metadata to ipfs
and it means that our contract is going
to be automatically verified if you
would like more details on how this
actually works then please go ahead and
visit the third web developer docs which
you can see here which is at portal.
third web.com SL deploy and you can read
all about how this works so what's
happened now is that a browser tab has
popped up in my browser um and this
allows me to deploy my contract from a
front end so if I had construct prams
which I do not in this case there are no
construct parameters um then I would be
able to fill these out from the front
end right here next what we need to do
is select the chain that we want to
deploy to as I said this can be any evm
network so we can select ones that are
pop such as bass or we could add a
custom network if this is not already in
the list but I'm going to select Mumbai
when I click deploy now this is going to
trigger two transactions the first one
is going to be the transaction to deploy
my contract the second one is going to
be a message which I will sign and this
is a gasless step and this just adds
your contract to your dashboard so that
you have a user interface in which to
interact with this contract a little bit
like
remix so I'm going to click this button
I'm just going to sign these two
transaction Cs and then I will be right
back as you can see our contract has now
been successfully deployed how easy was
that awesome so you can see the contract
address here which we can copy if we
needed to use that later I'm just going
to give you a very quick overview of the
dashboard so there's this build tab here
which just enables you to build your
contract into a front end with easy to
use hooks for different languages uh
Hooks and functions for different
languages uh the Explorer tab allows you
to see all the read and write functions
on your contract so you could add a
person and then input the parameters
here you can store list the people name
to favorite number and retrieve all of
the functions that we wrote in the
contract you can see and interact with
here you can see the events on the
contract and the source code as you can
see this was a super simple easy and
safe way to deploy your contracts using
third web third web is the fastest way
to build web 3 apps we can have sdks in
multiple languages we have pre-built
contracts we have a solidity SDK and
infrastructure for your web3 development
needs for more information please head
to third web.com or visit our
documentation and if you have any
questions please head to our Discord
in any case let's go ahead and let's
learn how to interact with these
contracts from the command line first
and in later courses we'll learn how to
do it from scripts so we have our Anvil
running and we've deployed our contract
using our deploy using at least
something marginally better using
private key as an environment variable
as opposed to just pasting it right in
here so what we can do now is we can
take this contract address and we can
actually start to interact with it
Foundry has another tool built in called
cast and if you type cast d-el you'll
see we get a whole bunch of commands to
work with cast one of the commands that
we can work with is going to be send
which is to sign and publish a
transaction so what we can do is we can
do cast send d-el we can see the help of
send and we can see the arguments it
takes is going to be two the signature
and the arguments so on remix for
example we have our simple storage
contract and we deployed it if we wanted
to call our store function in send the
transaction we would just add some
numbers in here and then click store
like this right if we want to call store
from the command line we can do cast
send the address we want to do the
signature which which for now just know
is the is the function and the input
types it needs so we could call store
with a parthy u 256 because we're
calling the function store which takes a
un 256 as input parameter and then the
arguments or the values we want to pass
to our store function and we'll go ahead
and hit enter of course this fails
because we need to add our private key
and RPC URL so we'll hit up we'll do RPC
URL we'll do dollar sign RPC URL and
then we'll do-- private key and then
private key like that and now you'll see
we'll get all of this data about our
transaction back we get the block hash
block number contract address is blank
probably because it's a local chain logs
we can learn we'll learn about logs
later the transaction hash Etc now in
order to read this we're going to use
cast call which is going to read off the
blockchain and if we do cast call d-el
and we scroll up a little bit we'll see
call takes two signature and arguments
exact same as send but the difference is
it's like call is like doing one of
these blue buttons it's calling as
opposed to sending a transaction it's
just doing a view function not actually
sending a transaction so we'll do cast
call we'll paste the contract address
we'll call retrieve r t r i v r e t r IE
V did I spell retrieve wrong I don't
know I guess we'll find out no input
parameters here and no arguments so we
can just hit enter and we'll see we get
the hex value back this is where I said
you're going to be converting stuff from
hex back and forth a lot then we do cast
d-2 base paste the hex and say decimal
and we can see we get back 1 2 three
which is exactly what we've stored on
chain so if we hit up a couple times
back to our cast send transaction our
cast send command and we change 1 2 3 to
777 we hit enter we'll send that
transaction now if we hit up three time
two or three times we'll call cast call
retrieve now and we should see the new
number which we get back as a hex and
then we'll do cast d-2 base paste it in
deck and we do indeed see 777 returned
to us awesome so now we know how to
actually interact with our contracts
from the command line and this is going
to be the same way we can actually
interact with our contracts on an actual
test net or on an actual main net
all right so now you might be asking
okay Patrick what does this look like on
a test net or a live Network so let's go
ahead let's go to ourv file and let's
update this so that it's aemv file for
an actual test net so the first thing is
we're going to need an RPC URL for an
actual test net for an actual Network
and this is where in our metamasks
actually have inferior connections built
in remember before we went to our
settings networks eum main net we saw oh
we saw we have this inferior connection
we can't use this one because this one's
designed specifically for our metamask
so we're going to have to get our own
RPC URL for an actual test net well one
of the things we could do is we could
run our own blockchain node but a lot of
people don't want to do that so what a
lot of people do is use something called
a node as a service to do this what I'm
going to recommend you do is actually
come over to The Foundry full course
repo scroll down down and there's going
to be a section called deploying to a
test net or a main net if we click this
link we'll actually go ahead and we'll
get sent to the Alchemy platform where
we're going to sign up for a free notice
of service that we can actually send
transactions to and we're going to go
ahead and sign up for their platform you
can sign up with Google sign up with SSO
whatever you want to do I'm going to go
ahead sign in with Google I'm indeed
human we're going to come to their user
interface that looks something like this
we're going to deploy this to sepolia
but remember go to the recommended test
n section of this course so what we're
going to do now that we're in here is
we're going to go ahead and create a new
app and you can name it whatever you
want I'm going to call it tooa testing
I'm just going to copy this for a
description this is on the ethereum
Chain but on ethereum spolia we're not
going to do any advanced features we'll
go ahead to create app and now we have
this ethereum seoa app where we can view
details we can see how often we're
calling this and we can see different
details about our notes Noe and if we
hit view key we see we have this https
endpoint and this is going to be the
exact same thing as that Anvil or ganach
or metamask endpoint that we saw and
we're going to go ahead and copy this
and back in our b v what we could do is
we we can create a new RPC URL called
sepolia RPC URL equals and we'll paste
that in here now we have an RPC that
points to an actual test St with our
private key we can't use this as our
private key because this is in Anvil
private key and it doesn't have any real
money in it and it doesn't have any
testet eth in it but what we can do is
instead we can use our one of our
private keys in our metamask so if we
switch back to sapoia in our metamask we
can pick one of our accounts that
actually has some money in it I'm going
to pick account number one we'll hit the
three little dots Account Details export
private key and remember it's okay for
me to show the private key here because
this is just a dummy private key but
I'll add my password in and remember I'm
never going to actually do any real
money with this and I'll copy this done
and paste this in here and maybe I'll
maybe I'll comment this line out inmv
file this hashtag or this pound sign is
what the comment is but maybe we'll do a
new private key equals and I'll paste
this in here and now I have the private
key for metamask I have the RPC RL and
those are all I need to actually deploy
a transaction so what I can do now pull
my terminal back up so we're going to
run this command to actually deploy this
to a real test net from our Foundry
using Alchemy as our node as a service
and you'll see in the user interface of
alchemy you'll see a transaction
actually come through our node This Is
Us sending a transaction to a real node
and we'll be able to see the stats here
on our Alchemy dashboard so let's go
ahead let's do this again so first we're
going to need to run source. AMV to make
sure all of our AMV stuff is loaded then
we're going to run Forge script script
deploy simple storage. s.o and I'm
hitting tab to autocomplete
here-- RPC URL sepolia RPC URL with the
little dollar sign D- private key dollar
sign private
key-- broadcast if you don't add the D-
bradc it won't actually send it it'll
simulate sending it now if I hit enter
we'll see a compile and now we're
running this script deploy simple
storage. s.o which actually deploys it
and we'll see we went ahead and deployed
our contract simple storage on the
sepolia Chain we see all these details
about it it's sending the transaction
right now it's storing the latest run
under the broadcast folder under its
chain ID in here in this run latest.
Json and after a brief delay we'll see
it went through and what we can do is we
can grab this hash go over to sea.
etherscan.io paste that hash in here and
we'll see we actually successfully sent
a transaction and if we click on our
contract address we just created we'll
see we actually just created this
contract on a real test name we go back
to our Alchemy dashboard and we hit
refresh we'll see we actually sent we
sent some requests we scroll down we can
see some of the different requests we
sent eth send raw transaction was the
request that we sent to actually send
our transaction to the blockchain but we
also got some stuff about the chain ID
fee history
Etc one thing that you'll notice though
when looking at this on ether scan is
that the contract o it's just a whole
bunch of bite code here right this isn't
very readable what we can do is we can
actually verify this contract and now
I'm going to show you the hard way first
and I'm going to teach you the easier
way later but you can manually verify a
contract
on ether scan or other block explorers
by selecting verify going to solidity
this is a single file contract so we're
going to do single file I know that we
were on
0.8.9 and our open source license is MIT
we'll hit continue we'll go back to our
simple storage. soul and we'll copy the
whole contract scroll down we'll hit
paste optimization is going to be yes
there's no Constructor args no contract
Library addresses no Miss settings I'm
not a robot and we hit verify and public
sometimes this can be a little bit
tricky to get right and we're going to
work with programmatic verification
pretty soon that makes it a lot easier
but if we did it correctly what'll
happen then is if we click on our
contract address here and we go to
contract and we scroll down we can
actually see our contract right in ether
scan this will also give access to these
read and right contract buttons which we
can see it now looks really similar to
what's on remix and we can actually
interact with our contract right from
etherscan or another block Explorer like
I said that's the manual way to verify
your contracts and you can run into a
lot of issues doing that so I don't
recommend doing it I recommend doing the
programmatic way which I'm going to
teach you very
soon all right so now we're just about
done with our very basic project here
which is fantastic we've learned a ton
already but there's a couple things we
want to keep in mind here moving forward
and one of those things is when it comes
to formatting so we are using the vs
code autof formatter to Auto forat our
code but if somebody else comes and I'm
going to actually save with without
formatting if somebody else comes to our
code base we're going to want to have
them format it the exact same way that
we format it so what we can do is we can
use the forge format command which if we
run it you see favorite number actually
went ahead and formatt it so I'm going
to save without formatting again run
Forge format and it's going to Auto
format our code here so this is a
command that will automatic format all
of our solidity code awesome and
additionally for every single repo you
ever work with you always want to make a
readme.md file so right click new file
readme.md I actually already made one
over here and this is where you're going
to put information about your project
here I put some notes about the private
key usage which I'm just going to delete
for now readme files are generally where
you put information about your project
instructions to work with it places to
contact you really any information that
another open ource developer should know
when they want to interact with your
project because we are going to push
this up to GitHub as well we're not
going to push this up to our GitHub
because it's kind of easy but in the
next project we're actually going to
push the code up to GitHub and I'm going
to teach you how to do that readme.md
are this markdown syntax remember how we
were talking about answering questions
or asking questions using markdown
syntax well this is going to be the
exact same if I do a hashtag or pound
sign like this and I say hello and then
some text down here and if I hit save
what I can do is I can actually preview
this markdown so in my extensions over
here we're going to look for a markdown
extension actually already have one
markdown allinone or markdown preview or
whatever you want to install and we can
do open up our Command pet with command
shift p or view command pallet we can do
markdown preview open preview like this
and we can see what this looks like as
if it was on a GitHub repo we can see
Hello is Big we can see our text down
here is small and if I were to do like
some back Texs like this I can say like
code here save that look at our preview
again we can see this is formatted now
as code you can also do command shift V
to automatically go to preview mode or
it might be control shift V for Windows
and Linux users there's a lot of
different ways to go preview your
markdown and remember if formatting your
your readme is difficult usually AIS do
a pretty good job at formatting your
markdown for you if you just ask them
politely
now Alchemy has a couple of other really
cool features about it especially when
it comes to learning more about what's
actually happening with our transactions
whenever we send a transaction to a
blockchain node it actually enters
something called the M Pool it's
basically the place where transactions
go before they get actually sent and the
Alchemy dashboard is a great place to
actually view those transactions and see
their status so I'm going to go ahead
and turn it over to veto from the
Alchemy team who's going to expl explain
more about what Alchemy has to offer
some of the other cool parts of alchemy
and more ZK Stark ZK Nar Z proof z Oh W
oh I'm I'm sorry I'm Jam Jam everyone
and welcome this brand new video I'm V
and today I'm going to walk
to this is not my
channel this is not even AR's Channel
what oh my God this is the latest
Patrick Collins video about Foundry that
everyone must watch oh well well welcome
everyone I am VTO and thank you Patrick
for hosting this comeu I guess my job
today is to tell you a bit more about
what Alchemy is what we do how we do it
and how you can get the most out of it
well before getting started let me
quickly quickly introduce myself I am
BTO lead developer experience at Alchemy
blog hand developer and web free content
creator on a mission to aboard 1 million
developers onto web free of course today
we're not here to talk about me but we
here to talk about how Alchemy can app
your decentralized applications scale to
billions of users so to get started what
is alchemy well Alchemy is a node
provider and web free developer tooling
platform powering hundreds of thousands
of web three and web to Applications out
there things like openc Nifty Gateway
but also zerox Argent Dapper but as well
as big massive web to companies such as
Adobe Shopify and stripe the question
here probably is why do these companies
use us why Alchemy well that's the
question we try to answer here briefly
the thing is when you need to develop an
application chances are you won't run
the servers you'll code your code will
run on and most likely you won't even
develop the deployment and integration
pipelines for it to do this you will use
services such as AWS Azure Google Cloud
well Alchemy does exactly this but for
web free you can see it as the AWS of
web free with apis sdks libraries that
will simply make your developer
experience better but how do we do that
well we do it in mainly three ways the
first one is the super node a blockchain
propriatary engene that acts as a load
balancer on top of your node and make
sure you always got the latest available
data from the blockchain on top of the
super node we built the announced apis
the announced apis are set of apis that
will allow you to pull data from the
blockchain with ease here you can see
how we envision this with the Alchemy
supernode at the center as the core
infrastructure powering its ecosystem
all around such as our announced apis
but also our monitoring tools and of
course supporting all the chains that we
support to date and we'll get back to it
in a few seconds but the question is of
course how do you get started well the
first thing that we're going to do is
navigate in on alchemy.com and we're
going to create a new account creating
an account on alchemy.com is completely
free and actually cool thing is that
you'll be able to scale your application
using our Premium plan because it's
quite generous so don't be concerned
about paying anything everything you'll
see today and probably in Patrick's
course is completely free to use let's
go back creating a new account in this
case I would just sign in of course I
already have an account so I click on
sign in and as soon as we'll open this
window you will see all of your
applications of course if this is the
first time you loging in on Alchemy you
will only see the demo application but
no worries we're going to learn how to
create a new application right now super
important click on create app and let's
give it a name so we're going to call it
Patrick is cool and I'm going to use
underscores just because of personal
preference feel free to use spaces or
name your application the way you want
we're going to also give a description
this is optional you don't have to but I
really think that Patrick is cool and
then we're going to select a chain as we
said before we support the majority of
evm compatible chains as you can see
here we support ethereum polygon P also
ZK evm as well as optimism and AAR and
on top of that we support Solana and non
evm chain here you can select your chain
and here you can select your network in
this case we will go for eum mayet but
feel free to try out all the other
networks and test Nets of course we have
one for all of these um main net that we
support so I will create the new app and
once the app has been created I can just
go and search for my name so Patrick is
cool and click on my application here we
go once the application has open you
will be able to see the application
specific dashboard and this is a big
change big game Cher for all de
centralized application developers
because this gives you full visibility
over your application and infrastructure
health you'll be able to see things such
as latency compute units that that is
how many RPC calls are eating your notes
as well as the success rate of your
calls the throughput and so on and so
forth super useful when you need to
debug so let's say that here you see 98%
of success rate you'll be able to
understand why your transactions are not
going through well let's actually do an
example let me go back and find an
application that has actual codes so
here we go I just navigated to this demo
key application that as you can see has
a ton of calls but also as you can see
it has a success rate of
98.5% that means that 1.5% of our calls
are failing to go through but how do you
understand that how do you debug this
well if you not using Alchemy chances
are that to debug your RPC calls you
will have to spin up your own nodes or
be run a local node and in that case
you'll be able to see the logs coming
from the node otherwise there is no
possibility to see the logs coming from
the node this is not something you will
see on E scan using Alchemy you'll be
able to see all the issues related to
your calls as well as the known issues
related to your calls in this dashboard
so let's say that we have 1.5% of call
not going through what we can do is go
on the recent invalid request dub and
here all the requests that didn't go
through will be listed as well as the
reason why they didn't go through for
example here we have an e Sand Road
transaction that didn't go through
because there weren't sufficient gas
funds but let's take another one here
execution reverted for example means
that probably there is a problem with
the smart contract so as you can see the
bugging as well as you can see other
information on the left hand side but I
will go back at this in a few seconds
because I want to show you another tool
that is even more precise to see the
information about the acttion request
here you'll be able to debug your RPC
calls with super Ease on top of that as
I was saying we have other tools to help
you debug and get more visibility on
your application so if you click on the
menu and here what we can do is navigate
on the M Pool and the manool is actually
just like the manool that you might
think about when you're thinking about
ethereum so it's a place where all of
your transactions are and you can see
the status of the transaction the
information about the transaction what
if the transaction is going through if
didn't go through if it's spending for
hours if you got mind how much it cost
and so on and so forth so let's say we
we just navigated on our mempo Watcher
and here we have all the transactions
going through on our applications here I
have a bunch of applications so that's
why I'm seeing a lot of transactions
here on the top you can see all the Mind
transactions so the transactions that
already went through like can me mind or
validated the pending transactions um
let me just select one application
because of course otherwise it's going
to take a long time here you have all
dep pending transactions that mean all
the transactions that are waiting to be
mined or validated and here you you have
dropped and dropped and replaced so
transactions that have been dropped
cancelled or replaced by other
transactions with the same non same call
data and the same gas fees or dropped
means there are transactions that have
been cancelled and won't be validated or
mind but on top of that you can get even
more information on these calls on these
transactions if I click here on the ash
this won't bring me on ether Canal will
bring me on the M poool transaction
summary page and here I can see all the
information about the transaction I can
see how much gas it costed uh which
network it was on of course uh the
transaction hash as well as the from
address so who send the transaction and
who's sending the transaction to as well
as the value inside transaction the time
it took to get sent and the time it took
to get um validated this is more clear
on validated transactions where
everything has already be filled out so
I can go back in my mind
page so here we go I can select one and
as you can see here I have all the
information so I have Max veper gas I
have the transaction type so this was
using the EAP 1559 and a bunch of other
information about the transaction itself
super helpful to debug and get full
visibility over it all right now that we
have quickly gone through how Alchemy
Works what it is and how it's features
can help your developer experience
become way better and develop faster I
don't want to steal much much more of
your time while learning during this
amazing course so what I'm going to do
is leave you with a couple of resources
that will make your developer experience
with Alchemy even better the first one
is our documentation so our
documentation has everything you need to
get started using our apis SDK libraries
and also tools that we didn't have the
time to go through today such as our
generalized custom graphql web books
that allow you to pull data real time
from the blockchain through graft
queries on top of that you will also
have tutorial and guides to build your
applications and complement the
knowledge you're creating during this
course of course follow us on Twitter at
Alchemy platform or Alchemy learn and if
you want to shoot me a message telling
me the amazing things that you're
building while learning from the
Patrick's course please shoot it at
vostock on Twitter thank you so much
Patrick once again for hosting us and
thank everyone for sticking with us for
12 minutes it's been a pleasure see you
around and happy building
but for this one you should be
incredibly proud of yourself you just
did an entire project in Foundry huge
congratulations so let's do a quick
recap of everything we learned and then
we'll move to the next project and yes
we are going to push our next project up
to GitHub and a lot more advanced
Foundry and a lot more advanced tooling
here so let's do a quick recap of what
we learned so far well first we learned
how to create new Foundry projects with
Forge Das Das and knit which will give
us all of these folders on the left hand
side here to actually start working with
our projects in a more professional
environment we learned about some of the
basic Foundry commands such as cast
Anvil and Forge Forge is used for
compiling and interacting with our
contracts cast is used for interacting
with contracts that have already been
deployed and Anvil is used to deploy a
local blockchain similar to ganach which
is another local blockchain that we
worked with we learned that whenever we
send a transaction on our metamask we're
actually making an HTTP post request to
this RPC URL
and we can also take an RPC URL from a
node as a service like Alchemy and use
it to actually send transactions from
our Foundry projects we learned both how
to actually compile our code in Foundry
and then also write a script to deploy
it directly in solidity we've learned
some very basic information about
keeping our private Keys safe for the
rest of the course we're going to be
working with aemv file but when we work
with real money we might not want to
actually have our private key in plain
text ever so we learned how to deploy
our contracts to a blockchain
programmatically and then we learned how
to interact with them using the cast
keyword and send to send transactions
and then cast call to read from those
contracts we've learned how to autof
format our contracts with Forge format
and we learned the manual way to
actually verify one of our contracts on
the blockchain we learned a lot here so
be absolutely sure to take a minute to
go on a walk go get a cup of coffee go
grab some ice cream go post on Twitter
that that you've taken an extra step in
your web 3 developer Journey you should
be incredibly proud of yourself for
getting this far like I said earlier
installing some of these tools like vs
code and Foundry can be one of the
hardest parts of this entire course so
if you're in here if you're working with
me you're doing fantastic we've got a
lot more to go but just by getting this
far you've done incredibly well so with
that being said take that break remember
breakes are good for your brain take
that break and we'll see you in the next
one
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.