Skip to content
70 changes: 70 additions & 0 deletions w1/Comman_note.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Web3-Security-Dev-Batch-1-HW

### 試著用 Foundry 部署一個標準的 ERC-20 到 Sepolia

1. 用 fountry 框架初始化專案
```shell
forge init [dir_name]
```
當要實作/引入其他 source,可以用 forge install 的 command
hardhat import 是用@,foundry 則沒有@
```shell
forge install OpenZeppelin/openzeppelin-contracts
```
編譯,可以先確認語法內容
```shell
forge build
```
2. run 測試內容,確認邏輯
```shell
# 測試並打印
forge test -vvvv
```
3. 部署到 Sepolia testnet
etherscan-api-key 如果沒定義,會報錯沒辦法上鍊
$SEPOLIA_RPC_URL 和 $ETHERSCAN_API_KEY 都在專案的 .env 文檔裡定義

```shell
# 先loading環境
source .env

# 以script部署
forge script [script_name] --rpc-url $SEPOLIA_RPC_URL --etherscan-api-key $ETHERSCAN_API_KEY --broadcast --verify -vvvvv
```

4. 部署的合約互動
cast send:是用於需要交易的 command

```shell=
# private key 的方式
cast send <DEPLOYED_ADDRESS> --rpc-url=$SEPOLIA_RPC_URL <function> [function_ARGS] --private-key <private key>

cast send <DEPLOYED_ADDRESS> --rpc-url=$SEPOLIA_RPC_URL "mint(address,uint256)" 0x 1 --private-key 0x

# keystore
cast send <DEPLOYED_ADDRESS> --rpc-url=$ <function> [function_ARGS] --keystore /Users/xinminjiang/.foundry/keystore/<file_name>
```

cast call:不需要交易的話,例如讀取就可以用此 command

```shell=
cast call <DEPLOYED_ADDRESS> <function> [function_ARGS] --rpc-url $SEPOLIA_RPC_URL

cast call 0x "balanceOf(address)" 0x --rpc-url $SEPOLIA_RPC_URL
```

```shell=
# 返回不是10進位的數字可以用cast轉
cast to-dec <value>

# 轉成16進位
cast to-hex <value>

# 轉gwei/ ether
cast to-unit <value> gwei
cast to-unit <value> ether
```

### reference

https://learnblockchain.cn/docs/foundry/i18n/zh/reference/cast/cast-send.html
26 changes: 25 additions & 1 deletion w1/README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,26 @@
# Web3-Security-Dev-Batch-1-HW
w1

1. 完成 mint(address to, uint256 amount) function
--> src/SammiToken.sol
2. 完成對應的測試
--> https://app.warp.dev/block/gmyeJQyXNez0zRpfpa6sRx
3. 完成測試後,利用 Foundry 將合約部署至 sepolia testnet
--> https://sepolia.etherscan.io/address/0x0e337c05460f8a5043e0aef8a4e3c9447235d88e
4. 成功部署後,驗證鏈上的合約
--> /print_result/cast_interaction
5. 將前面的測試情境,用 Foundry 發出對應的交易到剛剛部署在測試鏈上的合約
--> /print_result/cast_interaction
6. 熟悉 cast CLI 工具
| src/SammiToken.sol:SammiToken contract | | | | | |
|----------------------------------------|-----------------|-------|--------|-------|---------|
| Deployment Cost | Deployment Size | | | | |
| 572415 | 3024 | | | | |
| Function Name | min | avg | median | max | # calls |
| allowance | 836 | 836 | 836 | 836 | 1 |
| approve | 24739 | 24739 | 24739 | 24739 | 1 |
| balanceOf | 562 | 562 | 562 | 562 | 14 |
| decimals | 266 | 266 | 266 | 266 | 1 |
| deployer | 425 | 425 | 425 | 425 | 2 |
| mint | 26210 | 39336 | 39263 | 52610 | 4 |
| transfer | 3288 | 3288 | 3288 | 3288 | 3 |
| transferFrom | 4162 | 4162 | 4162 | 4162 | 2 |
62 changes: 62 additions & 0 deletions w1/print_result/cast_interaction
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
xinminjiang@Xinmins-MacBook-Pro ~ % cast send 0x0e337c05460f8A5043e0aef8a4E3C9447235d88e --rpc-url=https://ethereum-sepolia-rpc.allthatnode.com "mint(address,uint256)" 0x6d9d6d6B907c09E4BD1dB364392f6bb5f001c908 9 --private-key <private_key>

