Navigate back to the homepage

Rustic Introduction into Substrate Framework - Syntax and Design Patterns

Tomasz Waszczyk
March 20th, 2021 · 11 min read

Rust has been Stack Overflow’s most liked programming language for four years in a row, indicating that many of those who have had the opportunity to use Rust fallen in deeper relation with it.

Substrate is a blockchain development framework with a completely generic State Transition Function STF and modular components for consensus, networking, and configuration.

Despite being “completely generic”, it comes with both standards and conventions - particularly with the Substrate runtime module library (a.k.a FRAME) - regarding the underlying data-structures that power the STF, thereby making rapid blockchain development a reality.

Architecture of Substrate framework:

Technical freedom in Substrate framework

What Substrate delivers - the game changer

Be honest. Delivering distributed systems is complex and hard, many companies try to deliver usable solution, often spend millions of dollar, not rare hire 10x software engineers and pays them really a lot but still deliver usable solution is hard.

In my opinion Substrate and writing own parachain for Kusama Network is on the way to make simpler design and implement really usable solution. Why?

Because being a parachain removes following difficulties:

  1. Security of given network

  2. Proof of work, consensus of a network

  3. Runtime upgrades - forget about forks (!!!)

Patterns in The Environment

Rust Syntax Patterns

0. Macro

Macro is a code which expands already existing source code:

1/// main developer interface of Substrate pallet
2decl_storage! {
3 /// storage data on-chain
4 trait Store for Module<T: Trait> as Kitties {
5 /// Stores all the kitties, key is the kitty id
6 pub Kitties get(fn kitties): double_map hasher(blake2_128_concat) T::AccountId, hasher(blake2_128_concat) T::KittyIndex => Option<Kitty>;
7 /// Stores the next kitty ID
8 pub NextKittyId get(fn next_kitty_id): T::KittyIndex;
9 }
10}
11
12decl_module! {
13 pub struct Module<T: Config> for enum Call where origin: T::Origin {
14
15 }
16}
17
18decl_event! {
19 pub enum Event {
20
21 }
22}

1. Turbofish

1impl<T: Trait> Module<T> {
2 fn update_storage(transaction: &Transaction) -> DispatchResult {
3 for input in &transaction.inputs {
4 /// turbofish syntax
5 <UtxoStore>::remove(input.outpoint);
6 /// end of turbofish
7 }
8
9 Ok(())
10 }
11}

2. Closure

1Utxo build(|config: &GenesisConfig| {
2 config.genesis_utxos
3 .iter()
4 .cloned()
5 .map(|u| (BlakeTwo256::hash_of(&u), u) )
6 .collect::<Vec<_>>()
7}): map hasher(identity) H256 => Option<TransactionOutput>;

3. Option syntax

Option is a type of Enum that either returns Some with the variable inside or returns an enumarator None and it is a good practice to encapsulate code in an Option.

1UtxoStore: map H256 => Option<TransactionOutput>; //example

4. DispatchResult as Error Handling

1pub fn spend(_origin, transaction: Transaction) -> DispatchResult {
2 // ...
3 Ok(()) // or Err
4}

Blockchain and Substrate Design Patterns

1. UTXO Transaction Input Output

1pub struct TransactionInput {
2 pub outpoint: H256, // reference to a UTXO to be spent
3 pub sigscript: H512,// proof
4}
5
6pub struct TransactionOutput {
7 pub value: Value, // value associated with this UTXO
8 pub pubkey: H256, // public key associated with this output, key of the UTXO's owner
9}
10
11pub struct Transaction {
12 pub inputs: Vec<TransactionInput>,
13 pub outputs: Vec<TransactionOutput>,
14}

2. Configuration of genesis state in Substrate (useful for testing)

1decl_storage! {
2 trait Store for Module<T: Trait> as Utxo {
3 Utxo build(|config: &GenesisConfig| {
4 config.genesis_utxos
5 .iter()
6 .cloned()
7 .map(|u| (BlakeTwo256::hash_of(&u), u) )
8 .collect::<Vec<_>>()
9 }): map hasher(identity) H256 => Option<TransactionOutput>;
10 }
11
12 add_extra_genesis {
13 config(genesis_utxos): Vec<TransactionOutputs>;
14 }
15}

My notebook of Joshy’s and Dan’s Seminars

