Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
9edcf7f
Add `removeLastOwner` for replayability (#52)
stevieraykatz Apr 12, 2024
cb57387
fix readme
wilsoncusack Apr 16, 2024
ceb82f2
Merge pull request #55 from coinbase/wilson/fix-readme
wilsoncusack Apr 16, 2024
2418bd7
do not gitignore lib
wilsoncusack Apr 19, 2024
3de9b26
== false -> !
wilsoncusack Apr 19, 2024
f957bb1
boost coveralls
wilsoncusack Apr 19, 2024
89eb5a6
Merge pull request #56 from coinbase/wilson/fix-gitignore
wilsoncusack Apr 19, 2024
3ba8883
optimize getting function selector
wilsoncusack Apr 19, 2024
3b686e6
fmt
wilsoncusack Apr 19, 2024
29b8235
Merge pull request #58 from coinbase/wilson/bytes4
wilsoncusack Apr 19, 2024
cb4d53d
audit external vs. public
wilsoncusack Apr 19, 2024
ae728c0
initialize external
wilsoncusack Apr 19, 2024
f61a200
Merge pull request #59 from coinbase/wilson/false-check
wilsoncusack Apr 19, 2024
dcbf983
Merge pull request #57 from coinbase/wilson/external
wilsoncusack Apr 19, 2024
8d25bc4
add ownerCount method
wilsoncusack Apr 19, 2024
5e90754
do not call twice
wilsoncusack Apr 19, 2024
adab965
Merge pull request #60 from coinbase/wilson/ownerCount
wilsoncusack Apr 19, 2024
a820d21
Smart Wallet
wilsoncusack Apr 20, 2024
13a12e4
factory
wilsoncusack Apr 20, 2024
9cee8c9
ERC1271
wilsoncusack Apr 20, 2024
8e4041d
multiownable
wilsoncusack Apr 20, 2024
e467b9e
baptist feedback
wilsoncusack Apr 22, 2024
b4a9f14
sort imports
wilsoncusack Apr 22, 2024
04ae12a
formatting
wilsoncusack Apr 22, 2024
4fcf12e
snapshot
wilsoncusack Apr 22, 2024
1ef24d5
add snapshot to CI
wilsoncusack Apr 22, 2024
4bb091e
small fixes
wilsoncusack Apr 22, 2024
6579faa
more consistency + gas fix
wilsoncusack Apr 22, 2024
121b679
remove TestPlus dep
wilsoncusack Apr 22, 2024
376595c
clean up unnecessary named return args
wilsoncusack Apr 22, 2024
1b47c00
Merge pull request #64 from coinbase/wilson/natspec
wilsoncusack Apr 22, 2024
65ed8f3
webauthn-sol @ v1
wilsoncusack Apr 22, 2024
51b2b3e
Merge pull request #65 from coinbase/wilson/webauthn
wilsoncusack Apr 22, 2024
7dc6000
forge install: safe-singleton-deployer-sol
wilsoncusack Apr 22, 2024
d271f25
v1 deployment
wilsoncusack Apr 22, 2024
b214501
improve readme
wilsoncusack Apr 22, 2024
9ad8a21
fix certora
wilsoncusack Apr 23, 2024
6551112
add fuzz seed
wilsoncusack Apr 23, 2024
5afb75b
remove seed
wilsoncusack Apr 23, 2024
b5e8ddd
fix snapshot
wilsoncusack Apr 23, 2024
5d4dace
add tolerance
wilsoncusack Apr 23, 2024
7b45425
Merge pull request #66 from coinbase/wilson/safe-deploy
wilsoncusack Apr 23, 2024
fb4c0cb
Update README.md
wilsoncusack Apr 23, 2024
5e5fb8d
Merge pull request #68 from coinbase/readme-update
wilsoncusack Apr 23, 2024
68ad7c5
arbitrum sepolia deploy
wilsoncusack Apr 26, 2024
a69feac
deploy OP, Zora, eth mainnet, update readme
wilsoncusack May 3, 2024
94bf59f
update makefile
wilsoncusack May 3, 2024
39d5c7c
Merge pull request #69 from coinbase/wilson/arb
wilsoncusack May 5, 2024
2de2fc8
deploy on avalanche and bnb
wilsoncusack May 9, 2024
facf1a5
Merge pull request #70 from coinbase/wilson/deploy-bnb
wilsoncusack May 10, 2024
0fe87f1
add other audits
wilsoncusack Sep 9, 2024
19cbef3
update snapshot
wilsoncusack Sep 9, 2024
e697827
rename
wilsoncusack Sep 9, 2024
d0491d4
Merge pull request #87 from coinbase/wilson/more-audits
wilsoncusack Sep 11, 2024
26cb5ed
Revert "deploy on avalanche and bnb"
DatOneJuice Nov 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 69 additions & 69 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,72 +1,72 @@
AddOwnerAddressTest:testEmitsAddOwner() (gas: 92402)
AddOwnerAddressTest:testIncreasesOwnerIndex() (gas: 90676)
AddOwnerAddressTest:testRevertsIfAlreadyOwner() (gas: 93191)
AddOwnerAddressTest:testRevertsIfCalledByNonOwner() (gas: 11764)
AddOwnerAddressTest:testSetsIsOwner() (gas: 90470)
AddOwnerAddressTest:testSetsOwnerAtIndex() (gas: 98970)
AddOwnerPublicKeyTest:testEmitsAddOwner() (gas: 115537)
AddOwnerPublicKeyTest:testFuzzIsOwnerPublicKey(bytes32,bytes32) (runs: 256, μ: 115328, ~: 115328)
AddOwnerPublicKeyTest:testRevertsIfAlreadyOwner() (gas: 116355)
AddOwnerPublicKeyTest:testRevertsIfCalledByNonOwner() (gas: 11754)
AddOwnerPublicKeyTest:testSetsIsOwner() (gas: 113769)
AddOwnerPublicKeyTest:testSetsOwnerAtIndex() (gas: 128616)
CoinbaseSmartWallet1271InputGeneratorTest:testGetReplaySafeHashForDeployedAccount() (gas: 308446)
CoinbaseSmartWallet1271InputGeneratorTest:testGetReplaySafeHashForUndeployedAccount() (gas: 291475)
CoinbaseSmartWalletFactoryTest:testDeployDeterministicPassValues() (gas: 267250)
CoinbaseSmartWalletFactoryTest:test_CreateAccount_ReturnsPredeterminedAddress_WhenAccountAlreadyExists() (gas: 287003)
CoinbaseSmartWalletFactoryTest:test_RevertsIfLength32ButLargerThanAddress() (gas: 298636)
CoinbaseSmartWalletFactoryTest:test_createAccountDeploysToPredeterminedAddress() (gas: 268601)
CoinbaseSmartWalletFactoryTest:test_createAccountSetsOwnersCorrectly() (gas: 277291)
CoinbaseSmartWalletFactoryTest:test_exitIfAccountIsAlreadyInitialized() (gas: 267718)
CoinbaseSmartWalletFactoryTest:test_implementation_returnsExpectedAddress() (gas: 7654)
CoinbaseSmartWalletFactoryTest:test_initCodeHash() (gas: 7890)
CoinbaseSmartWalletFactoryTest:test_revertsIfNoOwners() (gas: 29214)
ERC1271Test:test_returnsExpectedDomainHashWhenProxy() (gas: 29198)
ERC1271Test:test_static() (gas: 3243921)
AddOwnerAddressTest:testEmitsAddOwner() (gas: 92424)
AddOwnerAddressTest:testIncreasesOwnerIndex() (gas: 90698)
AddOwnerAddressTest:testRevertsIfAlreadyOwner() (gas: 93235)
AddOwnerAddressTest:testRevertsIfCalledByNonOwner() (gas: 11786)
AddOwnerAddressTest:testSetsIsOwner() (gas: 90492)
AddOwnerAddressTest:testSetsOwnerAtIndex() (gas: 98992)
AddOwnerPublicKeyTest:testEmitsAddOwner() (gas: 115559)
AddOwnerPublicKeyTest:testFuzzIsOwnerPublicKey(bytes32,bytes32) (runs: 257, μ: 115372, ~: 115372)
AddOwnerPublicKeyTest:testRevertsIfAlreadyOwner() (gas: 116399)
AddOwnerPublicKeyTest:testRevertsIfCalledByNonOwner() (gas: 11776)
AddOwnerPublicKeyTest:testSetsIsOwner() (gas: 113813)
AddOwnerPublicKeyTest:testSetsOwnerAtIndex() (gas: 128638)
CoinbaseSmartWallet1271InputGeneratorTest:testGetReplaySafeHashForDeployedAccount() (gas: 308479)
CoinbaseSmartWallet1271InputGeneratorTest:testGetReplaySafeHashForUndeployedAccount() (gas: 291508)
CoinbaseSmartWalletFactoryTest:testDeployDeterministicPassValues() (gas: 267283)
CoinbaseSmartWalletFactoryTest:test_CreateAccount_ReturnsPredeterminedAddress_WhenAccountAlreadyExists() (gas: 286935)
CoinbaseSmartWalletFactoryTest:test_RevertsIfLength32ButLargerThanAddress() (gas: 298669)
CoinbaseSmartWalletFactoryTest:test_constructor_setsImplementation(address) (runs: 257, μ: 313355, ~: 313355)
CoinbaseSmartWalletFactoryTest:test_createAccountDeploysToPredeterminedAddress() (gas: 268634)
CoinbaseSmartWalletFactoryTest:test_createAccountSetsOwnersCorrectly() (gas: 277324)
CoinbaseSmartWalletFactoryTest:test_exitIfAccountIsAlreadyInitialized() (gas: 267739)
CoinbaseSmartWalletFactoryTest:test_implementation_returnsExpectedAddress() (gas: 7676)
CoinbaseSmartWalletFactoryTest:test_initCodeHash() (gas: 7912)
CoinbaseSmartWalletFactoryTest:test_revertsIfNoOwners() (gas: 29232)
ERC1271Test:test_returnsExpectedDomainHashWhenProxy() (gas: 29243)
ERC1271Test:test_static() (gas: 3247131)
MultiOwnableInitializeTest:testRevertsIfLength32ButLargerThanAddress() (gas: 81111)
MultiOwnableInitializeTest:testRevertsIfLength32NotAddress() (gas: 81092)
MultiOwnableInitializeTest:testRevertsIfLengthNot32Or64() (gas: 103395)
RemoveLastOwnerTest:test_emitsRemoveOwner() (gas: 50337)
RemoveLastOwnerTest:test_removesOwner() (gas: 49609)
RemoveLastOwnerTest:test_removesOwnerAtIndex() (gas: 49562)
RemoveLastOwnerTest:test_revert_whenCalledByNonOwner(address) (runs: 256, μ: 19094, ~: 19094)
RemoveLastOwnerTest:test_revert_whenNoOwnerAtIndex() (gas: 48379)
RemoveLastOwnerTest:test_revert_whenWrongOwnerAtIndex() (gas: 34153)
RemoveLastOwnerTest:test_reverts_whenNotLastOwner() (gas: 123412)
RemoveOwnerAtIndexTest:test_emitsRemoveOwner() (gas: 55524)
RemoveOwnerAtIndexTest:test_removesOwner() (gas: 54784)
RemoveOwnerAtIndexTest:test_removesOwnerAtIndex() (gas: 54540)
RemoveOwnerAtIndexTest:test_revert_whenCalledByNonOwner(address) (runs: 256, μ: 19145, ~: 19145)
RemoveOwnerAtIndexTest:test_revert_whenNoOwnerAtIndex() (gas: 33372)
RemoveOwnerAtIndexTest:test_revert_whenWrongOwnerAtIndex() (gas: 36694)
RemoveOwnerAtIndexTest:test_reverts_ifIsLastOwner() (gas: 7471805)
TestCanSkipChainIdValidation:test_approvedSelectorsReturnTrue() (gas: 15845)
TestCanSkipChainIdValidation:test_otherSelectorsReturnFalse() (gas: 12469)
TestExecuteWithoutChainIdValidation:testExecute() (gas: 424837)
TestExecuteWithoutChainIdValidation:testExecuteBatch() (gas: 728897)
TestExecuteWithoutChainIdValidation:testExecuteBatch(uint256) (runs: 256, μ: 3612753, ~: 3472828)
TestExecuteWithoutChainIdValidation:test__codesize() (gas: 49960)
TestExecuteWithoutChainIdValidation:test__codesize() (gas: 50195)
TestExecuteWithoutChainIdValidation:test_revertsWithReservedNonce() (gas: 82347)
TestExecuteWithoutChainIdValidation:test_reverts_whenCallerNotEntryPoint() (gas: 11053)
TestExecuteWithoutChainIdValidation:test_reverts_whenOneCallReverts() (gas: 467906)
TestExecuteWithoutChainIdValidation:test_reverts_whenOneSelectorNotApproved() (gas: 179678)
TestExecuteWithoutChainIdValidation:test_reverts_whenSelectorNotApproved() (gas: 106769)
TestExecuteWithoutChainIdValidation:test_succeeds_whenSelectorAllowed() (gas: 424367)
TestImplementation:testImplementation() (gas: 12623)
TestInitialize:testInitialize() (gas: 21034)
TestInitialize:test_cannotInitImplementation() (gas: 2899105)
TestIsValidSignature:testReturnsInvalidIfPasskeySigButWrongOwnerLength() (gas: 40187)
TestIsValidSignature:testRevertsIfEthereumSignatureButWrongOwnerLength() (gas: 24040)
TestIsValidSignature:testRevertsIfOwnerIsInvalidEthereumAddress() (gas: 22021)
TestIsValidSignature:testSmartWalletSigner() (gas: 3174740)
TestIsValidSignature:testValidateSignatureWithEOASigner() (gas: 24922)
TestIsValidSignature:testValidateSignatureWithEOASignerFailsWithWrongSigner() (gas: 23877)
TestIsValidSignature:testValidateSignatureWithPasskeySigner() (gas: 423238)
TestIsValidSignature:testValidateSignatureWithPasskeySignerFailsBadOwnerIndex() (gas: 35664)
TestIsValidSignature:testValidateSignatureWithPasskeySignerFailsWithWrongBadSignature() (gas: 430704)
TestUpgradeToAndCall:testUpgradeToAndCall() (gas: 25477)
TestValidateUserOp:test_reverts_whenReplayableNonceKeyInvalidForSelector() (gas: 14551)
TestValidateUserOp:test_reverts_whenSelectorInvalidForReplayableNonceKey() (gas: 14816)
TestValidateUserOp:test_succeedsWithEOASigner() (gas: 447664)
TestValidateUserOp:test_succeedsWithPasskeySigner() (gas: 785032)
RemoveLastOwnerTest:test_emitsRemoveOwner() (gas: 50363)
RemoveLastOwnerTest:test_removesOwner() (gas: 49657)
RemoveLastOwnerTest:test_removesOwnerAtIndex() (gas: 49588)
RemoveLastOwnerTest:test_revert_whenCalledByNonOwner(address) (runs: 257, μ: 19094, ~: 19094)
RemoveLastOwnerTest:test_revert_whenNoOwnerAtIndex() (gas: 48407)
RemoveLastOwnerTest:test_revert_whenWrongOwnerAtIndex() (gas: 34181)
RemoveLastOwnerTest:test_reverts_whenNotLastOwner() (gas: 123462)
RemoveOwnerAtIndexTest:test_emitsRemoveOwner() (gas: 55549)
RemoveOwnerAtIndexTest:test_removesOwner() (gas: 54828)
RemoveOwnerAtIndexTest:test_removesOwnerAtIndex() (gas: 54566)
RemoveOwnerAtIndexTest:test_revert_whenCalledByNonOwner(address) (runs: 257, μ: 19145, ~: 19145)
RemoveOwnerAtIndexTest:test_revert_whenNoOwnerAtIndex() (gas: 33406)
RemoveOwnerAtIndexTest:test_revert_whenWrongOwnerAtIndex() (gas: 36728)
RemoveOwnerAtIndexTest:test_reverts_ifIsLastOwner() (gas: 7647492)
TestCanSkipChainIdValidation:test_approvedSelectorsReturnTrue() (gas: 17781)
TestCanSkipChainIdValidation:test_otherSelectorsReturnFalse() (gas: 12579)
TestExecuteWithoutChainIdValidation:testExecute() (gas: 403873)
TestExecuteWithoutChainIdValidation:testExecuteBatch() (gas: 728942)
TestExecuteWithoutChainIdValidation:testExecuteBatch(uint256) (runs: 257, μ: 3628778, ~: 3584759)
TestExecuteWithoutChainIdValidation:test__codesize() (gas: 50211)
TestExecuteWithoutChainIdValidation:test_revertsWithReservedNonce() (gas: 81941)
TestExecuteWithoutChainIdValidation:test_reverts_whenCallerNotEntryPoint() (gas: 11031)
TestExecuteWithoutChainIdValidation:test_reverts_whenOneCallReverts() (gas: 467783)
TestExecuteWithoutChainIdValidation:test_reverts_whenOneSelectorNotApproved() (gas: 179662)
TestExecuteWithoutChainIdValidation:test_reverts_whenSelectorNotApproved() (gas: 106736)
TestExecuteWithoutChainIdValidation:test_succeeds_whenSelectorAllowed() (gas: 423963)
TestImplementation:testImplementation() (gas: 12558)
TestInitialize:testInitialize() (gas: 21012)
TestInitialize:test_cannotInitImplementation() (gas: 2896342)
TestIsValidSignature:testReturnsInvalidIfPasskeySigButWrongOwnerLength() (gas: 40165)
TestIsValidSignature:testRevertsIfEthereumSignatureButWrongOwnerLength() (gas: 24018)
TestIsValidSignature:testRevertsIfOwnerIsInvalidEthereumAddress() (gas: 21999)
TestIsValidSignature:testSmartWalletSigner() (gas: 3177948)
TestIsValidSignature:testValidateSignatureWithEOASigner() (gas: 24900)
TestIsValidSignature:testValidateSignatureWithEOASignerFailsWithWrongSigner() (gas: 23855)
TestIsValidSignature:testValidateSignatureWithPasskeySigner() (gas: 437729)
TestIsValidSignature:testValidateSignatureWithPasskeySignerFailsBadOwnerIndex() (gas: 35642)
TestIsValidSignature:testValidateSignatureWithPasskeySignerFailsWithWrongBadSignature() (gas: 428169)
TestUpgradeToAndCall:testUpgradeToAndCall() (gas: 25499)
TestValidateUserOp:test_reverts_whenReplayableNonceKeyInvalidForSelector() (gas: 14211)
TestValidateUserOp:test_reverts_whenSelectorInvalidForReplayableNonceKey() (gas: 14476)
TestValidateUserOp:test_succeedsWithEOASigner() (gas: 448010)
TestValidateUserOp:test_succeedsWithPasskeySigner() (gas: 785198)
3 changes: 2 additions & 1 deletion .github/workflows/certora.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,6 @@ jobs:
max-parallel: 4
matrix:
params:
- {name: ERC4337Account, command: 'ERC4337Account.conf'}
- {name: ERC4337Account, command: 'ERC4337Account.conf --rule cantInitTwice'}
- {name: ERC4337Account, command: 'ERC4337Account.conf --exclude_rule cantInitTwice'}
- {name: ERC4337AccountInv, command: 'ERC4337AccountInv.conf'}
5 changes: 5 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ jobs:
forge fmt --check
id: fmt

- name: Check snapshot
run: |
forge snapshot --check --tolerance 1
id: snapshot

forge-coverage:
name: Run Coverage Reporting
runs-on: ubuntu-latest
Expand Down
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ out/
/broadcast/*/31337/
/broadcast/**/dry-run/

/broadcast
/broadcast/DeployERC4337Factory.s.sol

# Docs
docs/
Expand All @@ -16,6 +16,4 @@ docs/
.env
.VSCodeCounter/

lib/

.certora_internal/
12 changes: 6 additions & 6 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
[submodule "lib/account-abstraction"]
path = lib/account-abstraction
url = https://github.com/eth-infinitism/account-abstraction
[submodule "lib/FreshCryptoLib"]
path = lib/FreshCryptoLib
url = https://github.com/rdubois-crypto/FreshCryptoLib
[submodule "lib/solady"]
path = lib/solady
url = https://github.com/vectorized/solady
[submodule "lib/webauthn-sol"]
path = lib/webauthn-sol
url = https://github.com/base-org/webauthn-sol
[submodule "lib/openzeppelin-contracts"]
path = lib/openzeppelin-contracts
url = https://github.com/openzeppelin/openzeppelin-contracts
[submodule "lib/webauthn-sol"]
path = lib/webauthn-sol
url = https://github.com/base-org/webauthn-sol
[submodule "lib/safe-singleton-deployer-sol"]
path = lib/safe-singleton-deployer-sol
url = https://github.com/wilsoncusack/safe-singleton-deployer-sol
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
deploy :; source .env && export FOUNDRY_PROFILE=deploy && forge script script/DeployFactory.s.sol --rpc-url $${RPC_URL} --account $${ACCOUNT} --broadcast --verify
28 changes: 21 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
> [!IMPORTANT]
> The code in this repository and its dependencies are still under audit. It is not yet recommended for production use.

# Smart Wallet

This repository contains code for a new, [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) compliant smart contract wallet from Coinbase.
Expand All @@ -11,7 +8,7 @@ It supports
- Cross-chain replayability for owner updates and other actions: sign once, update everywhere.

## Multiple Owners
Our smart wallet supports up to 256 concurrent owners. Each owner can transact independently, without sign off from any other owner.
Our smart wallet supports a practically unlimited number of concurrent owners (max 2^256). Each owner can transact independently, without sign off from any other owner.

Owners are identified as `bytes` to allow both Ethereum address owners and passkey (Secp256r1) public key owners.

Expand Down Expand Up @@ -82,10 +79,10 @@ Today, allowed are
- UUPSUpgradeable.upgradeToAndCall

## Deployments

| Network | CoinbaseSmartWalletFactory Address |
Factory and implementation are deployed via [Safe Singleton Factory](https://github.com/safe-global/safe-singleton-factory), which today will give the same address across 248 chains. See "Deploying" below for instructions on how to deploy to new chains.
| Version | Factory Address |
|-----------|-----------------------------------------|
| Base Sepolia | [0xeD4EAeBDBBA52DBB37259a2b75AbB87abF3a19E8](https://sepolia.basescan.org/address/0xeD4EAeBDBBA52DBB37259a2b75AbB87abF3a19E8) |
| 1 | [0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428a](https://basescan.org/address/0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428a) |


## Developing
Expand All @@ -94,5 +91,22 @@ After cloning the repo, run the tests using Forge, from [Foundry](https://github
forge test
```

## Deploying
To deploy on a new chain, in your `.env` set
```bash
#`cast wallet` name
ACCOUNT=
# Node RPC URL
RPC_URL=
# Optional Etherscan API key for contract verification
ETHERSCAN_API_KEY=
```
See [here](https://book.getfoundry.sh/reference/cast/cast-wallet-import) for more details on `cast wallet`.

Then run
```
make deploy
```

## Influences
Much of the code in this repository started from Solady's [ERC4337](https://github.com/Vectorized/solady/blob/main/src/accounts/ERC4337.sol) implementation. We were also influenced by [DaimoAccount](https://github.com/daimo-eth/daimo/blob/master/packages/contract/src/DaimoAccount.sol), which pioneered using passkey signers on ERC-4337 accounts, and [LightAccount](https://github.com/alchemyplatform/light-account).
Binary file added audits/Cantina-April-2024.pdf
Binary file not shown.
1 change: 1 addition & 0 deletions audits/Code4rena-March-2024.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[View report.](https://code4rena.com/reports/2024-03-coinbase)
61 changes: 61 additions & 0 deletions broadcast/DeployFactory.s.sol/1/run-1714757847.json

Large diffs are not rendered by default.

109 changes: 109 additions & 0 deletions broadcast/DeployFactory.s.sol/1/run-latest.json

Large diffs are not rendered by default.

61 changes: 61 additions & 0 deletions broadcast/DeployFactory.s.sol/10/run-1714743977.json

Large diffs are not rendered by default.

61 changes: 61 additions & 0 deletions broadcast/DeployFactory.s.sol/10/run-1714744077.json

Large diffs are not rendered by default.

115 changes: 115 additions & 0 deletions broadcast/DeployFactory.s.sol/10/run-latest.json

Large diffs are not rendered by default.

113 changes: 113 additions & 0 deletions broadcast/DeployFactory.s.sol/11155111/run-latest.json

Large diffs are not rendered by default.

Loading