Skip to content

Meharab/foundry-nft

Repository files navigation

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

  1. Verify the contract we're interacting with is what's expected: Check the function selector

  2. Verify the provided function selector vs the function on the contract we expect to be calling: Decode the calldata

  3. Verify the calldata to assure the parameters being sent to the function are what we expect to be sending.

cast --calldata-decode "mintNFT(string)" 0xfb37e883000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000076578616d706c6500000000000000000000000000000000000000000000000000

Foundry

Foundry 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.

Documentation

https://book.getfoundry.sh/

Usage

Build

$ forge build

Test

$ forge test

Format

$ forge fmt

Gas Snapshots

$ forge snapshot

Anvil

$ anvil

Deploy

$ forge script script/Counter.s.sol:CounterScript --rpc-url <your_rpc_url> --private-key <your_private_key>

Cast

$ cast <subcommand>

Help

$ forge --help
$ anvil --help
$ cast --help

Releases

No releases published

Packages

 
 
 

Contributors