An initial assumption of the post is to share my thoughts about Substrate and Rust but also to create a notebook for snippets from so called “Joshy’s Seminars” which are great! Thanks Joshy!

;-)

The seminars previously was recorded via Zoom and here is the link to YouTube currently are available via Crowdcast.

15-09-2020

https://hackmd.io/Msx2ZYb5QX2FxSWPdIpwgg?view

https://substrate.dev/recipes/kitchen-node.html

06-08-2020

1https://polkadot.js.org/apps/#/settings?rpc=ws://127.0.0.1:9944

28-07-2020: Substrate Enterprise Demo

Role-based Access Control Pallet https://github.com/gautamdhameja/substrate-rbac

Decentralized Identifiers Pallet https://github.com/substrate-developer-hub/pallet-did

Product Tracking Pallet https://github.com/stiiifff/pallet-product-tracking

Product Registry Pallet https://github.com/stiiifff/pallet-product-registry

Validator Set Pallet https://github.com/gautamdhameja/substrate-validator-set

26-05-2020

https://substrate.dev/docs/en/knowledgebase/integrate/memory-profiling

https://github.com/w3f/consensus/blob/master/pdf/grandpa-old.pdf

https://wiki.polkadot.network/docs/en/learn-consensus#grandpa-finality-gadget

https://marketplace-staging.substrate.dev/

https://www.forrestthewoods.com/blog/how-to-debug-rust-with-visual-studio-code/

https://hackmd.io/OzLUIGA8QQC3Ketgsd7vqg

https://github.com/paritytech/substrate-debug-kit

https://crates.parity.io

https://substrate.dev/en/seminar

https://blog.chain.link/44-ways-to-enhance-your-smart-contract-with-chainlink/

https://github.com/smartcontractkit/chainlink-polkadot

Rust courses

. . to be continued . .

<!—

Rust: Move semantics, minimal runtime, efficient C bindings, trait-based generics, zero cost abstractions, pattern matching, type interface and zero cost abstractions.

========================================================================== When you are building something, you need to understand what you are building and what makes it special

1- When you are building consumer facing products, its a hit based business
2
3- Need to think differently about the user experience and take a unique approach
4
5- Ideas are cheap: what are your insights, and how are you going to bring the idea to life is more important

What are they looking for? Software that will eventually reach a billion users.

Recommended that teams meet a few times a week at least and elect a team leader.

If you are going to build a mobile app, think long and hard before doing so

1- Might be easier to do a mobile web app so you do not need to go through Apple/Android, deal with download issues,
2
3and you can just open a URL

Pick one specific community to launch to if you are doing something like news or information dispension

1- Pick a few stories and engage one local community, and grow from there

Are there any restrictions on what technology you can use?

1- Whatever you need to get it done, just put a lot of thought in what the best tech to use is. We love open source?

If I have an internship, will that affect this?

1- No, but keep in mind you get out of it what you put in. Factor the time commitment into what your expecations are for
2
3your final product.

Be wary of working on something you do not have a lot of experience in

1- learning it along the way is very doable, but make sure to put in the time beforehand

If the project is covid related, is it still eligible?

1- We are interested in covid projects, but try to think about how this could apply to a non-pandemic situation and mention that in your application

How many features should we build? What should we focus on?

1- You only have 8 weeks, focus on what you KNOW you can complete
2
3- If you do not know what to focus on, do some user research. Engage with people, find out what their problems are
4
5and how the solutions will benefit them.

Should I include user research in my application?

1- YES! We love user research, can only make an application stronger

What about legal hurdles if there are any?

1- Focus more on functionality and collecting users over legal issues, remember this is an MVP
2
3- If you are handling payment, consider using Stripe

What will happen after the program for people who are accepted vs people who are not accepted?

1- After you are accepted, we will have an all hands and you will be assigned a mentor
2
3- You will then figure out what your approach is
4
5- For people not accepted, we will keep the Slack channel open and keep the community active so people can collaborate
6
7- After the acceptances, we might present ideas to the Slack channel/community so people can offer their expertise as
8
9external collaborators

Should I downscope or wait to apply for the summer?

1- Up to you, and what you want to do. Remember, the goal is to have a product out there at the end of 8 weeks.

What will happen after the 8 weeks?

1- The goal is that the projects after the 8 week period can live on into the future

Do we need to find team members on Slack or can we apply with our own team?

