Traces:
[1692247] DeployBasicNFT::run()
├─ [0] VM::startBroadcast()
│ └─ ← [Return]
├─ [1654030] → new BasicNFT@0xf21DEAFa9191e003231ADd25eE223644DD36232D
│ └─ ← [Return] 8023 bytes of code
├─ [0] VM::stopBroadcast()
│ └─ ← [Return]
└─ ← [Return] BasicNFT: [0xf21DEAFa9191e003231ADd25eE223644DD36232D]
Script ran successfully.
== Return ==
0: contract BasicNFT 0xf21DEAFa9191e003231ADd25eE223644DD36232D
## Setting up 1 EVM.
==========================
Simulated On-chain Traces:
[1654030] → new BasicNFT@0xf21DEAFa9191e003231ADd25eE223644DD36232D
└─ ← [Return] 8023 bytes of code
==========================
Chain 11155111
Estimated gas price: 0.001000094 gwei
Estimated total gas used for script: 2396115
Estimated amount required: 0.00000239634023481 ETH
==========================
##### sepolia
✅ [Success] Hash: 0xadef0b8fb2d76c87e32a409849c9089e255c3cf9d22d367293e04819933e71b3
Contract Address: 0xf21DEAFa9191e003231ADd25eE223644DD36232D
Block: 10583158
Paid: 0.000001843245256138 ETH (1843166 gas * 0.001000043 gwei)
✅ Sequence #1 on sepolia | Total Paid: 0.000001843245256138 ETH (1843166 gas * avg 0.001000043 gwei)
==========================
ONCHAIN EXECUTION COMPLETE & SUCCESSFUL.
##
Start verification for (1) contracts
Start verifying contract `0xf21DEAFa9191e003231ADd25eE223644DD36232D` deployed on sepolia
EVM version: prague
Compiler version: 0.8.33
Submitting verification for [src/BasicNft.sol:BasicNFT] 0xf21DEAFa9191e003231ADd25eE223644DD36232D.
Warning: Could not detect deployment: Unable to locate ContractCode at 0xf21deafa9191e003231add25ee223644dd36232d; waiting 5 seconds before trying again (4 tries remaining)
Submitting verification for [src/BasicNft.sol:BasicNFT] 0xf21DEAFa9191e003231ADd25eE223644DD36232D.
Warning: Could not detect deployment: Unable to locate ContractCode at 0xf21deafa9191e003231add25ee223644dd36232d; waiting 5 seconds before trying again (3 tries remaining)
Submitting verification for [src/BasicNft.sol:BasicNFT] 0xf21DEAFa9191e003231ADd25eE223644DD36232D.
Submitted contract for verification:
Response: `OK`
GUID: `nhsdusbl7tkueex8kwtnexi3z3ham2dhkptgawkcqw9cl4b6b1`
URL: https://sepolia.etherscan.io/address/0xf21deafa9191e003231add25ee223644dd36232d
Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified
All (1) contracts were verified!
Transactions saved to: /home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol/11155111/run-latest.json
Sensitive values saved to: /home/licdora/Boot/foundry/foundry-nft/cache/DeployBasicNft.s.sol/11155111/run-latest.json[⠊] Compiling...
[⠔] Compiling 1 files with Solc 0.8.33
[⠒] Solc 0.8.33 finished in 448.02ms
Compiler run successful with warnings:
Warning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
--> src/BasicNft.sol:16:62:
|
16 | function mintNFT(string memory tokenUri) public returns (uint256) {
| ^^^^^^^
Traces:
[1495819] MintBasicNFT::run()
├─ [0] VM::readDir("./broadcast", 3) [staticcall]
│ └─ ← [Return] [("", "/home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol", 1, true, false), ("", "/home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol/11155111", 2, true, false), ("", "/home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol/11155111/run-1775239782066.json", 3, false, false), ("", "/home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol/11155111/run-latest.json", 3, false, false)]
├─ [0] VM::toString(11155111 [1.115e7]) [staticcall]
│ └─ ← [Return] "11155111"
├─ [0] VM::toString(11155111 [1.115e7]) [staticcall]
│ └─ ← [Return] "11155111"
├─ [0] VM::toString(11155111 [1.115e7]) [staticcall]
│ └─ ← [Return] "11155111"
├─ [0] VM::readFile("/home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol/11155111/run-1775239782066.json") [staticcall]
│ └─ ← [Return] <file>
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[0]") [staticcall]
│ └─ ← [Return] true
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[0].contractName") [staticcall]
│ └─ ← [Return] true
├─ [0] VM::parseJsonString("<stringified JSON>", "$.transactions[0].contractName") [staticcall]
│ └─ ← [Return] "BasicNFT"
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::parseJsonAddress("<stringified JSON>", "$.transactions[0].contractAddress") [staticcall]
│ └─ ← [Return] 0xf21DEAFa9191e003231ADd25eE223644DD36232D
├─ [0] VM::toString(1) [staticcall]
│ └─ ← [Return] "1"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[1]") [staticcall]
│ └─ ← [Return] false
├─ [0] VM::toString(11155111 [1.115e7]) [staticcall]
│ └─ ← [Return] "11155111"
├─ [0] VM::readFile("/home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol/11155111/run-latest.json") [staticcall]
│ └─ ← [Return] <file>
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[0]") [staticcall]
│ └─ ← [Return] true
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[0].contractName") [staticcall]
│ └─ ← [Return] true
├─ [0] VM::parseJsonString("<stringified JSON>", "$.transactions[0].contractName") [staticcall]
│ └─ ← [Return] "BasicNFT"
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::parseJsonAddress("<stringified JSON>", "$.transactions[0].contractAddress") [staticcall]
│ └─ ← [Return] 0xf21DEAFa9191e003231ADd25eE223644DD36232D
├─ [0] VM::toString(1) [staticcall]
│ └─ ← [Return] "1"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[1]") [staticcall]
│ └─ ← [Return] false
├─ [0] VM::toString(11155111 [1.115e7]) [staticcall]
│ └─ ← [Return] "11155111"
├─ [0] VM::toString(11155111 [1.115e7]) [staticcall]
│ └─ ← [Return] "11155111"
├─ [0] VM::toString(11155111 [1.115e7]) [staticcall]
│ └─ ← [Return] "11155111"
├─ [0] VM::readFile("/home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol/11155111/run-1775239782066.json") [staticcall]
│ └─ ← [Return] <file>
├─ [0] VM::parseJsonUint("<stringified JSON>", ".timestamp") [staticcall]
│ └─ ← [Return] 1775239782066 [1.775e12]
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[0]") [staticcall]
│ └─ ← [Return] true
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[0].contractName") [staticcall]
│ └─ ← [Return] true
├─ [0] VM::parseJsonString("<stringified JSON>", "$.transactions[0].contractName") [staticcall]
│ └─ ← [Return] "BasicNFT"
├─ [0] VM::toString(0) [staticcall]
│ └─ ← [Return] "0"
├─ [0] VM::parseJsonAddress("<stringified JSON>", "$.transactions[0].contractAddress") [staticcall]
│ └─ ← [Return] 0xf21DEAFa9191e003231ADd25eE223644DD36232D
├─ [0] VM::toString(1) [staticcall]
│ └─ ← [Return] "1"
├─ [0] VM::keyExistsJson("<JSON file>", "$.transactions[1]") [staticcall]
│ └─ ← [Return] false
├─ [0] VM::toString(11155111 [1.115e7]) [staticcall]
│ └─ ← [Return] "11155111"
├─ [0] VM::readFile("/home/licdora/Boot/foundry/foundry-nft/broadcast/DeployBasicNft.s.sol/11155111/run-latest.json") [staticcall]
│ └─ ← [Return] <file>
├─ [0] VM::parseJsonUint("<stringified JSON>", ".timestamp") [staticcall]
│ └─ ← [Return] 1775239782066 [1.775e12]
├─ [0] VM::startBroadcast()
│ └─ ← [Return]
├─ [160268] 0xf21DEAFa9191e003231ADd25eE223644DD36232D::mintNFT("ipfs://bafybeig37ioir76s7mg5oobetncojcm3c3hxasyd4rvid4jqhy4gkaheg4/?filename=0-PUG.json")
│ ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: 0x55F710a5509f4a8a8fE8a41dF476e51daD401454, tokenId: 0)
│ └─ ← [Return] 0
├─ [0] VM::stopBroadcast()
│ └─ ← [Return]
└─ ← [Stop]
Script ran successfully.
## Setting up 1 EVM.
==========================
Simulated On-chain Traces:
[160268] 0xf21DEAFa9191e003231ADd25eE223644DD36232D::mintNFT("ipfs://bafybeig37ioir76s7mg5oobetncojcm3c3hxasyd4rvid4jqhy4gkaheg4/?filename=0-PUG.json")
├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: 0x55F710a5509f4a8a8fE8a41dF476e51daD401454, tokenId: 0)
└─ ← [Return] 0
==========================
Chain 11155111
Estimated gas price: 0.00100009 gwei
Estimated total gas used for script: 252824
Estimated amount required: 0.00000025284675416 ETH
==========================
##### sepolia
✅ [Success] Hash: 0x7a08f318299584762b69c9593497ca5c1fac549cc3689c88d5b6de57b2f38df4
Block: 10583191
Paid: 0.00000018304841984 ETH (183040 gas * 0.001000046 gwei)
✅ Sequence #1 on sepolia | Total Paid: 0.00000018304841984 ETH (183040 gas * avg 0.001000046 gwei)
==========================
ONCHAIN EXECUTION COMPLETE & SUCCESSFUL.
##
Start verification for (0) contracts
All (0) contracts were verified!
Transactions saved to: /home/licdora/Boot/foundry/foundry-nft/broadcast/Interactions.s.sol/11155111/run-latest.json
Sensitive values saved to: /home/licdora/Boot/foundry/foundry-nft/cache/Interactions.s.sol/11155111/run-latest.json
sad:
data:image/svg+xml;base64,PHN2ZwogIHZpZXdCb3g9IjAgMCAyMDAgMjAwIgogIHdpZHRoPSI0MDAiCiAgaGVpZ2h0PSI0MDAiCiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgo+CiAgPGNpcmNsZQogICAgY3g9IjEwMCIKICAgIGN5PSIxMDAiCiAgICBmaWxsPSJyZWQiCiAgICByPSI3OCIKICAgIHN0cm9rZT0iYmxhY2siCiAgICBzdHJva2Utd2lkdGg9IjMiCiAgLz4KICA8ZyBjbGFzcz0iZXllcyI+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9IjgyIiByPSIxMiIgLz4KICAgIDxjaXJjbGUgY3g9IjEyNyIgY3k9IjgyIiByPSIxMiIgLz4KICA8L2c+CiAgPHBhdGgKICAgIGQ9Im0xMzYuODEgMTE2LjUzYy42OSAyNi4xNy02NC4xMSA0Mi04MS41Mi0uNzMiCiAgICBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IGJsYWNrOyBzdHJva2Utd2lkdGg6IDM7IgogIC8+Cjwvc3ZnPg==patrick's sad:
data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAwIDIwMCIgd2lkdGg9IjQwMCIgIGhlaWdodD0iNDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxjaXJjbGUgY3g9IjEwMCIgY3k9IjEwMCIgZmlsbD0iZ3JlZW4iIHI9Ijc4IiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiLz4KICA8ZyBjbGFzcz0iZXllcyI+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9IjgyIiByPSIxMiIvPgogICAgPGNpcmNsZSBjeD0iMTI3IiBjeT0iODIiIHI9IjIwIi8+CiAgPC9nPgogIDxwYXRoIGQ9Im0xMzYuODEgMTM1LjUzYy42OSAyNi4xNy03NSAtNTAtODEuNTItLjczIiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IGJsYWNrOyBzdHJva2Utd2lkdGg6IDc7Ii8+Cjwvc3ZnPg==happy:
data:image/svg+xml;base64,PHN2ZwogIHZpZXdCb3g9IjAgMCAyMDAgMjAwIgogIHdpZHRoPSI0MDAiCiAgaGVpZ2h0PSI0MDAiCiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgo+CiAgPGNpcmNsZQogICAgY3g9IjEwMCIKICAgIGN5PSIxMDAiCiAgICBmaWxsPSJ5ZWxsb3ciCiAgICByPSI3OCIKICAgIHN0cm9rZT0iYmxhY2siCiAgICBzdHJva2Utd2lkdGg9IjMiCiAgLz4KICA8ZyBjbGFzcz0iZXllcyI+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9IjgyIiByPSIxMiIgLz4KICAgIDxjaXJjbGUgY3g9IjEyNyIgY3k9IjgyIiByPSIxMiIgLz4KICA8L2c+CiAgPHBhdGgKICAgIGQ9Im0xMzYuODEgMTE2LjUzYy42OSAyNi4xNy02NC4xMSA0Mi04MS41Mi0uNzMiCiAgICBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IGJsYWNrOyBzdHJva2Utd2lkdGg6IDM7IgogIC8+Cjwvc3ZnPg==patrick's happy:
data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAwIDIwMCIgd2lkdGg9IjQwMCIgIGhlaWdodD0iNDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxjaXJjbGUgY3g9IjEwMCIgY3k9IjEwMCIgZmlsbD0icHVycGxlIiByPSI3OCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIzIi8+CiAgPGcgY2xhc3M9ImV5ZXMiPgogICAgPGNpcmNsZSBjeD0iNjEiIGN5PSI4MiIgcj0iMjAiLz4KICAgIDxjaXJjbGUgY3g9IjEyNyIgY3k9IjgyIiByPSIxMiIvPgogIDwvZz4KICA8cGF0aCBkPSJtMTM2LjgxIDExNi41M2MuNjkgMjYuMTctLjExIDQyLTgxLjUyLS43MyIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiBibGFjazsgc3Ryb2tlLXdpZHRoOiA3OyIvPgo8L3N2Zz4=Check the address
-
Verify the contract we're interacting with is what's expected: Check the function selector
-
Verify the provided function selector vs the function on the contract we expect to be calling: Decode the calldata
-
Verify the calldata to assure the parameters being sent to the function are what we expect to be sending.
cast --calldata-decode "mintNFT(string)" 0xfb37e883000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000076578616d706c6500000000000000000000000000000000000000000000000000Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.
Foundry consists of:
- Forge: Ethereum testing framework (like Truffle, Hardhat and DappTools).
- Cast: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data.
- Anvil: Local Ethereum node, akin to Ganache, Hardhat Network.
- Chisel: Fast, utilitarian, and verbose solidity REPL.
$ forge build$ forge test$ forge fmt$ forge snapshot$ anvil$ forge script script/Counter.s.sol:CounterScript --rpc-url <your_rpc_url> --private-key <your_private_key>$ cast <subcommand>$ forge --help
$ anvil --help
$ cast --help