blockHash 0x5f9d8881591995af4caa3a2e6f3eaf95bd22a2efc54e6011347866c4d8319544
blockNumber 5335091
contractAddress
cumulativeGasUsed 12040658
effectiveGasPrice 53278320197
from 0x6d9d6d6B907c09E4BD1dB364392f6bb5f001c908
gasUsed 57082
logs [{"address":"0x0e337c05460f8a5043e0aef8a4e3c9447235d88e","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000006d9d6d6b907c09e4bd1db364392f6bb5f001c908"],"data":"0x0000000000000000000000000000000000000000000000007ce66c50e2840000","blockHash":"0x5f9d8881591995af4caa3a2e6f3eaf95bd22a2efc54e6011347866c4d8319544","blockNumber":"0x516833","transactionHash":"0x9e7ce667dcf1981906ec550f1799598bb8a7e9a229e7ca6a826e05b43f49dcbd","transactionIndex":"0x64","logIndex":"0xce","removed":false}]
logsBloom 0x00000080000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000008000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000008000000000000000200000000000000000000000000000000000000000000000000000000000000000000002000000000080000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000
root
status 1
transactionHash 0x9e7ce667dcf1981906ec550f1799598bb8a7e9a229e7ca6a826e05b43f49dcbd
transactionIndex 100
type 2
to 0x0e33…d88e


xinminjiang@Xinmins-MacBook-Pro ~ % cast call 0x0e337c05460f8A5043e0aef8a4E3C9447235d88e "balanceOf(address)" 0x6d9d6d6B907c09E4BD1dB364392f6bb5f001c908 --rpc-url https://ethereum-sepolia-rpc.allthatnode.com
0x0000000000000000000000000000000000000000000000007ce66c50e2840000

xinminjiang@Xinmins-MacBook-Pro ~ % cast to-dec 0x0000000000000000000000000000000000000000000000007ce66c50e2840000
9000000000000000000

xinminjiang@Xinmins-MacBook-Pro ~ % cast send 0x0e337c05460f8A5043e0aef8a4E3C9447235d88e --rpc-url https://ethereum-sepolia-rpc.allthatnode.com "approve(address,uint256)" 0x6d9d6d6B907c09E4BD1dB364392f6bb5f001c908 3 --private-key <private_key>

blockHash 0x1a6184b9d127767c2b389f1746d49fb6adece2ad3a74cb22f9fb2ef661290a94
blockNumber 5340121
contractAddress
cumulativeGasUsed 2629876
effectiveGasPrice 4541398756
from 0xd601b22688B67AA592E61c0cfA1a526a22829796
gasUsed 46311
logs [{"address":"0x0e337c05460f8a5043e0aef8a4e3c9447235d88e","topics":["0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","0x000000000000000000000000d601b22688b67aa592e61c0cfa1a526a22829796","0x0000000000000000000000006d9d6d6b907c09e4bd1db364392f6bb5f001c908"],"data":"0x0000000000000000000000000000000000000000000000000000000000000003","blockHash":"0x1a6184b9d127767c2b389f1746d49fb6adece2ad3a74cb22f9fb2ef661290a94","blockNumber":"0x517bd9","transactionHash":"0x7ad1f02e8594f3a2d06f9bd6dd3d6f267d4ddafa88255aaddc7c063f8f7ccc36","transactionIndex":"0x26","logIndex":"0x16","removed":false}]
logsBloom 0x00000080000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000220000000000000008000000000000000000000000000000000000000000000000080000000000000080000000000000000000000000000000000000000000000010000000000000000000000080000000000000000000000000000000000000
root
status 1
transactionHash 0x7ad1f02e8594f3a2d06f9bd6dd3d6f267d4ddafa88255aaddc7c063f8f7ccc36
transactionIndex 38
type 2
to 0x0e33…d88e
xinminjiang@Xinmins-MacBook-Pro ~ % cast call 0x0e337c05460f8A5043e0aef8a4E3C9447235d88e --rpc-url https://ethereum-sepolia-rpc.allthatnode.com "allowance(address,address)" 0xd601b22688B67AA592E61c0cfA1a526a22829796 0x6d9d6d6B907c09E4BD1dB364392f6bb5f001c908
0x0000000000000000000000000000000000000000000000000000000000000003