1- Not at all! Apply with your own team, Slack is for people who cannot find teammates

Code or no code?

1- Code - you need to build something that works

What if I am not fluent in English?

1- Apply anyway! We will accommodate everyone who is accepted into the program

https://codesandbox.io/s/romantic-lovelace-dkqpi - przeczucanie kartami https://blog.brand24.pl/13-dobrych-praktyk-budowania-relacji-z-klientami/ https://en.wikipedia.org/wiki/Bluetooth_mesh_networking https://lifemathmoney.com/how-to-start-a-startup-cs183b-stanford-y-combinator/ https://startupclass.samaltman.com/lists/readings/ https://www.cbinsights.com/research/startup-failure-post-mortem/ http://www.marcinmuras.com/najwazniejsze-metryki-w-saas-czyli-co-i-jak-mierzyc-aby-twoj-startup-rosl/ 47 pytań, które musi zadać sobie każdy founder (i na nie szczerze odpowiedzieć). Checklista foundera p.2 Cashflow

  1. Czy wiesz jaką masz marże na produktach/ usługach, które świadczysz? (W wielu wypadkach wycena to wróżenie z palca, a co gorsze raz zbudowany „cennik” nie jest modyfikowany na wzgląd wzrost płat w firmie/ czy w ogóle cen w gospodarce)
  2. Czy w budowaniu cennika wyliczyłeś koszty zarządu, biura, czy pracowników, którzy nie przynoszą bezpośrednio zysku ale są ważni np. Project manager, asystentka etc. ? (Wielu founderów nie nakłada dodatkowego kosztu do wycen na klientów osób i kosztów, które nie biorą udziału w projekcie. To dobra droga do tego aby szurać po ziemi)
  3. Czy masz w portfolio klientów, którzy mają na tyle duże opóźnienia płatności, że np. Ty pokrywasz pracę zespołu i infrastruktury przez 2 okresy rozliczeniowe, a dopiero on reguluje jeden? (W ten sposób może się okazać, że masz nierentowne projekty przez zazębianie się płatności. Serio, policz to, chyba, że chcesz być sponsorem.)
  4. Jaki jest średnie opóźnienie płatności na każdym kliencie (warto to estymować, aby wiedzieć czego należy się spodziewać w finansach)
  5. Czy masz system windykacji miękkiej? (Przypomnienia mailowe, telefoniczne, procesy „przypominania się), a może robisz to ad hoc, dopiero gdy brakuje kasy w skarbcu?
  6. Czy Twoje opóźnienia płatności względem innych dostawców/kontrahentów nie wpływają na ich gorsze terminy/słabsze realizacje
  7. Czy aby poprawić kondycję finansową nie wpadasz w pułapkę zasypywania dołów, czyli nie bierzesz zleceń na prędko, po kosztach, aby zasypać chwilowe problemy finansowe co krótkoterminowo daje wrażenie poprawy finansowej ale najczęściej długofalowo wpycha nas w jeszcze większe problemy.
  8. Czy masz w ogóle plan finansowy i czy tworzysz miesięczne estymaty wpływów i wydatków?
  9. Czy biorąc finansowanie dłużne, masz dobry plan na co Ci to będzie potrzebne (oszukiwanie się, że to na rozwój spowodowało u mnie ponad 100k niepotrzebnych wydatków, a też miało iść na rozwój, a o mało nie zwinęło ;)
  10. Czy wiesz ile byłbyś wstanie przetrwać z obecnym zapasem gotówki na koncie, gdyby nagle klienci przestali płacić?

