- listen to events
- Store/update value on chain
- Prevent re-entrancy
- Create contract?
- Call other contracts
- Reference oracle
- Function visibility
- Pay address
- Charge address
- Transfer currency
- Create a coin
- Creating a deterministic unique ID from a input
- Verify signature
- Create basic wallet
- Multi-sig wallet
- Create fungible token
- Transfer token
- Same with non-fungible
- English auction
- Dutch auction
- Crowd fund
- Self destruct
- Generate random
- Staking reward
Ethereum
brew tap ethereum/ethereum
brew install solidity
wget -O remix.zip https://github.com/ethereum/remix-live/raw/gh-pages/remix-7ce88128f.zip
Hello World
// SPDX-License-Identifier: MIT
// compiler version must be greater than or equal to 0.8.10 and less than 0.9.0
pragma solidity ^0.8.10;
contract HelloWorld {
string public greet = "Hello World!";
}
Increment/Decrement Counter
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract Counter {
uint public count;
// Function to get the current count
function get() public view returns (uint) {
return count;
}
// Function to increment count by 1
function inc() public {
count += 1;
}
// Function to decrement count by 1
function dec() public {
count -= 1;
}
}
Data types
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract Primitives {
bool public boo = true;
/*
uint stands for unsigned integer, meaning non negative integers
different sizes are available
uint8 ranges from 0 to 2 ** 8 - 1
uint16 ranges from 0 to 2 ** 16 - 1
...
uint256 ranges from 0 to 2 ** 256 - 1
*/
uint8 public u8 = 1;
uint public u256 = 456;
uint public u = 123; // uint is an alias for uint256
/*
Negative numbers are allowed for int types.
Like uint, different ranges are available from int8 to int256
int256 ranges from -2 ** 255 to 2 ** 255 - 1
int128 ranges from -2 ** 127 to 2 ** 127 - 1
*/
int8 public i8 = -1;
int public i256 = 456;
int public i = -123; // int is same as int256
// minimum and maximum of int
int public minInt = type(int).min;
int public maxInt = type(int).max;
address public addr = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
/*
In Solidity, the data type byte represent a sequence of bytes.
Solidity presents two type of bytes types :
- fixed-sized byte arrays
- dynamically-sized byte arrays.
The term bytes in Solidity represents a dynamic array of bytes.
It’s a shorthand for byte[] .
*/
bytes1 a = 0xb5; // [10110101]
bytes1 b = 0x56; // [01010110]
// Default values
// Unassigned variables have a default value
bool public defaultBoo; // false
uint public defaultUint; // 0
int public defaultInt; // 0
address public defaultAddr; // 0x0000000000000000000000000000000000000000
}
Calling Parent Contracts
Parent contracts can be called directly, or by using the keyword super.
By using the keyword super, all of the immediate parent contracts will be called.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
/* Inheritance tree
A
/ \
B C
\ /
D
*/
contract A {
// This is called an event. You can emit events from your function
// and they are logged into the transaction log.
// In our case, this will be useful for tracing function calls.
event Log(string message);
function foo() public virtual {
emit Log("A.foo called");
}
function bar() public virtual {
emit Log("A.bar called");
}
}
contract B is A {
function foo() public virtual override {
emit Log("B.foo called");
A.foo();
}
function bar() public virtual override {
emit Log("B.bar called");
super.bar();
}
}
contract C is A {
function foo() public virtual override {
emit Log("C.foo called");
A.foo();
}
function bar() public virtual override {
emit Log("C.bar called");
super.bar();
}
}
contract D is B, C {
// Try:
// - Call D.foo and check the transaction logs.
// Although D inherits A, B and C, it only called C and then A.
// - Call D.bar and check the transaction logs
// D called C, then B, and finally A.
// Although super was called twice (by B and C) it only called A once.
function foo() public override(B, C) {
super.foo();
}
function bar() public override(B, C) {
super.bar();
}
}
Sending Ether
https://solidity-by-example.org/sending-ether/
Payable
https://solidity-by-example.org/payable/
Deterministic unique ID
https://solidity-by-example.org/hashing/
Wallet
https://solidity-by-example.org/app/ether-wallet/
Multi-sig wallet
https://solidity-by-example.org/app/multi-sig-wallet/
Create a coin (I think?)
https://solidity-by-example.org/app/erc20/
NFT
https://solidity-by-example.org/app/erc721/
English Auction
https://solidity-by-example.org/app/english-auction/
Dutch Auction
https://solidity-by-example.org/app/dutch-auction/
Crowd Fund
https://solidity-by-example.org/app/crowd-fund/
Hi, I'm Glenn! 👋 I've spent most of my career working with or at startups. I'm currently the Director of Product @ Ockam where I'm helping developers build applications and systems that are secure-by-design. It's time we started securely connecting apps, not networks.
Previously I led the Terraform product team @ HashiCorp, where we launched Terraform Cloud and set the stage for a successful IPO. Prior to that I was part of the Startup Team @ AWS, and earlier still an early employee @ Heroku. I've also invested in a couple of dozen early stage startups.
Previously I led the Terraform product team @ HashiCorp, where we launched Terraform Cloud and set the stage for a successful IPO. Prior to that I was part of the Startup Team @ AWS, and earlier still an early employee @ Heroku. I've also invested in a couple of dozen early stage startups.