xinminjiang@Xinmins-MacBook-Pro ~ % cast send 0x0e337c05460f8A5043e0aef8a4E3C9447235d88e --rpc-url https://ethereum-sepolia-rpc.allthatnode.com "transferFrom(address,address,uint256)" 0xd601b22688B67AA592E61c0cfA1a526a22829796 0x22a13F2778493Ade684e0D355082dF2997CFF5B3 2 --private-key <private_key>

blockHash 0xeb4ff7c743f9d89ba8a0f295f9726269fc9c8a906e93ec9520dd5c3fb21efa6a
blockNumber 5340149
contractAddress
cumulativeGasUsed 3438947
effectiveGasPrice 4790071648
from 0x6d9d6d6B907c09E4BD1dB364392f6bb5f001c908
gasUsed 57602
logs [{"address":"0x0e337c05460f8a5043e0aef8a4e3c9447235d88e","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000d601b22688b67aa592e61c0cfa1a526a22829796","0x00000000000000000000000022a13f2778493ade684e0d355082df2997cff5b3"],"data":"0x0000000000000000000000000000000000000000000000000000000000000002","blockHash":"0xeb4ff7c743f9d89ba8a0f295f9726269fc9c8a906e93ec9520dd5c3fb21efa6a","blockNumber":"0x517bf5","transactionHash":"0xf5fe4be0bca19d73ec268ccf5c7f062d92caaee615387c77248c87c56fd1073f","transactionIndex":"0x2b","logIndex":"0x24","removed":false}]
logsBloom 0x00000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000008000000000000000000000000000000000000000200000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000008000100000000000000000000000000008000000000000000000000000000000000000000000000000080002000000000000080000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000
root
status 1
transactionHash 0xf5fe4be0bca19d73ec268ccf5c7f062d92caaee615387c77248c87c56fd1073f
transactionIndex 43
type 2
to 0x0e33…d88e
114 changes: 114 additions & 0 deletions w1/print_result/deploy_result
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
xinminjiang@Xinmins-MacBook-Pro SammiToken % forge script SammiTokenScript --rpc-url $SEPOLIA_RPC_URL --etherscan-api-key $ETHERSCAN_API_KEY --broadcast --verify -vvvvv
[⠆] Compiling...
No files changed, compilation skipped
Traces:
[98] SammiTokenScript::setUp()
└─ ← ()

[660657] SammiTokenScript::run()
├─ [0] VM::envUint("PRIVATE_KEY") [staticcall]
│ └─ ← <env var value>
├─ [0] VM::addr(<pk>) [staticcall]
│ └─ ← 0xd601b22688B67AA592E61c0cfA1a526a22829796
├─ [0] console::log("Account", 0xd601b22688B67AA592E61c0cfA1a526a22829796) [staticcall]
│ └─ ← ()
├─ [0] VM::startBroadcast(<pk>)
│ └─ ← ()
├─ [572415] → new SammiToken@0x0e337c05460f8A5043e0aef8a4E3C9447235d88e
│ └─ ← 3024 bytes of code
├─ [47816] SammiToken::mint(0xd601b22688B67AA592E61c0cfA1a526a22829796, 100)
│ ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: 0xd601b22688B67AA592E61c0cfA1a526a22829796, amount: 100000000000000000000 [1e20])
│ ├─ [0] console::log(47069 [4.706e4]) [staticcall]
│ │ └─ ← ()
│ └─ ← ()
├─ [0] VM::stopBroadcast()
│ └─ ← ()
└─ ← ()