Zespół/HR

  1. Czy masz dobrze opracowany proces onboardingu nowych ludzi w zespole? Z doświadczenia wiem, że brak procesu to palenie czasu i pieniędzy
  2. Czy nie masz w zespole niesamodzielnych jednostek? (Jeżeli tak, powinieneś szybko odciąć pępowinę, to spore utrudnienie nie tylko dla Ciebie, ale także zespołu)
  3. Czy aktualnie potrzebujesz powiększyć zespół (wbrew pozorom bardzo ważne pytanie. Czasami rośniemy na siłę, bez potrzeby i konieczności, co długoterminowo doprowadza do czkawki)
  4. Czy w zespole nie ma jakiegoś zgrzytu komunikacyjnego? (multichanelowość komunikatów, zła nomenklatura, gubienie informacji, czy osoba, której się nie lubi w zespole, to z mojego doświadczenia najczęstsze przyczyny złej komunikacji)
  5. Czy zespół dobrze rozumie misję firmę, czy tylko przychodzi do pracy i „wystukuje” na klawiaturze zadania?
  6. Czy piłkarzykami i wspólnymi wyjściami na imprezy integracyjne nie próbujesz zagłuszać jakiegoś ważnego problemu (np. kiepsko zgrany/dopasowany zespół)
  7. Czy rekrutując na jakieś stanowisko, nie wydałeś werdyktu przed rozmową rekrutacyjną? (Chodzi o zatrudnianie na podstawie CV i wmawianie kandydatom słów czy deklaracji)
  8. Czy masz pomysł na rozwijanie ludzi w swojej organizacji? np. szkolenia/biblioteczka firmowa/kanał na slacku czy wewnętrzny newsletter z ciekawymi artykułami) P.S inspiracja do rozwoju powinna iść od lidera.
  9. Czy masz odpowiednie zabezpieczenia w umowie, które gwarantują Ci, że Twój kluczowy pracownik nie odejdzie z połową klientów? Zdrowie/Odporność na stres/ Produktywność (miksuję, bo te pytania się przenikają)
  10. Czy przez tempo rozwoju organizacji nie zacząłeś gorzej jadać/sięgać po szybkie jedzenie
  11. Czy właściwie regulujesz swój sen (wiem, że brzmi jak truizm, ale sen może nam tragicznie spierniczyć naszą odporność na stres i produktywność). Chodzi o zadbanie o kilka elementów jak: długość, nie opychanie się przed spaniem, czy rutynowe podejście do godzin snu (jak posiadasz dzieci, które się budzą w nocy to nici z planowania)
  12. Czy jesteś asertywny (mowa o wyjścia w ciągu dnia, nieustanne pomaganie ziomkom, którzy też przecież założyli biznes i im się należy za free, nowych cudownych propozycji biznesowych. P.S im idzie Ci lepiej, tym częściej dostajesz propozycje wspólnego biznesu, ja aktualnie minimum raz w miesiącu)
  13. Czy wyciąłeś wszystkie rozpraszacze? (pushe z social media, zbędnę rozmowy telefoniczne). Serio polub nie bycie na bieżąco.
  14. Czy w Twoim zespole nie ma jednostek, które są rozpraszaczami pracy. (np. rozbawiają cały zespół, non stop „porywają” kogoś na rozmowy etc
  15. Czy wiesz jakie obszary w prowadzeniu biznesu możesz wyoutscourcować (zabierają Twój czas, są zbyt drogie w utrzymaniu inhouse)
  16. Czy zdefiniowałeś sobie jakie aspekty prowadzenia biznesu są stresujące? Oraz czy rozpisałeś sobie jak możesz je niwelować/ograniczać czy możesz coś zrobić aby przejmować się nimi mniej?
  17. Czy z Twoją nie oszukujesz się jaki to jesteś pracowity siedząc w biurze 12h, ale efektywnie pracując wyłącznie przez 6?
  18. Czy wiesz z jakich osiągnięć jesteś zadowolony w firmie? (Warto abyś miał je spisane, zwłaszcza gdy przyjdzie po Ciebie syndrom oszusta i będziesz próbował sobie wcisnąć, że jesteś do niczego)

Marketing/Sales

  1. Czy generujesz odpowiednią liczbę leadów dla swojej organizacji? (zbyt mało = możesz mieć mniej pracy i mniej kasy, zbyt dużo prowadzi do podobnego zabiegu, palisz swój czas i kasę oraz informujesz klientów „oni kiepsko pracują bo nawet na zapytania nie odpowiadają)
  2. Czy określiłeś sobie cele sprzedażowe (miesięczne, kwartalne, roczne)
  3. Czy określiłeś sobie cele marketingowe (analogicznie + czy jedynym celem będzie dowożenie leadów)
  4. Czy znasz dobrze źródła swoich leadów i wiesz, które z nich są najbardziej wartościowe?
  5. Czy jesteś wstanie estymować liczbę zapytań miesięcznych oraz ich spadek/wzrost miesiąc do miesiąca i rok do roku? (To pozwala lepiej prognozować moce przerobowe i finanse)
  6. Czy mierzysz w CRM-ie skuteczność zapytań, ich konwersję oraz powody odmów? (Po roku dokładnego mierzenia będziesz królem estymowania, będziesz miał tyle danych, że będziesz czuł się dużo pewniej i przestaniesz się stresować)
  7. Czy Twoi handlowcy nie wciskają klientowi lipnych produktów, albo nie obiecują gruszek na wierzbie tylko po to, aby skasować prowizję bo i tak będzie się tym martwić produkcja/ dział realizacji/ ktokolwiek inny, na pewno nie oni. (Serio warto to mierzyć, bo potem możesz mieć spore problemy w stylu „A bo Pan Robert mi to obiecał”
  8. Czy masz opracowany do poziomu mistrzowskiego proces onboardingu klienta. (Ostatnio sporo nad tym myślałem i jestem więcej niż pewny, że większość klientów, których tracisz to właśnie przez złą procedurę onboardingową. Klient nie czuje się wystarczająco pewnie, czy wystarczająco poinformowany, bo np. proces onbordingu kończy się na przesłaniu draftu umowy. Proces onboardingu to też możliwość wytyczenia granic (godzin do kontaktu, sposobu kontaktu etc.)

Administracja

  1. Czy Twoja umowa z klientami nie jest przestarzała albo nie jest to jakiś ulepek z Internetu? (Dokładnie przemiń umowę, to jest broń obusieczna, albo dobrze zabezpieczysz się na wypadek roszczeniowego klienta, albo wpi…sz się na minę.)
  2. Czy dokładnie analizujesz umowy przychodzące (nie swoje) lub masz w zespole zaufaną osobę, która dobrze i wnikliwie prześledzi wszystkie punkty (w dużych projektach najlepiej niech będzie to prawnik, ale nie oszukujmy się do projektu za kilkaset złotych nie będziesz wzywać prawnika)
  3. Czy Twój obieg dokumentów nie jest dziurawy (czy np. nie ma zgubionych dokumentów między poszczególnymi działami)
  4. Czy przekazywanie i księgowanie dokumentów między Twoją firmą, a firmami partnerskimi (klienci/podwykonawcy) jest płynne? Proces decyzyjny
  5. Czy jesteś wstanie wydelegować podejmowanie części decyzji na członków zespołu? (jeżeli tak to w jakim zakresie, do jakiej odpowiedzialności)
  6. Czy jesteś wstanie ograniczyć liczbę podejmowanych decyzji w ciągu dnia?
  7. Czy decyzja, którą podejmujesz jest Twoim autonomicznym wyborem, a może podjąłeś ją pod wpływem kogoś kto nie rozumie kontekstu (Chodzi o to, że czasami słuchamy rad innych, albo próbujemy skserować jakiś model decyzyjny, który wystarczy, że różni się kontekstowo o dosłownie jeden drobiazg i może wysypać nam całość) P.S najgorsze są decyzje pod wpływem otoczenia

Rozwój

  1. Czy masz coś takiego jak budżet na własny rozwój? (Ja w tym roku zmierzam właśnie do pułapu 10.000 zł wydanych na różne formy edukacyjne głównie książki i szkolenia)
  2. Czy masz rozpisany plan swojego rozwoju/ samokształcenia (Ja aktualnie próbuję rozpisać sobie taką rzecz na 2020, dlatego, że takie spontaniczne uczenie się, nie przynosi takich rezultatów jakbym oczekiwał, albo inaczej można to robić w sposób bardziej zaplanowany przez co bardziej skuteczny)
  3. Czy wiesz w jakich obszarach biznesu jesteś dobry (które powinieneś pielęgnować i rozwijać) a w których jesteś słaby (które powinieneś albo doszkalać, albo zrozumieć, że nie chcesz/nie możesz ich rozwijać i nauczyć się je delegować)

Inne:

  1. Czy biznes, który aktualnie prowadzisz to biznes docelowy/ lifetime czy projekt na 2-3 lata (pozwoli Ci to podejmować decyzje jak rozkładać siły, inaczej pracujesz jak wiesz, że biegniesz maraton, a inaczej gdy mowa o sprincie) Wersja do szerowania: https://marketingibiznes.pl/biznes/47-pytan-ktore-musi-zadac-sobie-kazdy-founder-i-na-nie-szczerze-odpowiedziec-checklista-foundera-p-2/ P.S Jeżeli jesteś founderem, to koniecznie dołącz do naszej konferencji, która odbędzie się już niebawem w Warszawie: https://sklep.marketingibiznes.pl/product/konferencja-founders-mind-24-10-warszawa/ (dziś ostatni dzień tańszych biletów) P.S II - Jeżeli chcesz aby nasza grupa się rozwijała, było w niej więcej merytorycznych dyskusji koniecznie dodaj do niej swoich znajomych prowadzących biznes

Offer for crowdsale contracts development services

[1] Crowdsale process consulting

We work closely with the client to establish the process for their token sale from a technical perspective. It is imperative that the client is aware of the process and the choices he can or can not make. The deliverable from this stage will be a Master Document which will serve as the basis for the technical specifications of the smart contracts.

  • Time estimate: 3 x 1 hour calls + 1 day for drafting the document. Calls can be with the client or with the agency if information is available.

[2] Security setup consulting

The administrative functions of the smart contracts will be controlled by an ADMIN account which needs to be a multi-sig. We provide in-person training with all the key-holders that will participate in the operations of multi-sig accounts. The deliverable from this stage will be the knowledge transfer to the operators of the multi-sig and a tutorial document with step by step instructions and screenshots of the multi-sig app for each step.

  • Time estimate: 1 day face to face with the client, preferably in London

[3] Smart contract development

After all the details of the token and crowdsale are established in steps [1] and [2], we implement and deliver the code according to the specifications. We use a test-driven development approach, which means we write unit-tests first with inputs that cover all corner cases and all possible input combinations with their respective outputs. The deliverable from this stage will be a fully implemented and fully tested smart contract repository which will be pushed to the client’s own github account. The automated unit-tests will be configured to run using Travis.

  • Time estimate: 1 week after completion of steps [1] and [2]

[4] Testnet deployment walkthrough with the client

At this stage we work with the client to agree on a crowdsale start and end date and other parameters such as ETH price and we deploy the smart contracts on a testnet. The client is invited to participate in the administrative actions that need to be taken and make sure the implemented details and actions are implemented as requested.

  • Time estimate: 1 hour call to present the workflow, followed by 4 hours preparation and actual deployment, followed by another 2 hour call with the client for walkthrough.

[5] Operational support

We recommend that the multi-sig accounts with administrative privileges always contain a key which we control, so we can initiate transactions ourselves. This is to lower the technical burden on the client, leaving only the confirmations of such actions for the key-holders from the client’s organisation. After all the operational actions are finished, the key that we control can be safely removed from the multi-sig accounts.

  • Time estimate: This depends very much on the operational load for that specific business. Usually it requires a few hours/day from us for 1-2 weeks.

The above setup is particularly useful when large scale transactions need to be performed as administrative actions, such as mass-whitelisting or mass-airdrops.

[6] Development and devops for REST API

We develop, deploy and manage a web-service that would read data from the crowd-sale related smart contracts. Example: confirmation that an address is white-listed, reading the token balance of an address, etc.

  • Time estimate: 1 week after we get/create the technical specifications. This includes deployment as a cloud service and testing.

[7] Blockchain platforms. We can now develop smart contracts for Ethereum and NEO blockchains. If the clients wants a different platform we can adapt and accommodate.

Be specified: How to get first 1k users and 1mln users Why they will use over the best alternative? Problem => Technology —>

More articles from waszczyk.com

Decentralizacja systemu bankowego

Decentralizacja systemu bankowego oraz systemów informatycznych to trend który coraz wyraźniej przebija się do świadomości użytkoników internetu, właśnie przygotowywuję kurs w którym przekrojowo przedstawię ten nurt - prawdopodobnie już nie do zatrzymania.

January 11th, 2021 · 7 min read

Kurs Dotyczący Wprowadzenia do Decentralizacji Systemów Informatycznych oraz Bankowości

Decentralizacja systemu bankowego oraz systemów informatycznych to trend który coraz wyraźniej przebija się do świadomości użytkoników internetu, właśnie przygotowywuję kurs w którym przekrojowo przedstawię ten nurt - prawdopodobnie już nie do zatrzymania.

October 24th, 2020 · 2 min read
© 2020–2021 waszczyk.com
Link to $https://twitter.com/tomaszwaszczykLink to $https://github.com/tomaszwaszczykLink to $https://instagram.com/tomasz_waszczykLink to $https://www.linkedin.com/in/tomaszwaszczyk