This workshop teaches how to test Solana smart contracts using the Anchor framework, covering the importance of testing for smart contract security (as bugs can lead to irreversible losses unlike traditional software), explaining the difference between unit tests (testing single behaviors) and integration tests (testing interactions with external components like oracles), and demonstrating practical test writing using the arrange-act-assert pattern with TypeScript, including examples of testing both simple program logic and interactions with Chainlink price feeds on devnet.
The Impact of Anchor on Solana Smart Contract Security
Added:hey hey everyone what is happening welcome to another chain link 2022 spring hackathon workshop let's just check to make sure everything's all ready to go yep all right looks like everything's all good we are now live we'll just give a couple more minutes for people to join hope everyone's having a fun and productive hackathon [Music] can can everyone hear me can you guys hear me okay all right good to hear yeah sorry if the video is choppy hopefully that that fixes itself awesome all right i think we might get started now all right i'm just going to share my screen all right let's go thanks everyone for joining today we are going to talk about testing with the anchor framework so uh my name is harry papakura once again i'm a developer advocate for chain collabs so yesterday we ran a session uh sorry not yesterday a couple days ago we ran a session um on an introduction to solana and using the anchor framework so if you haven't um if you haven't watched that session i highly recommend it um it's a good intro into just using solana how to deploy a salon a smart contract and things like that and today we're going to extend upon that by talking about how to test your solana programs now what's up tp and leo so just a quick agenda for today we're just going to do a very quick recap on the anchor framework then we're going to talk a little bit about smart contract security and testing solana programs so we're going to talk about the why why should you test your programs and then we'll just do a quick demo of doing a couple tests with some solana smart contracts so just a quick recap on on the anchor framework here so um once again anchor's just basically a framework for for building solana programs and uh the reason why it's so popular is because the uh it reduces a lot of the coding efforts required by generating various boilerplate code right so instead of having to do all of the stuffing around with serialization and deserialization of uh input parameters and account data and all those types of things uh on chain and off chain and code greatly reduces that by abstracting those kinds of things away so that you can do things a little bit easier such as you know call functions and passing in parameters in their natural form instead of serializing them and things like that so uh the the typical workflow for for using anchor when building solar programs once again is you know you have your smart contracts that are written in rust or c or c plus plus and then when you compile those with anchor you you get the generated byte code and you also get the generated idl file uh which is very similar to the ethereum abi file so it gives you a um it gives you basically all of the functions or instructions that can be called what are the input parameters to them what are the accounts that are expected to be passed in for each of those calls as well and then from the ideo you can then generate clients to interact with your on-chain programs and um you can also then use the idle to actually generate tests to talk to your deployed programs on solana so we'll just quickly talk a little bit about smart contract security now so um essentially when it comes to smart contract security there's two main sources of security problems right you have bugs in the actual blockchain infrastructure at the protocol level right or bugs or vulnerabilities in the smart contract code right so the second one is where basically to develop a mistake or unanticipated code execution so uh generally in terms of life cycle smart contracts are kind of more like hardware rather than software right because with software you can release patches and updates to correct fixes etc this generally isn't true with smart contracts unless it's programmed into the smart contract right so unless it's an upgradeable contract right so smart contracts are kind of more like hardware where if there's an issue once it's out then you know you can't fix it you either have to create a new one um instead so this actually becomes a little bit more nuanced with solana because salon actually has the concept of an upgradeable contract where the authority which is basically the owner of a program the person who deployed it they can actually redeploy after again to the same program id right to the same address so um smart contracts or programs aren't really immutable on celina um however it's all it becomes a little bit more tricky because when you as a owner deploy a program on solana you can choose to market as a mutable on deployment and if you do that then it can't be changed right at all however if you don't do that it can be changed or upgraded at a later date right and this is kind of dangerous because imagine if someone builds a d5 protocol or something and then deploys it to mainnet and a whole bunch of people go and put their money into it and then the one person who deployed it and has the authority to upgrade it then just goes and redeploys it with a new code where he can just basically take all the funds or hear sure they and take all the funds and um then they do that right and you think well what the hell so generally most pro projects who deploy smart contracts on solana and have the intention to upgrade them they generally use a multiseek as an upgrade authority to prevent scenarios you know like this from happening so yeah just wanted to mention that generally speaking smart contracts are immutable however on solana it's not always the case but how can we try and minimize the chances of anything bad happening with our deployed programs one of the best methods is testing and yes hopefully we're upgrading everyone's brain with all this info that we really drop as part of the changing hackathon workshops so uh most of you probably already know this but testing is basically executing code in order to try and find issues right um so combination of subsequent structured executions um validating the result at each step right and generally we try and test uh as much of the program logic as you can with solano you definitely need to test focus on accounts as well as just you know the code and logic to make sure that data in accounts is correct um and and focus on the most important areas uh first so in the context of testing you have you know bugs and vulnerabilities so a bug is like a when a issue leads to a plan scenario not executing um whereas a vulnerability is basically where you basically have something completely unexpected happen that you you know you had no idea what's going to happen right so tests don't generally prevent vulnerabilities tests prevent um bugs so testing can be broken up into two kind of subsections so there's unit tests and integration tests so unit tests are basically simple um contained tests that verify a single behavior or component within your program and integration text tests sorry are generally more uh complex that test various interactions between multiple components so it could be other deployed programs on solana already that you're hooking into and using or it could be you know off-chain components such as oracles things like that so in testing uh we generally use the arrange act assert testing pattern here so uh first we arrange the initial conditions required right we deploy a contract that's going to you know look up a chaining price feed value then we act by calling the function to be tested called function that basically does that and then assert the result of the action does my does the return chaining price feed value is a real number is it a positive number so writing good tests can generally be boiled down to five different things here so uh each test would be evaluating just a single behavior so tests shouldn't be too complex they should all be broken up if you have complex logic you should break it up into multiple tests they should be repeatable so they should always produce the same result no matter how many times you run them they should be isolated so it should not each test should not depend upon or affect the result on the result of other tests they should be very readable so that someone should be able to come in you know weeks months years to come and and they should be able to work out what's being tested and and they should be fast as well so they'll be written with speed in mind right because each time you add or change your code you need to run your test to confirm that everything's still working right so having a quick test ensures that you get this feedback sooner so um let's discuss integration tests um basically in an integration test is where you have uh where you're testing interactions between multiple components and some of those components may be things that you're not directly in charge of you didn't deploy you don't own so it could be interactions between contracts um contracts already deployed or even contracts that you have as well it can be an interaction between on-chain components and of change services such as oracles and um generally uh javascript or typescript tests uh that are written for solana are external to the salina rust or c programs and and they're good for testing how things look outside the blockchain right so if you've got a front end for your programs uh these kinds of tests are great for testing at the front end will be able to successfully interact with your programs and the anchor the team at anchor actually they recommend to test your programs using integration tests off chain in a language other than rust just to make sure that the bugs related to syntax et cetera are coverable with the tests and i'm not just kind of replicated in the tests because you can theoretically just write tests on chain with with rust as well so when it comes to testing with anchor basically all you need to do is use the anchor cli and you just need to run anchor test so what that does is it runs an integration test suite against the configured cluster deploying new versions of all workspace programs before running them so basically what that means is when you run that command it will basically bundle up all your programs and then go and deploy them to the configured cluster whether it's your local celina cluster running on your machine or whether it's a uh whether it's devnet etc um and then we'll also look for a test script definition in your anchor tunnel file which everyone has if you're using anchor as part of your project and if the configure network is a local net you know the local cluster it will automatically start the local network and run the test so you don't need to have your local cluster running in fact if you give an error if you have it running you try to run the anchor test command um so it will automatically spin one up and deploy the code run the test and then like stop it so i think there is a flag when you run anchor test to just use an already running one um however i can't remember what it is off the top of my head but if you check out the anchor docs i'm sure you'll find it so here's the section in the anchor tunnel file that it looks for when you run anchor test and basically looks for this script section and this essentially will run all typescript tests in the project that are in this tests folder here and when you generate a new anchor project using anchoring it um you get kind of you get this generated as kind of a boilerplate kind of uh script as well so you generally don't have to put anything in here or modifier cool let's do a bit of a demo now just see if there's any questions is fuzzing something that can identify vulnerabilities yeah definitely if you try and inject a bunch of weird random things uh into your programs uh you could definitely identify issues and vulnerabilities of course i'm just going to switch to my vs code hopefully you guys can see that so here we have my gm anchor program so for those who who watched the session a couple days ago uh we did a simple anchor um [Music] we did a simple anchor project um where we basically actually it's probably better if i just show you guys via the code i shared the github url in the the chat um but essentially we wrote a program that had one function called execute and that function took in a name parameter uh which is a string and basically all it does is when this execute function gets called we're expecting an account to be passed in that we're going to store the name into and all it does is it just sets the um it sets the name that's passed in the string and it stores it in this account uh in this structure here so basically just stores the name says hello to that name in the program output and then exits so very simple program that uses anchor um we did it yesterday i pasted the link to the github repo in the chat for those that want to check it out um but otherwise this is kind of what we ended up with yes uh in in the session a couple days ago so so now we're going to write a simple test for this so if you actually take a look you can see that because we created this program using anchor init we actually get a boilerplate or a simple test here in the test folder and if we go to anchor.tamil we can see uh we have this script section here so um it automatically um has has generated this for us right and and in our provider section we can see that we're gonna we want to use our local network we don't use devnet um and we have our wallet here as my id.json file that we generated so all of these were done as part of the session a couple days ago so it's kind of already set up in terms of just having a simple test ready to go so if we have a look at this test here you can see that it's using the uh some stuff from the anchor javascript library and it's uh importing our gm anchor um program here so uh we're just setting an provider here which basically says um we will just use our local cluster because we've specified here we want to use our local cluster in the provider um and then the cool thing that it does here is it's got anchor's got this thing called a workspace where you can hook into all of your deployed stuff without having to look up deploy program ids and idl files and stuff like that so you can go anchor dot workspace dart in this case gm anchor and it will automatically find your program and you can hook into our end user so this workspace thing is only available when doing testing i believe you can't use this um when you're generating uh off chain clients and things like that so basically we're just looking into our program here um at deploy program and all we're doing is we're basically doing one test here saying is initialized and all we're doing is we're calling the execute method in our program so i'll go back to our code here's the execute function um we're basically just calling that with blank string and we can get a signature back right so we're not really testing anything other than um then we can actually call the function so i should be able to now run anchor test as you can see we have a pass here so is initialized got a tick and we have a transaction signature here so that's kind of the boilerplate test that was generated um initially so i think maybe what we'll do now is we'll build upon that so um what we'll do is we will we're going to use summer session so we're going to use um chai for that so we're going to go const expect equals require char dot expect charge an assertion library to set conditions as part of your tests um okay so we're still going to use our local network um so we'll go anchor dot set provider still yep that's fine and we'll go const user equals provider.wallet so this basically says um we want to use our uh local wallet that we provided um something's wrong here hold on there we go so that's basically hooking into our local provider there and um we want to basically uh get the id.json wallet because that's what we want to use for signing the transactions and then we get our deployed program so that's all fine so now let's change the name of this test from is initialized to name set correctly so what we're going to basically do in this test is we're going to call the function again passing in a specified name and then we're going to actually then uh read the the the account that we pass in to store that name and we're going to actually read the contents of that account and then verify that the value stored in there matches the name that we initially entered so a very simple unit test here so what we now want to do um well i'll actually show you guys how you can do air drops in the test as well so uh for those who are in the session a couple days ago you can do an air drop um which basically um gives just gives you basically some salt some land ports so you can go await provider dot connection dot confirm transaction weight provider dot connection dot request fighter dot wallet.public key um ourselves a bunch of soul and i think we need to say confirmed but this is basically dynamically air dropping our system solved so you don't have to use the the airdrop um the airdrop command on the cli you probably don't need to do this with a local net but i just thought i'd show you guys how to do it cool so we need to pass in an account into the call that we're going to make so we're going to go const gm account equals anchor.web3 dot generate this generates a new account address for us when it's passed in a name so i'm going to go across name equals harry vs code autocomplete or wants to call it harry potter let's show let's do harry potter cool um now we need to do our function call so we're going to go let tx equals await program.rpc dot function name which is execute and name and then we need to pass in an array of accounts next so we're going to go accounts and sorry an object of accounts not an array um so gm account is the first one this is the account that's going to store the name that we send in so that's the first one the user account is the second one this is who's generating paying for the transaction this is our generated wallet and then the system program because our program is initializing new accounts we need to pass in the system program which is a static program i'd be baked into solana that does um household housekeeping tasks such as that cool so what else do you want to specify um we'll specify the specifier sorry the commitment so the starting point at which we want to do this is for confirmed blocks that's fine and signers we want to sign with the gm account so that the program verifies that we actually control it so once that's done you should have a successful call there so now we've called the function we need to check to make sure that we um that we can read the value in that gem account and make sure it's what we expected so we can go const store name equals await um program.account dot greeting account dot fetch gem account dot public key cost const so basically what this does is it reads the context the contents of this gm account and it basically fetches um the the value in the grading account struck here so in our program you can see um for this gm account the the format the data that's being stored is struck here so that's basically why we have that um so now that we've got our value uh let's console.log it now we need to assert our conditions so i want to go expect storedname.name.2 equal name no autocorrect screening here expect storeddame.storename.name and if you want more info about the the syntax of these assertions you can check out uh the chai chai documentation so we're basically grabbing the value from that account and checking if the value stored equals um the name here harry potter so i think that is it let's give it a shot run anchor test awesome so name harry potter we have a transaction signature name set correctly ticked so we successfully call the uh function so anchor basically grabbed our program um deployed it to a local net and it ran our test and it called the function passing in harry potter and then once it finished calling the function it read the value of this account that we passed in and then check to see that the data stored in there equals the string harry potter so very simple unit test that shows you how to basically test your programs with anchor on a local net i'll just see if there's any questions here yeah it's a great great point there uh mentioned in the chat um accounts are public addresses that kind of uh you can think of them as like files that point to storage and uh even a smart contract on celina program everything is an account on solano so smart contract is just program code deployed to an account that's been marked as executable cool so that was one demo let's how we're doing for time we're halfway through cool let's do another demo uh maybe with the solana starter kit so um [Music] so that was a unit test we'll do maybe an integration test now so something on devnet something that interacts with an off chain component such as an oracle right so if you go to our repository on github [Music] oops if you go to our repository on github smart contract kit here you can see there's a pin repository called solana starter kit uh this is a pre-packaged repository for that shows you how to interact with chaining services on solana so right now it's just price feeds but it's going to have more in the future so this is going to be our starting point so i went through this in the session a couple days ago if you haven't played around with this i highly recommend it i'll paste it in the chat so um i'll switch to here so um i pasted the repository in the chat and i've basically already pulled the repository here so just to reiterate what this does it's just a simple it's an anchor program again once again it's a project that uses anchor it has a single function called execute that takes in some accounts and basically using the chaining library on solana it basically looks up um the latest round data for a price feed what is the price timestamps et cetera the description of a price feed um what is the price visit sole usd um etheusd et cetera and how many decimal places what is the precision of the data in the in the price feed so it basically takes that information and it stores it in a passed in account just like our previous demo we'll be passing an account and said hey store the string in here we store the price information in this passed in account um and then that's it just exits so very similar to the last um demo we just did except this time we're interacting with a an oracle off chain so we need to write an integration test for this right so the test that we're going to write is we're going to do this call we're going to do this function call and then we're going to read the value from the account again and we're just going to verify that it contains a valid price there so a valid price can be considered something that's you know just positive we won't know the exact price that we can check for because it changes every three seconds or so however we can assume that if we just have a positive number in there and not just null or nothing um then we can assume that our integration test was successful so what we're going to do now is we have a test directory here and let's create a new file called [Music] pain link inch test and um once again we have in our anchor.toll file we already have a test script set up here to automatically uh run all the tests in this test folder when we run anchor tests so we don't need to do that and on our on this project here our provider is set to devnet so because we're interacting with an oracle we can't do things on our local cluster we need to use a public network uh and once again our wallet um that we're going to be using is this id dot json that i generated so all the steps for getting the solana smart starter kit set up are in the github repo that i just pasted to you so check that out if you haven't already but in terms of our test yeah so to get to where the starting point that i'm at now you need to follow the steps in the github readme here so um you need to you know install the libraries you need to generate a new wallet air drop yourself some soul build the anchor program um grab the program id put it in the program code build it again and deploy it to devnet and you don't need to do the running the client section so you need to get to the end of the building and deploying the consumer program section so all this stuff i went through in the session on a couple of days ago so with our test maybe what we'll do is to make life a little bit easier maybe we can we can take this test as a starting point and we'll change it so we're using anchor here once again so instead of our gm anchor program we want chain link the line of demo so this is our deploy program it's going to be chain link salon demo here um we're going to acquire the search library this time in terms of our searching that we're going to do [Music] as we're dealing with is the big number in in the anchor javascript library as well um [Music] and i think that might be it cool so now let's put in a couple of um static values so training program might be the first one and um we can grab this from the feed info itself but for now we'll just set it to that so let me fix that chaining program so the training program id is um on on devnet there's a deployed chaining program that contains all of the code to interact with price feeds right so it doesn't have the price for data itself it's just got the code and to get this value this static value you just head to our docs at blocks.chain.link click on solana here and go using data feeds and i think down here there's a section the program that owns the data feeds is here so you can see the define so we can basically just take the value from here and we can just put it in here so we need this to interact with the price feeds now chaining fee this is the feed that we want to interact with so once again in our chaining docs if you go to the solana data feed section it has all of the feeds for devnet so um we could just pick one paste in the chat if you have a preference what feed do you want us to look up btc eth link soul maybe not a stable coin all right takers cool all right we'll do sol so we get the style usd feed and chuck it in here cool all right we are ready to go so let's change this to chain link solana demo um and what we're going to do is we're going to set the provider again so we're going to [Music] const uh running const incur dot set provider provider so you can also do it this way um oh did i just delete the other provider yeah i think i did classified equals anchor provided by end sorry not provided.n um capital p i think we've got provided.m and then we go wallet once again cool so in our case our program is going to be anchor dot workspace dot chain link solana demo let me give an alias here cool so we're ready to do our test now i think so we're going to call our test query sol usd price feed so the first thing we're going to do is won't worry about the airdrop here uh we need to generate a new account so we'll call this account price feed account so this would give us a generated address for our new account it won't initialize it that's what our program on chain does but it will just generate that key pair for us um and i think that's it we don't need anything else so i think execute is the name of our function again here yep execute so programmed ifc execute um [Music] in this case we're expecting some different accounts though so i think the first one that we're expecting as per the anchor account section here is we're expecting one called decimal that's going to contain the data that we're going to the price feed data it's going to get populated with a decimal user and then um a couple accounts and then the system program so if we go back here um decimal is going to be this new account that we're generating here a user once again is our um our wallet address that we're going to be paying for the transaction with um so next is the chaining feed that we want to pass in so which feed we want to look at price data from so chain link feed and for that one we already have our static variable here which is the soluti account and then the next one is the chain link program and this is the training program id here so this is that employer program on devnet that um has all the code for interacting with price feeds uh and then the final one is the system program i think so training fee chaining program system program so that's all of the uh accounts and we want to sign with the decimal account so that we can prove sorry with the price feed account so we can prove that we own it control it um and that's it that will call our function so now we just need to verify that everything's correct so we're going to read the value from the crossfit account after and we'll go latest price print that out um price is now we need to do our assertion so we go um this so we're going to assert uh okay so and it'll check you'll basically check whatever condition in here is true so we go latest price stop value by divisor is greater than zero so something wrong here there we go so this will basically check the condition in here so that the value that's stored in the account divided by the divisor as long as it's a positive number we consider this integration test to be um successful right um i think that is it now there's been some issues with the devnet uh rpc endpoint the free one so it's been a bit finicky so if you're using um devnet and you are using a free rpc endpoint then that's a lot of docs here um you can see there's some free rpc endpoints here so devnet it's api.devnet.celana.com [Music] i think yep um that's the one that we're using here so if you go into our uh anchor tunnel um you can see here yeah we're we want to do our tests on the devnet cluster um and we're using our blocks as you can see yeah it's stuffing around again uh service unavailable for api.devnet.com if you do get this i think it just means that it's being hit quite a lot and usually if you try again once or twice it works so this wasn't an issue a few days ago just in the last couple days i think so i'll try a couple more times if it doesn't work it's not a huge deal um but yeah once again we're just doing an integration test that tests that we can successfully uh interact with a chain data feed in this case we're interacting with the soul usd account here that stores all of the the sole usd price feed data on salina devnet um and we just want to verify that we can interact with it so unfortunately rpc endpoint doesn't want to work try it one more time otherwise i'll talk about where you can learn more and and we'll wrap things up if anyone has any questions feel free to ask in the chat thinking so what this is doing or trying to do is it's trying to deploy our program here to the devnet cluster right um so it deploys it and then it interacts with that and runs the test right so i think that was the deployment step it's just deploying the the program now and once it's deployed it will run the test against it finalizing transaction ah so it was successful that time except i have a bug in my test so let's see what happens here name is not defined where am i using name ah okay yes we don't no parameter here so that was my fault name if i run it now it won't work we'll give it one more chance to to run now hopefully that should be okay while we're waiting i'll just talk a little bit about where you can learn some more information from so um if you want to learn more about anchor it's a couple really great resources uh that you should check out the first one is the the anchor docs here and i'll paste the link in the chat um this is a really great resource for resource for learning about anchor it's got a lot of examples and and reference things as well i highly recommend you check it out so anko actually recently released this other thing called the anchor book which actually um i think the anchor docs is not going to maintain going forward and anchor book is going to be like the new place to go for all things anchor so it's just a building upon the work that the anchor docs had and it's got some really great example programs and um a whole bunch of information about anchor so highly recommend checking that out as well so in addition to that um we have let's have a look so once again our celina starter kit for interacting with price feeds on solana if you go to our github repo um over here you can find a pinned over here at the top so if you want to play around with price feeds on solana and want a reference point so you can see how to do it i'm definitely recommend checking that out as well uh and once again at docs um for using practice on solana definitely had to add docs as well and there is a tab at the top specifically for solana so as we deploy more services on solana you'll see more info here um so there's an overview here as well as the reference for the feeds on solana that you can use and a guide if you want to kind of do it step by step as well um [Music] yeah so other than that i think it might be running now uh we'll just give it a second but um if you have any issues or you have any errors definitely uh chat to us in our discord on stack overflow however if you have solana or anchor specific errors i find um the solana discord here is a great place to go and also the anchor discord is also a great place to go um because uh if you paste errors in there you can kind of search for other people that have asked for them um and generally if others have asked for them it means that there's been um discussion on it that you can kind of uh leverage and and kind of use so um here fetch yeah so i've solved a lot of errors purely just by going to the um the discords of solana or anchor and and basically just pasting my error and then just seeing what others have said about it so um even this rpc issue you know has been discussed there so um that's about it really i'm just gonna run this one more time to hopefully get around this these issues um if you have any feedback on on today's session uh please fill out the feedback form um it'd be awesome if you can so i'll just paste it in the chat there's also a qr code here if you want to do it with your phone but yeah thanks everyone for listening i'm just going to stay online and try this test one more time hopefully it should work now um and other than that yeah i can't wait to see what everyone builds so i think now it should be a bit more stable and hopefully we don't have any syntax errors um and we'll see if we can get that program deployed and if we can successfully test and interact with that price feed usually when deploying to devnet it it's a little bit slow with with a public rpc endpoint it takes a few seconds um and it's basically just that deploying the program step um that that basically causes that once it's deployed uh it's generally pretty quick to interact with deployed programs um and yeah just yeah clearing the point yes liner programs are upgradable and and and mutable so um you need to be careful for any programs that you're using on mainnet just can they be upgradable is a multiseek who owns the the authority and things like that cool we finally have a successful um test so as you can see the price of solano now 95.69 and the test successfully passed uh because that's the positive value right so we successfully uh did an integration test where we uh deployed a program and interacted with the price feed with that program and then checked the result so there you go so i hope everyone had a uh got something out of today um looking forward to seeing what projects you build and uh can't wait to interact with your uh in our discords and all the various social media channels so thank you wish you are on the best of luck in in the rest of your your hackathon and um yeah can't wait to see what everyone builds thanks all
Up Next

Modernizing Anchor Apps with Solana Kit: A Step-by-Step Guide
@Quicknode
2.9K views•2025-06-09

Torrent File Format & Bencoding: A Technical Deep Dive
@AsliEngineering
12.5K views•2022-08-08

Build Dynamic NFTs with Chainlink VRF: A Workflow Guide
@chainlink
32.5K views•2021-03-18

Understanding Ethereum: A Comprehensive Beginner's Overview
@99Bitcoins
3.1M views•2018-06-26
Related Study Plans & Knowledge Roadmaps
Structured learning paths in Blockchain & Crypto


























![[PLDI 2026] Flatirons 2+3+4 - PLDI Keynotes (Jun 18th)](https://i.ytimg.com/vi/i5Vooz7o074/maxresdefault.jpg)







![[Solana Bootcamp Summer 2024] #1 - Kick off | Introduction to Solana](https://i.ytimg.com/vi/8kkGIod41rg/maxresdefault.jpg)