Script ran successfully.

== Logs ==
Account 0xd601b22688B67AA592E61c0cfA1a526a22829796
47069

## Setting up 1 EVM.
==========================
Simulated On-chain Traces:

[572415] → new SammiToken@0x0e337c05460f8A5043e0aef8a4E3C9447235d88e
└─ ← 3024 bytes of code

[52316] SammiToken::mint(0xd601b22688B67AA592E61c0cfA1a526a22829796, 100)
├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: 0xd601b22688B67AA592E61c0cfA1a526a22829796, amount: 100000000000000000000 [1e20])
├─ [0] console::log(49069 [4.906e4]) [staticcall]
│ └─ ← ()
└─ ← ()


==========================

Chain 11155111

Estimated gas price: 82.251999486 gwei

Estimated total gas used for script: 976466

Estimated amount required: 0.080316280930096476 ETH

==========================

###
Finding wallets for all the necessary addresses...
##
Sending transactions [0 - 1].
⠉ [00:00:00] [#################################################] 2/2 txes (0.0s)
Transactions saved to: /Users/xinminjiang/zSecurity/SammiToken/broadcast/SammiTokenScript.sol/11155111/run-latest.json

Sensitive values saved to: /Users/xinminjiang/zSecurity/SammiToken/cache/SammiTokenScript.sol/11155111/run-latest.json

##
Waiting for receipts.
⠙ [00:00:18] [#############################################] 2/2 receipts (0.0s)
##### sepolia
✅ [Success]Hash: 0x809fcc8da3662c192edc0be9e875b5d338bf71f516318753554bda2406392e44
Contract Address: 0x0e337c05460f8A5043e0aef8a4E3C9447235d88e
Block: 5335062
Paid: 0.034529391444890034 ETH (672813 gas * 51.320933818 gwei)


##### sepolia
✅ [Success]Hash: 0x342ffa32ab096b16fc5c39929d616c9b1253ca8ccfc1331262e59d092ddc4e23
Block: 5335062
Paid: 0.003792001157944384 ETH (73888 gas * 51.320933818 gwei)


Transactions saved to: /Users/xinminjiang/zSecurity/SammiToken/broadcast/SammiTokenScript.sol/11155111/run-latest.json

Sensitive values saved to: /Users/xinminjiang/zSecurity/SammiToken/cache/SammiTokenScript.sol/11155111/run-latest.json



==========================

ONCHAIN EXECUTION COMPLETE & SUCCESSFUL.
Total Paid: 0.038321392602834418 ETH (746701 gas * avg 51.320933818 gwei)
##
Start verification for (1) contracts
Start verifying contract `0x0e337c05460f8A5043e0aef8a4E3C9447235d88e` deployed on sepolia

Submitting verification for [src/SammiToken.sol:SammiToken] 0x0e337c05460f8A5043e0aef8a4E3C9447235d88e.

Submitting verification for [src/SammiToken.sol:SammiToken] 0x0e337c05460f8A5043e0aef8a4E3C9447235d88e.
Submitted contract for verification:
Response: `OK`
GUID: `ijcrelsvtnq6ieudxq1gjywkgbnjskknbnffujfqxthmw1kxxe`
URL: https://sepolia.etherscan.io/address/0x0e337c05460f8a5043e0aef8a4e3c9447235d88e
Contract verification status:
Response: `NOTOK`
Details: `Pending in queue`
Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified
All (1) contracts were verified!
Loading