diff --git a/.env.example b/.env.example deleted file mode 100644 index 6a3c37b..0000000 --- a/.env.example +++ /dev/null @@ -1,25 +0,0 @@ -SEPOLIA_RPC_URL=asdfasdf -ETHERSCAN_API_KEY=asdfasfs - -# Foundry-Chainlink Toolkit -FCT_PLUGIN_PATH=lib/foundry-chainlink-toolkit - -# Postgres Properties -POSTGRES_USER=chainlink -POSTGRES_PASSWORD=password123456789 -PG_MAX_CONNECTIONS=500 - -# Deploy Properties -PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 -RPC_URL=http://localhost:8545 -CHAINLINK_CONTAINER_NAME=foundry-chainlink-node -COMPOSE_PROJECT_NAME=foundry-chainlink-plugin -# Chainlink Common Properties -ROOT=/chainlink -ETH_CHAIN_ID=1337 -ETH_URL=ws://host.docker.internal:8545 -ETH_HTTP_URL=http://host.docker.internal:8545 -CHAINLINK_TLS_PORT=0 -LOG_LEVEL=debug -SECURE_COOKIES=false -ALLOW_ORIGINS=* diff --git a/.gitignore b/.gitignore index a078a42..264d91c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,15 @@ package-lock.json .DS_Store src/.DS_Store +lib/chainlink-brownie-contracts +lib/contracts +lib/openzeppelin-contracts +lib/openzeppelin-contracts-upgradeable +lib/openzeppelin-contracts-upgradeable +lib/openzeppelin-contracts +lib/contracts +lib/chainlink-brownie-contracts +lib/openzeppelin-contracts-upgradeable +lib/openzeppelin-contracts +lib/contracts +lib/chainlink-brownie-contracts diff --git a/.gitmodules b/.gitmodules index cb79e36..2d7faa0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,7 +7,15 @@ [submodule "lib/forge-std"] path = lib/forge-std url = https://github.com/foundry-rs/forge-std -[submodule "lib/foundry-chainlink-toolkit"] - path = lib/foundry-chainlink-toolkit - url = https://github.com/smartcontractkit/foundry-chainlink-toolkit - branch = feature/integration-automation +[submodule "lib/contracts"] + path = lib/contracts + url = https://github.com/iden3/contracts +[submodule "lib/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "lib/openzeppelin-contracts-upgradeable"] + path = lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable +[submodule "lib/solidity-bytes-utils"] + path = lib/solidity-bytes-utils + url = https://github.com/GNSPS/solidity-bytes-utils diff --git a/Makefile b/Makefile index a464f3a..c6be17b 100644 --- a/Makefile +++ b/Makefile @@ -8,9 +8,14 @@ all: clean remove install update build clean :; forge clean # Remove modules -remove :; rm -rf .gitmodules && rm -rf .git/modules/* && rm -rf lib && touch .gitmodules && git add . && git commit -m "modules" - -install :; forge install smartcontractkit/chainlink-brownie-contracts && forge install rari-capital/solmate && forge install foundry-rs/forge-std +remove :; if exist .gitmodules (del /F /Q .gitmodules) + if exist .git\modules\ (for /D %%i in (.git\modules\*) do rmdir /S /Q "%%i") + if exist lib (rmdir /S /Q lib) + type nul > .gitmodules + git add . + git commit -m "modules" + +install :; forge install smartcontractkit/chainlink-brownie-contracts && forge install rari-capital/solmate && forge install foundry-rs/forge-std && forge install iden3/contracts && forge install OpenZeppelin/openzeppelin-contracts && forge install OpenZeppelin/openzeppelin-contracts-upgradeable && forge install GNSPS/solidity-bytes-utils # Update Dependencies update:; forge update diff --git a/Makefile.windows b/Makefile.windows new file mode 100644 index 0000000..440923b --- /dev/null +++ b/Makefile.windows @@ -0,0 +1,46 @@ +-include .env + +.PHONY: all test clean deploy-anvil + +all: clean remove install update build + +# Clean the repo +clean :; forge clean + +# Remove modules +remove :; if exist .gitmodules (del /F /Q .gitmodules) + if exist .git\modules\ (for /D %%i in (.git\modules\*) do rmdir /S /Q "%%i") + if exist lib (rmdir /S /Q lib) + type nul > .gitmodules + git add . + git commit -m "modules" + +install :; forge install smartcontractkit/chainlink-brownie-contracts && forge install rari-capital/solmate && forge install foundry-rs/forge-std + +# Update Dependencies +update:; forge update + +build:; forge build + +test :; forge test + +snapshot :; forge snapshot + +slither :; slither ./src + +format :; prettier --write src/**/*.sol && prettier --write src/*.sol + +# solhint should be installed globally +lint :; solhint src/**/*.sol && solhint src/*.sol + +anvil :; anvil -m 'test test test test test test test test test test test junk' + +# use the "@" to hide the command from your shell +deploy-sepolia :; @forge script script/${contract}.s.sol:Deploy${contract} --rpc-url ${SEPOLIA_RPC_URL} --private-key ${PRIVATE_KEY} --broadcast --verify --etherscan-api-key ${ETHERSCAN_API_KEY} -vvvv + +# This is the private key of account from the mnemonic from the "make anvil" command +deploy-anvil :; @forge script script/${contract}.s.sol:Deploy${contract} --rpc-url http://localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast + +deploy-all :; make deploy-${network} contract=APIConsumer && make deploy-${network} contract=KeepersCounter && make deploy-${network} contract=PriceFeedConsumer && make deploy-${network} contract=VRFConsumerV2 + +-include ${FCT_PLUGIN_PATH}/makefile-external diff --git a/src/APIConsumer.sol b/SampleContract/APIConsumer.sol similarity index 100% rename from src/APIConsumer.sol rename to SampleContract/APIConsumer.sol diff --git a/src/KeepersCounter.sol b/SampleContract/KeepersCounter.sol similarity index 100% rename from src/KeepersCounter.sol rename to SampleContract/KeepersCounter.sol diff --git a/src/PriceFeedConsumer.sol b/SampleContract/PriceFeedConsumer.sol similarity index 100% rename from src/PriceFeedConsumer.sol rename to SampleContract/PriceFeedConsumer.sol diff --git a/src/VRFConsumerV2.sol b/SampleContract/VRFConsumerV2.sol similarity index 100% rename from src/VRFConsumerV2.sol rename to SampleContract/VRFConsumerV2.sol diff --git a/script/APIConsumer.s.sol b/SampleContract/script/APIConsumer.s.sol similarity index 100% rename from script/APIConsumer.s.sol rename to SampleContract/script/APIConsumer.s.sol diff --git a/script/HelperConfig.sol b/SampleContract/script/HelperConfig.sol similarity index 100% rename from script/HelperConfig.sol rename to SampleContract/script/HelperConfig.sol diff --git a/script/KeepersCounter.s.sol b/SampleContract/script/KeepersCounter.s.sol similarity index 100% rename from script/KeepersCounter.s.sol rename to SampleContract/script/KeepersCounter.s.sol diff --git a/script/PriceFeedConsumer.s.sol b/SampleContract/script/PriceFeedConsumer.s.sol similarity index 100% rename from script/PriceFeedConsumer.s.sol rename to SampleContract/script/PriceFeedConsumer.s.sol diff --git a/script/VRFConsumerV2.s.sol b/SampleContract/script/VRFConsumerV2.s.sol similarity index 100% rename from script/VRFConsumerV2.s.sol rename to SampleContract/script/VRFConsumerV2.s.sol diff --git a/src/test/APIConsumer.t.sol b/SampleContract/test/APIConsumer.t.sol similarity index 100% rename from src/test/APIConsumer.t.sol rename to SampleContract/test/APIConsumer.t.sol diff --git a/src/test/KeepersCounter.t.sol b/SampleContract/test/KeepersCounter.t.sol similarity index 100% rename from src/test/KeepersCounter.t.sol rename to SampleContract/test/KeepersCounter.t.sol diff --git a/src/test/PriceFeedConsumer.t.sol b/SampleContract/test/PriceFeedConsumer.t.sol similarity index 100% rename from src/test/PriceFeedConsumer.t.sol rename to SampleContract/test/PriceFeedConsumer.t.sol diff --git a/src/test/VRFConsumerV2.t.sol b/SampleContract/test/VRFConsumerV2.t.sol similarity index 100% rename from src/test/VRFConsumerV2.t.sol rename to SampleContract/test/VRFConsumerV2.t.sol diff --git a/src/test/mocks/LinkToken.sol b/SampleContract/test/mocks/LinkToken.sol similarity index 100% rename from src/test/mocks/LinkToken.sol rename to SampleContract/test/mocks/LinkToken.sol diff --git a/src/test/mocks/MockOracle.sol b/SampleContract/test/mocks/MockOracle.sol similarity index 100% rename from src/test/mocks/MockOracle.sol rename to SampleContract/test/mocks/MockOracle.sol diff --git a/src/test/mocks/MockV3Aggregator.sol b/SampleContract/test/mocks/MockV3Aggregator.sol similarity index 100% rename from src/test/mocks/MockV3Aggregator.sol rename to SampleContract/test/mocks/MockV3Aggregator.sol diff --git a/src/test/mocks/MockVRFCoordinatorV2.sol b/SampleContract/test/mocks/MockVRFCoordinatorV2.sol similarity index 100% rename from src/test/mocks/MockVRFCoordinatorV2.sol rename to SampleContract/test/mocks/MockVRFCoordinatorV2.sol diff --git a/src/test/utils/Cheats.sol b/SampleContract/test/utils/Cheats.sol similarity index 100% rename from src/test/utils/Cheats.sol rename to SampleContract/test/utils/Cheats.sol diff --git a/lib/chainlink-brownie-contracts b/lib/chainlink-brownie-contracts index 1d301b4..f06ed4c 160000 --- a/lib/chainlink-brownie-contracts +++ b/lib/chainlink-brownie-contracts @@ -1 +1 @@ -Subproject commit 1d301b43d374a23524eca878ffc4f9b1cf8a93d7 +Subproject commit f06ed4c7e43de0359e0e337ce56e55cab90b0178 diff --git a/lib/contracts b/lib/contracts new file mode 160000 index 0000000..0fd9996 --- /dev/null +++ b/lib/contracts @@ -0,0 +1 @@ +Subproject commit 0fd9996bafc488aadcfc9a9d702c83205447e6c8 diff --git a/lib/forge-std b/lib/forge-std index 8d93b52..2f11269 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 8d93b5273ca94b1c50b055ffc0e1b8b0a3c03d78 +Subproject commit 2f112697506eab12d433a65fdc31a639548fe365 diff --git a/lib/foundry-chainlink-toolkit b/lib/foundry-chainlink-toolkit deleted file mode 160000 index caa68b1..0000000 --- a/lib/foundry-chainlink-toolkit +++ /dev/null @@ -1 +0,0 @@ -Subproject commit caa68b15a67340b13f4d1a2147a7c454b3443744 diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts new file mode 160000 index 0000000..78d5708 --- /dev/null +++ b/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit 78d5708340b5ad1aed18c1e97e6d089b7c6f07fd diff --git a/lib/openzeppelin-contracts-upgradeable b/lib/openzeppelin-contracts-upgradeable new file mode 160000 index 0000000..2fae9a5 --- /dev/null +++ b/lib/openzeppelin-contracts-upgradeable @@ -0,0 +1 @@ +Subproject commit 2fae9a5ea178e752862c0fd12857457f572da5d9 diff --git a/lib/solidity-bytes-utils b/lib/solidity-bytes-utils new file mode 160000 index 0000000..6458fb2 --- /dev/null +++ b/lib/solidity-bytes-utils @@ -0,0 +1 @@ +Subproject commit 6458fb2780a3092bc756e737f246be1de6d3d362 diff --git a/lib/solmate b/lib/solmate index 9cf1428..4b47a19 160000 --- a/lib/solmate +++ b/lib/solmate @@ -1 +1 @@ -Subproject commit 9cf1428245074e39090dceacb0c28b1f684f584c +Subproject commit 4b47a19038b798b4a33d9749d25e570443520647 diff --git a/remappings.txt b/remappings.txt index c8dffc5..11b7b7c 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,5 +1,19 @@ -@solmate=lib/solmate/src/ -@std=lib/forge-std/src/ -@clones=lib/clones-with-immutable-args/src/ +@solmate/=lib/solmate/src/ +@std/=lib/forge-std/src/ +@clones/=lib/clones-with-immutable-args/src/ @chainlink/=lib/chainlink-brownie-contracts/ -forge-std/=lib/forge-std/src/ \ No newline at end of file +@contracts/=lib/contracts/contracts/ +@openzeppelin/=lib/openzeppelin-contracts/ +@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ +@solidity-bytes-utils/=lib/solidity-bytes-utils/contracts/ +forge-std/=lib/forge-std/src/contracts/ +@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ +@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ +chainlink-brownie-contracts/=lib/chainlink-brownie-contracts/contracts/src/v0.6/vendor/@arbitrum/nitro-contracts/src/ +ds-test/=lib/forge-std/lib/ds-test/src/ +erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/ +openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/ +openzeppelin-contracts/=lib/openzeppelin-contracts/ +solmate/=lib/solmate/src/ + + diff --git a/src/test/Identity.sol b/src/test/Identity.sol new file mode 100644 index 0000000..fb5ad9f --- /dev/null +++ b/src/test/Identity.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.0 <0.9.0; +import {OwnableUpgradeable} from "@openzeppelin-upgradeable/access/OwnableUpgradeable.sol"; +import {IState} from "@contracts/interfaces/IState.sol"; +import {ClaimBuilder} from "@contracts/lib/ClaimBuilder.sol"; +import {IdentityLib} from "@contracts/lib/IdentityLib.sol"; +import {IdentityBase} from "@contracts/lib/IdentityBase.sol"; + +// /** +// * @dev Contract managing onchain identity +// */ +contract IdentityExample is IdentityBase, OwnableUpgradeable { + using IdentityLib for IdentityLib.Data; + + // This empty reserved space is put in place to allow future versions + // of the State contract to inherit from other contracts without a risk of + // breaking the storage layout. This is necessary because the parent contracts in the + // future may introduce some storage variables, which are placed before the State + // contract's storage variables. + // (see https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#storage-gaps) + // slither-disable-next-line shadowing-state + // slither-disable-next-line unused-state + uint256[500] private __gap; + + function initialize(address _stateContractAddr) public override initializer { + super.initialize(_stateContractAddr); + __Ownable_init(_stateContractAddr); + } + + function addClaimAndTransit(uint256[8] calldata claim) public onlyOwner { + addClaim(claim); + transitState(); + } + + function addClaimHashAndTransit(uint256 hashIndex, uint256 hashValue) public onlyOwner { + addClaimHash(hashIndex, hashValue); + transitState(); + } + + function revokeClaimAndTransit(uint64 revocationNonce) public onlyOwner { + revokeClaim(revocationNonce); + transitState(); + } + + /** + * @dev Add claim + * @param claim - claim data + */ + function addClaim(uint256[8] calldata claim) public virtual onlyOwner { + identity.addClaim(claim); + } + + /** + * @dev Add claim hash + * @param hashIndex - hash of claim index part + * @param hashValue - hash of claim value part + */ + function addClaimHash(uint256 hashIndex, uint256 hashValue) public virtual onlyOwner { + identity.addClaimHash(hashIndex, hashValue); + } + + /** + * @dev Revoke claim using it's revocationNonce + * @param revocationNonce - revocation nonce + */ + function revokeClaim(uint64 revocationNonce) public virtual onlyOwner { + identity.revokeClaim(revocationNonce); + } + + /** + * @dev Make state transition + */ + function transitState() public virtual onlyOwner { + identity.transitState(); + } + + /** + * @dev Calculate IdentityState + * @return IdentityState + */ + function calcIdentityState() public view virtual returns (uint256) { + return identity.calcIdentityState(); + } + + function newClaimData() public pure virtual returns (ClaimBuilder.ClaimData memory) { + ClaimBuilder.ClaimData memory claimData; + return claimData; + } + + /** + * @dev Builds claim + * @param claimData - claim data + * @return binary claim + */ + function buildClaim( + ClaimBuilder.ClaimData calldata claimData + ) public pure virtual returns (uint256[8] memory) { + return ClaimBuilder.build(claimData); + } +} \ No newline at end of file