diff --git a/@openzeppelin_contracts_access_AccessControl_sol_AccessControl.bin b/@openzeppelin_contracts_access_AccessControl_sol_AccessControl.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_access_IAccessControl_sol_IAccessControl.bin b/@openzeppelin_contracts_access_IAccessControl_sol_IAccessControl.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_access_Ownable_sol_Ownable.bin b/@openzeppelin_contracts_access_Ownable_sol_Ownable.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_interfaces_IERC1967_sol_IERC1967.bin b/@openzeppelin_contracts_interfaces_IERC1967_sol_IERC1967.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_interfaces_draft-IERC1822_sol_IERC1822Proxiable.bin b/@openzeppelin_contracts_interfaces_draft-IERC1822_sol_IERC1822Proxiable.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_interfaces_draft-IERC6093_sol_IERC1155Errors.bin b/@openzeppelin_contracts_interfaces_draft-IERC6093_sol_IERC1155Errors.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_interfaces_draft-IERC6093_sol_IERC20Errors.bin b/@openzeppelin_contracts_interfaces_draft-IERC6093_sol_IERC20Errors.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_interfaces_draft-IERC6093_sol_IERC721Errors.bin b/@openzeppelin_contracts_interfaces_draft-IERC6093_sol_IERC721Errors.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_proxy_ERC1967_ERC1967Utils_sol_ERC1967Utils.bin b/@openzeppelin_contracts_proxy_ERC1967_ERC1967Utils_sol_ERC1967Utils.bin
new file mode 100644
index 0000000..ed3ce0a
--- /dev/null
+++ b/@openzeppelin_contracts_proxy_ERC1967_ERC1967Utils_sol_ERC1967Utils.bin
@@ -0,0 +1 @@
+60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212200ccce22ca23377cc0b1d778221f5aab44956ba9d062e27bf88149a6bdfb4e71264736f6c634300081c0033
\ No newline at end of file
diff --git a/@openzeppelin_contracts_proxy_beacon_IBeacon_sol_IBeacon.bin b/@openzeppelin_contracts_proxy_beacon_IBeacon_sol_IBeacon.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_proxy_utils_Initializable_sol_Initializable.bin b/@openzeppelin_contracts_proxy_utils_Initializable_sol_Initializable.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_proxy_utils_UUPSUpgradeable_sol_UUPSUpgradeable.bin b/@openzeppelin_contracts_proxy_utils_UUPSUpgradeable_sol_UUPSUpgradeable.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_token_ERC20_ERC20_sol_ERC20.bin b/@openzeppelin_contracts_token_ERC20_ERC20_sol_ERC20.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_token_ERC20_IERC20_sol_IERC20.bin b/@openzeppelin_contracts_token_ERC20_IERC20_sol_IERC20.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_token_ERC20_extensions_IERC20Metadata_sol_IERC20Metadata.bin b/@openzeppelin_contracts_token_ERC20_extensions_IERC20Metadata_sol_IERC20Metadata.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_utils_Address_sol_Address.bin b/@openzeppelin_contracts_utils_Address_sol_Address.bin
new file mode 100644
index 0000000..1d65379
--- /dev/null
+++ b/@openzeppelin_contracts_utils_Address_sol_Address.bin
@@ -0,0 +1 @@
+60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212208d9ccce19a429a0ac357fc8793646cc7e98d1ef842da4035d66d978f35862e6864736f6c634300081c0033
\ No newline at end of file
diff --git a/@openzeppelin_contracts_utils_Context_sol_Context.bin b/@openzeppelin_contracts_utils_Context_sol_Context.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_utils_Errors_sol_Errors.bin b/@openzeppelin_contracts_utils_Errors_sol_Errors.bin
new file mode 100644
index 0000000..94b0e9a
--- /dev/null
+++ b/@openzeppelin_contracts_utils_Errors_sol_Errors.bin
@@ -0,0 +1 @@
+60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212209e4da8aa5333ac8d389d2e409b786095cfb5076699894c42d09ca4aa483d24be64736f6c634300081c0033
\ No newline at end of file
diff --git a/@openzeppelin_contracts_utils_LowLevelCall_sol_LowLevelCall.bin b/@openzeppelin_contracts_utils_LowLevelCall_sol_LowLevelCall.bin
new file mode 100644
index 0000000..12d18e7
--- /dev/null
+++ b/@openzeppelin_contracts_utils_LowLevelCall_sol_LowLevelCall.bin
@@ -0,0 +1 @@
+60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220240011de465fb7e86ab847e0e16beeb9afa9f4d559f99222e116dc32b84ac34b64736f6c634300081c0033
\ No newline at end of file
diff --git a/@openzeppelin_contracts_utils_Panic_sol_Panic.bin b/@openzeppelin_contracts_utils_Panic_sol_Panic.bin
new file mode 100644
index 0000000..e047b96
--- /dev/null
+++ b/@openzeppelin_contracts_utils_Panic_sol_Panic.bin
@@ -0,0 +1 @@
+60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220cca8e34ba4a10a3072e457ee409c3e14973552ffad66786674cea596605f229764736f6c634300081c0033
\ No newline at end of file
diff --git a/@openzeppelin_contracts_utils_Pausable_sol_Pausable.bin b/@openzeppelin_contracts_utils_Pausable_sol_Pausable.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_utils_ReentrancyGuard_sol_ReentrancyGuard.bin b/@openzeppelin_contracts_utils_ReentrancyGuard_sol_ReentrancyGuard.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_utils_StorageSlot_sol_StorageSlot.bin b/@openzeppelin_contracts_utils_StorageSlot_sol_StorageSlot.bin
new file mode 100644
index 0000000..1ce2a83
--- /dev/null
+++ b/@openzeppelin_contracts_utils_StorageSlot_sol_StorageSlot.bin
@@ -0,0 +1 @@
+60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212202e11909616c8a357ae57cd11f3e744f7b7de3a3174b44a2b6467fa9904f2585764736f6c634300081c0033
\ No newline at end of file
diff --git a/@openzeppelin_contracts_utils_introspection_ERC165_sol_ERC165.bin b/@openzeppelin_contracts_utils_introspection_ERC165_sol_ERC165.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_utils_introspection_IERC165_sol_IERC165.bin b/@openzeppelin_contracts_utils_introspection_IERC165_sol_IERC165.bin
new file mode 100644
index 0000000..e69de29
diff --git a/@openzeppelin_contracts_utils_math_Math_sol_Math.bin b/@openzeppelin_contracts_utils_math_Math_sol_Math.bin
new file mode 100644
index 0000000..c40f340
--- /dev/null
+++ b/@openzeppelin_contracts_utils_math_Math_sol_Math.bin
@@ -0,0 +1 @@
+60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122091005e0c663891cd7c55899184f368372b30b74607e9cbbb4e1eb5ac7371189564736f6c634300081c0033
\ No newline at end of file
diff --git a/@openzeppelin_contracts_utils_math_SafeCast_sol_SafeCast.bin b/@openzeppelin_contracts_utils_math_SafeCast_sol_SafeCast.bin
new file mode 100644
index 0000000..e6e3399
--- /dev/null
+++ b/@openzeppelin_contracts_utils_math_SafeCast_sol_SafeCast.bin
@@ -0,0 +1 @@
+60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212206e23643c396df695b2797f650857ef0eb0576e47d97a4599ed83883f99aad72664736f6c634300081c0033
\ No newline at end of file
diff --git a/contracts/TruthBounty.sol b/contracts/TruthBounty.sol
index 0b3a032..a2b195d 100644
--- a/contracts/TruthBounty.sol
+++ b/contracts/TruthBounty.sol
@@ -6,6 +6,7 @@ import "@openzeppelin/contracts/access/AccessControl.sol";
import "./utils/ResolverRoleTimelock.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
+import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import "./governance/GovernanceOwnable.sol";
@@ -267,7 +268,16 @@ contract TruthBounty is AccessControl, ReentrancyGuard, Pausable, GovernanceOwna
_setRoleAdmin(TREASURY_ROLE, ADMIN_ROLE);
_setRoleAdmin(PAUSER_ROLE, ADMIN_ROLE);
- _initializeGovernance(_governanceController, initialAdmin, initialAdmin);
+ function _resolverRole() internal pure override returns (bytes32) {
+ return RESOLVER_ROLE;
+ }
+
+ function _percentOf(uint256 value, uint256 percent) internal pure returns (uint256) {
+ return Math.mulDiv(value, percent, 100);
+ }
+
+ function grantRole(bytes32 role, address account) public override(AccessControl, ResolverRoleTimelock) {
+ ResolverRoleTimelock.grantRole(role, account);
}
// ── Core Functions ─────────────────────────────────────────────────────
@@ -343,6 +353,33 @@ contract TruthBounty is AccessControl, ReentrancyGuard, Pausable, GovernanceOwna
emit ClaimSettled(claimId, passed, claim.totalStakedFor, claim.totalStakedAgainst, rewardAmount, slashedAmount);
}
+ function _determineOutcome(uint256 stakedFor, uint256 stakedAgainst) internal view returns (bool) {
+ uint256 totalStake = stakedFor + stakedAgainst;
+ if (totalStake == 0) return false;
+ uint256 forPercent = (stakedFor * 100) / totalStake;
+ return forPercent >= settlementThresholdPercent;
+ }
+
+ function _calculateSettlement(uint256 claimId, bool passed) internal returns (uint256 rewardAmount, uint256 slashedAmount) {
+ Claim storage claim = claims[claimId];
+ uint256 winnerStake = passed ? claim.totalStakedFor : claim.totalStakedAgainst;
+ uint256 loserStake = passed ? claim.totalStakedAgainst : claim.totalStakedFor;
+
+ slashedAmount = _percentOf(loserStake, slashPercent);
+ rewardAmount = _percentOf(slashedAmount, rewardPercent);
+
+ totalSlashed += slashedAmount;
+ totalRewarded += rewardAmount;
+
+ settlementResults[claimId] = SettlementResult({
+ passed: passed,
+ totalRewards: rewardAmount,
+ totalSlashed: slashedAmount,
+ winnerStake: winnerStake,
+ loserStake: loserStake
+ });
+ }
+
function claimSettlementRewards(uint256 claimId) external nonReentrant whenNotPaused {
Claim storage claim = claims[claimId];
require(claim.settled, "Claim not settled");
@@ -382,8 +419,11 @@ contract TruthBounty is AccessControl, ReentrancyGuard, Pausable, GovernanceOwna
bool isWinner = (v.support == settlement.passed);
require(!isWinner, "Winners should use claimSettlementRewards");
- uint256 slashedAmount = (v.stakeAmount * slashPercent) / 100;
- uint256 returnAmount = v.stakeAmount - slashedAmount;
+ // Calculate slashed portion
+ uint256 slashedAmount = _percentOf(vote.stakeAmount, slashPercent);
+ uint256 returnAmount = vote.stakeAmount - slashedAmount;
+
+ vote.stakeReturned = true;
v.stakeReturned = true;
verifierStakes[msg.sender].activeStakes -= v.stakeAmount;
diff --git a/contracts/TruthBountyWeighted.sol b/contracts/TruthBountyWeighted.sol
index 65298c5..c453061 100644
--- a/contracts/TruthBountyWeighted.sol
+++ b/contracts/TruthBountyWeighted.sol
@@ -6,6 +6,7 @@ import "@openzeppelin/contracts/access/AccessControl.sol";
import "./utils/ResolverRoleTimelock.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
+import "@openzeppelin/contracts/utils/math/Math.sol";
import "./IReputationOracle.sol";
import "./governance/GovernanceOwnable.sol";
@@ -39,6 +40,10 @@ contract TruthBountyWeighted is ResolverRoleTimelock, ReentrancyGuard, Pausable,
/// @notice Denominator for percentage-based governance parameters.
uint256 public constant PERCENT_DENOMINATOR = 100;
+ function _percentOf(uint256 value, uint256 percent) internal pure returns (uint256) {
+ return Math.mulDiv(value, percent, PERCENT_DENOMINATOR);
+ }
+
/// @notice Default verification window for new claims.
uint256 public constant DEFAULT_VERIFICATION_WINDOW_DURATION = 7 days;
@@ -223,6 +228,7 @@ contract TruthBountyWeighted is ResolverRoleTimelock, ReentrancyGuard, Pausable,
event StakeWithdrawn(address indexed verifier, uint256 amount);
event ReputationOracleUpdated(address indexed oldOracle, address indexed newOracle);
event ReputationBoundsUpdated(uint256 minScore, uint256 maxScore);
+ event ReputationUpdateGracePeriodUpdated(uint256 newGracePeriod);
event WeightedStakingToggled(bool enabled);
event DefaultReputationScoreUpdated(uint256 oldScore, uint256 newScore);
event ReputationSnapshotRecorded(address indexed user, uint256 reputationScore, uint256 timestamp);
@@ -812,12 +818,12 @@ contract TruthBountyWeighted is ResolverRoleTimelock, ReentrancyGuard, Pausable,
uint256 loserRawStake = _calculateLoserRawStake(claimId, passed);
// Slash the configured percentage of losing raw stake.
- slashedAmount = (loserRawStake * slashPercent) / PERCENT_DENOMINATOR;
+ slashedAmount = _percentOf(loserRawStake, slashPercent);
// Calculate and assign per-vote slash amounts, returns total slashed
slashedAmount = _assignPerVoteSlashes(claimId, passed);
// The configured reward share of slashed stake goes to winners.
- rewardAmount = (slashedAmount * rewardPercent) / PERCENT_DENOMINATOR;
+ rewardAmount = _percentOf(slashedAmount, rewardPercent);
totalSlashed += slashedAmount;
totalRewarded += rewardAmount;
@@ -878,7 +884,7 @@ contract TruthBountyWeighted is ResolverRoleTimelock, ReentrancyGuard, Pausable,
if (isLoser) {
// Calculate slash as the configured percentage of raw stake.
- uint256 slashAmount = (vote.stakeAmount * slashPercent) / PERCENT_DENOMINATOR;
+ uint256 slashAmount = _percentOf(vote.stakeAmount, slashPercent);
vote.slashAmount = slashAmount;
totalSlashed += slashAmount;
} else {
diff --git a/contracts_IReputationOracle_sol_IReputationOracle.bin b/contracts_IReputationOracle_sol_IReputationOracle.bin
new file mode 100644
index 0000000..e69de29
diff --git a/contracts_TruthBountyWeighted_sol_TruthBountyWeighted.bin b/contracts_TruthBountyWeighted_sol_TruthBountyWeighted.bin
new file mode 100644
index 0000000..e2c042f
--- /dev/null
+++ b/contracts_TruthBountyWeighted_sol_TruthBountyWeighted.bin
@@ -0,0 +1 @@
+60806040526002805460ff60a81b1916600160a81b17905562093a80603855610e10603955610037670de0b6b3a764000060646104ca565b603a55603c603b556050603c556014603d556202a300603e55600a670de0b6b3a764000061006591906104ed565b603f5561007b670de0b6b3a7640000600a6104ca565b604055670de0b6b3a76400006041556042805460ff191660011790553480156100a2575f5ffd5b506040516154123803806154128339810160408190526100c191610527565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556001600160a01b0384166101405760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e2061646472657373000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166101965760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206f7261636c652061646472657373000000000000000000006044820152606401610137565b6001600160a01b0382166101ec5760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e206164647265737300000000000000000000006044820152606401610137565b603680546001600160a01b038087166001600160a01b03199283161790925560378054928616929091169190911790556102265f836102fd565b5061023e5f5160206153f25f395f51905f52836102fd565b506102565f5160206153d25f395f51905f52836102fd565b5061028e7f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb15f5160206153f25f395f51905f526103a6565b6102c57fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca95f5160206153f25f395f51905f526103a6565b6102e95f5160206153d25f395f51905f525f5160206153f25f395f51905f526103a6565b6102f48183806103f0565b50505050610578565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661039d575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556103553390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103a0565b505f5b92915050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6001600160a01b0382166104175760405163d92e233d60e01b815260040160405180910390fd5b60028054610100600160a81b0319166101006001600160a01b038681169190910291909117909155600380546001600160a01b0319169183169190911790556104605f836102fd565b506104785f5160206153b25f395f51905f52836102fd565b506001600160a01b038316156104a15761049f5f5160206153925f395f51905f52846102fd565b505b6104c55f5160206153925f395f51905f525f5160206153b25f395f51905f526103a6565b505050565b80820281158282048414176103a057634e487b7160e01b5f52601160045260245ffd5b5f8261050757634e487b7160e01b5f52601260045260245ffd5b500490565b80516001600160a01b0381168114610522575f5ffd5b919050565b5f5f5f5f6080858703121561053a575f5ffd5b6105438561050c565b93506105516020860161050c565b925061055f6040860161050c565b915061056d6060860161050c565b905092959194509250565b614e0d806105855f395ff3fe608060405234801561000f575f5ffd5b5060043610610657575f3560e01c80638e9a4b4c11610341578063cd01bbc4116101ba578063dd4d56ff11610109578063f0179601116100a9578063f794ecc611610084578063f794ecc61461108d578063fad844c114611095578063fefeffcb146110a8578063ff12cb74146110cf575f5ffd5b8063f01796011461105d578063f188768414611070578063f36c8f5c14611079575f5ffd5b8063e63ab1e9116100e4578063e63ab1e914611010578063e855f53514611037578063eb4af0451461104a578063ec6c18fc146108e8575f5ffd5b8063dd4d56ff146107de578063e0ca118414610fd6578063e406f1d814610ffd575f5ffd5b8063d23254b411610174578063d547741f1161014f578063d547741f14610f7e578063d6da2cf714610f91578063da6ff5cf14610fa4578063dafcc71f14610fc3575f5ffd5b8063d23254b414610ec2578063d37f7a0614610f62578063d46a5d7e14610f6b575f5ffd5b8063cd01bbc414610e46578063ce2661f114610e59578063d030205114610e6c578063d111d33114610e75578063d11a57ec14610e88578063d19cfdac14610eaf575f5ffd5b8063a888c2cd11610290578063bc3f931f11610230578063c1c5dd271161020b578063c1c5dd2714610e05578063c2b0889014610e18578063c77943c014610e2b578063ccfb077514610e33575f5ffd5b8063bc3f931f14610d06578063bd6dd26e14610df4578063bdb3c7f614610dfc575f5ffd5b8063aed29d071161026b578063aed29d0714610ce1578063b0351a2014610cea578063b6f31f7b14610cf3578063b862c34e14610a82575f5ffd5b8063a888c2cd14610ca4578063abf02dfe14610ccc578063ad79715814610cd4575f5ffd5b80639e6c2959116102fb578063a2b44393116102d6578063a2b44393146108e8578063a434e98c14610c66578063a694fc3a14610c79578063a84195ea14610c8c575f5ffd5b80639e6c295914610c4e578063a201bbdd14610c56578063a217fddf14610c5f575f5ffd5b80638e9a4b4c14610bdb57806391d1485414610bee57806392947a3c14610c01578063947ec0e014610c2857806397f2d3e114610c315780639e54d8c414610c44575f5ffd5b80634b74b23d116104d357806375b238fc116104225780638244a517116103c2578063841529061161039d5780638415290614610b1c5780638456cb5914610b2f57806384c08ed314610b375780638591567114610b4a575f5ffd5b80638244a51714610ac557806382d9d6e714610ace57806383aa15b614610af5575f5ffd5b806378fab260116103fd57806378fab26014610a6e5780637d96385014610a8257806380de7f9114610a8c578063820c423614610a95575f5ffd5b806375b238fc14610a2057806375feeb7314610a3457806377fb8d7a14610a47575f5ffd5b80635c975abb1161048d57806367e8216e1161046857806367e8216e146109d45780636e532d06146109e757806370905dce146109fa57806375a7d09814610a0d575f5ffd5b80635c975abb146109ad5780636343b15f146109b8578063645d2c41146109c1575f5ffd5b80634b74b23d146109075780634efa8f171461094257806351858e271461094b578063550b25951461095357806357a258031461097a5780635aef24471461098d575f5ffd5b806325d5971f116105a9578063389bea4d116105495780633f4ba83a116105245780633f4ba83a146108e05780633fad8004146108e857806345113548146108f75780634a4e3bd5146108ff575f5ffd5b8063389bea4d146108a657806339260e36146108af5780633e8bf4aa146108d6575f5ffd5b806332b89e6b1161058457806332b89e6b1461085a57806335da33941461086d57806336568abe1461088057806337d1cc8d14610893575f5ffd5b806325d5971f146108095780632d4147e31461081c5780632f2ff15d14610847575f5ffd5b80630fa137f411610614578063157b0f31116105ef578063157b0f311461075d5780631956f01b146107cb578063218b7cba146107de578063248a9ca3146107e7575f5ffd5b80630fa137f4146106d75780631084e0661461070c578063139ae68b14610714575f5ffd5b806301ffc9a71461065b57806303b82d3c146106835780630407ad46146106a457806304c24dbb146106a45780630b3978fc146106ae5780630cbb2aea146106c2575b5f5ffd5b61066e610669366004614619565b6110d6565b60405190151581526020015b60405180910390f35b610696610691366004614664565b61110c565b60405190815260200161067a565b61069662278d0081565b60025461066e90600160a81b900460ff1681565b6106d56106d03660046146a2565b611218565b005b6106ea6106e53660046146d7565b6112d1565b604080518251815260208084015190820152918101519082015260600161067a565b610696601481565b6107426107223660046146d7565b60466020525f908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161067a565b6107b061076b3660046146d7565b604080518082019091525f8082526020820152506001600160a01b03165f90815260486020908152604091829020825180840190935280548352600101549082015290565b6040805182518152602092830151928101929092520161067a565b6106d56107d93660046146f0565b611333565b610696610e1081565b6106966107f536600461470b565b5f9081526020819052604090206001015490565b6106d561081736600461470b565b611393565b60365461082f906001600160a01b031681565b6040516001600160a01b03909116815260200161067a565b6106d5610855366004614722565b6115fa565b6106d561086836600461470b565b611608565b6106d561087b3660046146d7565b611718565b6106d561088e366004614722565b61179b565b6106d56108a136600461470b565b6117d3565b61069660415481565b6106967f15d68302491e4db51ed415aab114a2a9a6e7c7cc6ad7ee44eaf9b0504a3966c681565b6106966201518081565b6106d5611adb565b610696670de0b6b3a764000081565b610696611b0d565b6106d5611b23565b61092d6109153660046146d7565b60486020525f90815260409020805460019091015482565b6040805192835260208301919091520161067a565b61069660495481565b6106d5611b88565b6106967f40d8bfdf1085b28330a6753bdac4a0b338fcaef883a9b001eeae9ef9c4344ab381565b610696610988366004614743565b611beb565b6109a061099b36600461470b565b611cb0565b60405161067a9190614799565b60025460ff1661066e565b610696603d5481565b6106d56109cf36600461470b565b611e14565b6106d56109e23660046146d7565b611f17565b61092d6109f5366004614830565b611f22565b60035461082f906001600160a01b031681565b6106d5610a1b36600461470b565b611f42565b6106965f516020614db85f395f51905f5281565b6106d5610a423660046146d7565b612044565b6106967fe7e0b301de1c1e268073a6b56ff0876cffca0becba0dca08f945c1394e3e972781565b6106965f516020614d385f395f51905f5281565b6106966202a30081565b61069660395481565b610aa8610aa3366004614830565b61214e565b60408051931515845260208401929092529082015260600161067a565b610696603b5481565b6106967f0b702e9ee16b785379e8bf860894ce33331f02aed2185a61adb51746a8a6f0ae81565b6106967ffc730eaab7fd4dfcf32eb626fe0d572338ee16fd74995c77d66320f34c6df2d481565b6106d5610b2a3660046146d7565b6121ba565b6106d561227d565b610696610b4536600461485e565b6122af565b610b9e610b5836600461470b565b60446020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff909616969495939492939192909188565b6040805198151589526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161067a565b6106d5610be936600461470b565b612401565b61066e610bfc366004614722565b6124fe565b6106967fa3102d30c85745158158c7553902fa34e0d422e59c5847d67eb1d1518f2a056081565b61069660405481565b6106d5610c3f36600461470b565b612526565b61069662093a8081565b610696606481565b610696604a5481565b6106965f81565b610696610c743660046146a2565b612627565b6106d5610c8736600461470b565b61267d565b60025461082f9061010090046001600160a01b031681565b610cb7610cb236600461470b565b6127f9565b60405161067a99989796959493929190614911565b610696603c81565b60425461066e9060ff1681565b610696604b5481565b610696603e5481565b610696610d013660046146d7565b6128d6565b610de7610d14366004614722565b60408051610100810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152505f8281526045602090815260408083206001600160a01b038516845282529182902082516101008082018552825460ff8082161515845290829004811615159483019490945260018301549482019490945260028201546060820152600382015460808201526004820154808416151560a083015293909304909116151560c08301526005015460e082015292915050565b60405161067a919061496f565b610696605081565b610696603f5481565b6106d5610e1336600461470b565b612935565b6106d5610e263660046149d5565b612a30565b610696612ab8565b6106d5610e4136600461470b565b612acb565b610696610e543660046146d7565b612f4a565b6106d5610e673660046146f0565b612fa9565b610696603c5481565b6106d5610e833660046149f5565b612ffc565b6106967fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca981565b6106d5610ebd3660046146d7565b613036565b610f21610ed0366004614722565b604560209081525f928352604080842090915290825290208054600182015460028301546003840154600485015460059095015460ff80861696610100968790048216968183169391049091169088565b60408051981515895296151560208901529587019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000161067a565b61069660385481565b6106d5610f79366004614a39565b6130c6565b6106d5610f8c366004614722565b6130f9565b6106d5610f9f36600461470b565b613103565b610696610fb236600461470b565b60016020525f908152604090205481565b610742610fd1366004614830565b613161565b6106967f940039135186f9eba0a670a2033b1c3bdc118074ba58bda087df1ec87e8e00c281565b6106d561100b36600461470b565b613185565b6106967f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6106d56110453660046146d7565b613369565b6106d561105836600461470b565b613373565b61066e61106b3660046146d7565b613460565b610696603a5481565b6106965f516020614d585f395f51905f5281565b6106966134a3565b60375461082f906001600160a01b031681565b6106967f907134a3d36001426d877b7e39fadc871ef6218acf943ed95e5a58e44472ec3e81565b6001610696565b5f6001600160e01b03198216637965db0b60e01b148061110657506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6111245f516020614d585f395f51905f52336124fe565b15801561113857506111365f336124fe565b155b801561114f57506003546001600160a01b03163314155b1561116d5760405163e653962160e01b815260040160405180910390fd5b60025461010090046001600160a01b031661119b5760405163d92e233d60e01b815260040160405180910390fd5b60025460405163e2f4f82360e01b81526101009091046001600160a01b03169063e2f4f823906111d19086908690600401614a8e565b6020604051808303815f875af11580156111ed573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112119190614ab4565b9392505050565b61122e5f516020614d385f395f51905f526107f5565b611237816134b6565b5f6112428484612627565b5f81815260016020526040812054919250036112715760405163017c603d60e11b815260040160405180910390fd5b60015f8281526020019081526020015f205f9055836001600160a01b0316817fd25272da91bd0aa1897211e0dc233b5d855af72c8b9c7aaf7bd3c675adb42335856040516112c3911515815260200190565b60405180910390a350505050565b6112f260405180606001604052805f81526020015f81526020015f81525090565b506001600160a01b03165f90815260466020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f516020614db85f395f51905f5261134a816134b6565b6042805460ff19168315159081179091556040519081527fc174868e01e9d4ef87f5038e9e19c12c38b8771d521e328b802429222b44fcb5906020015b60405180910390a15050565b61139b6134c0565b6113a36134db565b335f90815260466020526040902060018101546113c1908390614adf565b815410156114165760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420617661696c61626c65207374616b650000000060448201526064015b60405180910390fd5b80600201545f0361148a5742600282015560405162461bcd60e51b815260206004820152603260248201527f5769746864726177616c20696e697469617465642e20506c65617365207761696044820152713a1019103230bcb99031b7b7b63237bbb71760711b606482015260840161140d565b600281015461149c906202a300614adf565b4210156114dd5760405162461bcd60e51b815260206004820152600f60248201526e436f6f6c646f776e2061637469766560881b604482015260640161140d565b5f600282018190558154839183916114f6908490614af2565b909155505060365460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303815f875af1158015611549573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190614b05565b6115ab5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161140d565b60405182815233907f8108595eb6bad3acefa9da467d90cc2217686d5c5ac85460f8b7849c840645fc9060200160405180910390a2506115f760015f516020614d985f395f51905f5255565b50565b61160482826134ff565b5050565b61161f5f516020614d585f395f51905f52336124fe565b15801561163357506116315f336124fe565b155b801561164a57506003546001600160a01b03163314155b156116685760405163e653962160e01b815260040160405180910390fd5b610e1081108061167a575062278d0081115b1561169857604051630915c82960e21b815260040160405180910390fd5b603e80549082905560408051828152602081018490527fa3102d30c85745158158c7553902fa34e0d422e59c5847d67eb1d1518f2a0560915f516020614d785f395f51905f52910160405180910390a26040518281527fe04ecf8b6841ed2e4e574b7949624d06b703f55afc0c788f8b46ea463f557e0b90602001611387565b5f611722816134b6565b6001600160a01b0382166117495760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b038481166001600160a01b0319831681179093556040519116919082907fd33e3f943e596f2b7b99ed1a5330e4ff9e1a603b1c0bf9866f8c83e8ddb065f2905f90a3505050565b6001600160a01b03811633146117c45760405163334bd91960e11b815260040160405180910390fd5b6117ce8282613550565b505050565b6117db6134c0565b5f81815260436020526040902060018101546001600160a01b03166118125760405162461bcd60e51b815260040161140d90614b20565b600581015460ff1661185a5760405162461bcd60e51b815260206004820152601160248201527010db185a5b481b9bdd081cd95d1d1b1959607a1b604482015260640161140d565b5f8281526045602090815260408083203384529091529020805460ff166118b25760405162461bcd60e51b815260206004820152600c60248201526b139bc81d9bdd194818d85cdd60a21b604482015260640161140d565b6004810154610100900460ff16156119055760405162461bcd60e51b815260206004820152601660248201527514dd185ad948185b1c9958591e481c995d1d5c9b995960521b604482015260640161140d565b5f838152604460205260408120805483546005850154929360ff928316151561010090920492909216151514918215611944578460010154915061199b565b8085600101546119549190614af2565b9150336001600160a01b0316877fba00be99b4ba100b19f2c080160ab22c2b8f4d62027d6524c532e7578d7a43b48360405161199291815260200190565b60405180910390a35b60048501805461ff001916610100179055600185810154335f9081526046602052604081209092018054919290916119d4908490614af2565b90915550839050611a0357335f90815260466020526040812080548392906119fd908490614af2565b90915550505b8115611abf5760365460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303815f875af1158015611a57573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614b05565b611abf5760405162461bcd60e51b815260206004820152601560248201527414dd185ad9481d1c985b9cd9995c8819985a5b1959605a1b604482015260640161140d565b5050505050506115f760015f516020614d985f395f51905f5255565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611b05816134b6565b6115f76135c0565b611b20670de0b6b3a7640000600a614b4e565b81565b6003546001600160a01b0316331480611b415750611b415f336124fe565b611b7e5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161140d565b611b866135c0565b565b6003546001600160a01b0316331480611ba65750611ba65f336124fe565b611be35760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161140d565b611b86613612565b5f611c035f516020614d585f395f51905f52336124fe565b158015611c175750611c155f336124fe565b155b8015611c2e57506003546001600160a01b03163314155b15611c4c5760405163e653962160e01b815260040160405180910390fd5b60025461010090046001600160a01b0316611c7a5760405163d92e233d60e01b815260040160405180910390fd5b600254604051638d34372b60e01b81526101009091046001600160a01b031690638d34372b906111d19086908690600401614b65565b611d026040518061012001604052805f81526020015f6001600160a01b03168152602001606081526020015f81526020015f81526020015f151581526020015f81526020015f81526020015f81525090565b5f828152604360209081526040918290208251610120810184528154815260018201546001600160a01b0316928101929092526002810180549293919291840191611d4c90614b80565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7890614b80565b8015611dc35780601f10611d9a57610100808354040283529160200191611dc3565b820191905f5260205f20905b815481529060010190602001808311611da657829003601f168201915b50505091835250506003820154602082015260048201546040820152600582015460ff161515606082015260068201546080820152600782015460a082015260089091015460c09091015292915050565b611e2b5f516020614d585f395f51905f52336124fe565b158015611e3f5750611e3d5f336124fe565b155b8015611e5657506003546001600160a01b03163314155b15611e745760405163e653962160e01b815260040160405180910390fd5b5f81118015611e84575060648111155b611ec25760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081c195c98d95b9d608a1b604482015260640161140d565b603d80549082905560408051828152602081018490527f907134a3d36001426d877b7e39fadc871ef6218acf943ed95e5a58e44472ec3e915f516020614d785f395f51905f5291015b60405180910390a25050565b6115f781600161364f565b5f5f611f2d846137a0565b9050611f3983826138d1565b91509250929050565b611f595f516020614d585f395f51905f52336124fe565b158015611f6d5750611f6b5f336124fe565b155b8015611f8457506003546001600160a01b03163314155b15611fa25760405163e653962160e01b815260040160405180910390fd5b620151808110158015611fb8575062278d008111155b611ff75760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b604482015260640161140d565b603880549082905560408051828152602081018490527f940039135186f9eba0a670a2033b1c3bdc118074ba58bda087df1ec87e8e00c2915f516020614d785f395f51905f529101611f0b565b61204e5f336124fe565b6120895760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015260640161140d565b6001600160a01b0381166120d75760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161140d565b6036546001600160a01b039081169082160361212c5760405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792061637469766560601b604482015260640161140d565b603680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382165f90815260486020908152604080832081518083019092528054825260010154918101919091528190819061218c866137a0565b925080602001514261219e9190614af2565b915084831415806121b05750610e1082115b9350509250925092565b5f6121c4816134b6565b60025461010090046001600160a01b031680156121f4576121f25f516020614d585f395f51905f5282613550565b505b60028054610100600160a81b0319166101006001600160a01b0386169081029190911790915515612238576122365f516020614d585f395f51905f52846138ef565b505b826001600160a01b0316816001600160a01b03167f3b4545e5eddeaf93078116be9179dee76a26c4b60d502de3a660ba7f1277f65c60405160405180910390a3505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6122a7816134b6565b6115f7613612565b5f6122b86134db565b604980545f91826122c883614bb8565b9190505590505f603854426122dd9190614adf565b6040805161012081018252848152336020808301918252828401898152426060850152608084018690525f60a0850181905260c0850181905260e08501819052610100850181905288815260439092529390208251815590516001820180546001600160a01b0319166001600160a01b03909216919091179055915192935091600282019061236c9082614c14565b50606082015160038201556080820151600482015560a082015160058201805460ff191691151591909117905560c0820151600682015560e0820151600782015561010090910151600890910155604051339083907f8fe7139c7f2efce7b3da26b25a3ec60b52665d26d50c52ba8cf039f8e9e14a44906123f09088908690614ccf565b60405180910390a35090505b919050565b6124185f516020614d585f395f51905f52336124fe565b15801561242c575061242a5f336124fe565b155b801561244357506003546001600160a01b03163314155b156124615760405163e653962160e01b815260040160405180910390fd5b5f81118015612471575060648111155b6124b15760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081d1a1c995cda1bdb19607a1b604482015260640161140d565b603b80549082905560408051828152602081018490527f0b702e9ee16b785379e8bf860894ce33331f02aed2185a61adb51746a8a6f0ae915f516020614d785f395f51905f529101611f0b565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b61253d5f516020614d585f395f51905f52336124fe565b158015612551575061254f5f336124fe565b155b801561256857506003546001600160a01b03163314155b156125865760405163e653962160e01b815260040160405180910390fd5b61012c811015801561259b575062093a808111155b6125da5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b604482015260640161140d565b603980549082905560408051828152602081018490527ffc730eaab7fd4dfcf32eb626fe0d572338ee16fd74995c77d66320f34c6df2d4915f516020614d785f395f51905f529101611f0b565b60408051306020808301919091525f516020614d385f395f51905f52828401526001600160a01b039490941660608201529115156080808401919091528151808403909101815260a09092019052805191012090565b6126856134c0565b61268d6134db565b603a548110156126d55760405162461bcd60e51b81526020600482015260136024820152725374616b652062656c6f77206d696e696d756d60681b604482015260640161140d565b6036546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303815f875af1158015612729573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274d9190614b05565b61278b5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161140d565b335f90815260466020526040812080548392906127a9908490614adf565b909155505060405181815233907f0a7bb2e28cc4698aac06db79cf9163bfcc20719286cf59fa7d492ceda1b8edc29060200160405180910390a26115f760015f516020614d985f395f51905f5255565b60436020525f908152604090208054600182015460028301805492936001600160a01b039092169261282a90614b80565b80601f016020809104026020016040519081016040528092919081815260200182805461285690614b80565b80156128a15780601f10612878576101008083540402835291602001916128a1565b820191905f5260205f20905b81548152906001019060200180831161288457829003601f168201915b505050600384015460048501546005860154600687015460078801546008909801549697939692955060ff9091169350919089565b5f6128ed5f516020614d385f395f51905f526107f5565b6128f6816134b6565b61290e5f516020614d385f395f51905f525b846124fe565b61292b576040516305e890c760e01b815260040160405180910390fd5b611211835f613977565b61294c5f516020614d585f395f51905f52336124fe565b158015612960575061295e5f336124fe565b155b801561297757506003546001600160a01b03163314155b156129955760405163e653962160e01b815260040160405180910390fd5b5f811180156129a5575060648111155b6129e35760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081c195c98d95b9d608a1b604482015260640161140d565b603c80549082905560408051828152602081018490527f15d68302491e4db51ed415aab114a2a9a6e7c7cc6ad7ee44eaf9b0504a3966c6915f516020614d785f395f51905f529101611f0b565b5f516020614db85f395f51905f52612a47816134b6565b821580612a545750818310155b15612a725760405163427fa00f60e01b815260040160405180910390fd5b603f83905560408281558051848152602081018490527f32fc046ecb6d2d261ca468e1c5a649ac4ad9e7c5bd0f27cd4df996060f9290be910160405180910390a1505050565b611b20600a670de0b6b3a7640000614d04565b612ad36134c0565b612adb6134db565b5f81815260436020526040902060018101546001600160a01b0316612b125760405162461bcd60e51b815260040161140d90614b20565b600581015460ff16612b5a5760405162461bcd60e51b815260206004820152601160248201527010db185a5b481b9bdd081cd95d1d1b1959607a1b604482015260640161140d565b5f8281526045602090815260408083203384529091529020805460ff16612bb25760405162461bcd60e51b815260206004820152600c60248201526b139bc81d9bdd194818d85cdd60a21b604482015260640161140d565b600481015460ff1615612c075760405162461bcd60e51b815260206004820152601760248201527f5265776172647320616c726561647920636c61696d6564000000000000000000604482015260640161140d565b5f8381526044602052604090206003810154612c525760405162461bcd60e51b815260206004820152600a6024820152694e6f2077696e6e65727360b01b604482015260640161140d565b80548254610100900460ff9081161515911615151480612ca35760405162461bcd60e51b815260206004820152600c60248201526b2737ba1030903bb4b73732b960a11b604482015260640161140d565b5f826003015483600101548560020154612cbd9190614b4e565b612cc79190614d04565b90506001836006015f828254612cdd9190614adf565b90915550506005830154600684015403612d085782600701548360010154612d059190614af2565b90505b80836007015f828254612d1b9190614adf565b909155505060048401805460ff191660011790558015612e245760365460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303815f875af1158015612d83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da79190614b05565b612dec5760405162461bcd60e51b815260206004820152601660248201527514995dd85c99081d1c985b9cd9995c8819985a5b195960521b604482015260640161140d565b604051818152339087907f4cbfa67f54cf0255619787991cb52aa46c0d3ee5cfabb0abf659f2b310f474859060200160405180910390a35b6004840154610100900460ff16612f2f5760048401805461ff001916610100179055600184810154335f908152604660205260408120909201805491929091612e6e908490614af2565b9091555050603654600185015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb906044016020604051808303815f875af1158015612ec7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eeb9190614b05565b612f2f5760405162461bcd60e51b815260206004820152601560248201527414dd185ad9481d1c985b9cd9995c8819985a5b1959605a1b604482015260640161140d565b50505050506115f760015f516020614d985f395f51905f5255565b5f612f615f516020614d385f395f51905f526107f5565b612f6a816134b6565b612f805f516020614d385f395f51905f52612908565b15612f9e576040516305e890c760e01b815260040160405180910390fd5b611211836001613977565b5f612fb3816134b6565b6002805460ff60a81b1916600160a81b841515908102919091179091556040517f920f1adeb0f6efa8584984bf3cb6461ecd85827e6b18b4d99d74840b21a005b5905f90a25050565b6130046134c0565b61300c6134db565b6130198585858585613a22565b61302f60015f516020614d985f395f51905f5255565b5050505050565b5f516020614db85f395f51905f5261304d816134b6565b6001600160a01b038216613074576040516329c711a360e21b815260040160405180910390fd5b603780546001600160a01b038481166001600160a01b0319831681179093556040519116919082907f5b367b86f486a97bb7ae5ed7a92fc670d58bf46c7643345eda46ffa3d0ec6fa4905f90a3505050565b6130ce6134c0565b6130d66134db565b6130e38383835f5f613a22565b6117ce60015f516020614d985f395f51905f5255565b6116048282613ef8565b5f516020614db85f395f51905f5261311a816134b6565b5f821161315b5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a5908191959985d5b1d608a1b604482015260640161140d565b50604155565b5f5f5f61316d856137a0565b915061317984836138d1565b92504290509250925092565b61318d6134c0565b6131956134db565b5f81815260436020526040902060018101546001600160a01b03166131cc5760405162461bcd60e51b815260040161140d90614b20565b60395481600401546131de9190614adf565b42101561322d5760405162461bcd60e51b815260206004820152601a60248201527f436f6e6669726d6174696f6e2064656c61792070656e64696e67000000000000604482015260640161140d565b600581015460ff161561327a5760405162461bcd60e51b815260206004820152601560248201527410db185a5b48185b1c9958591e481cd95d1d1b1959605a1b604482015260640161140d565b5f8160080154116132bd5760405162461bcd60e51b815260206004820152600d60248201526c139bc81d9bdd195cc818d85cdd609a1b604482015260640161140d565b60058101805460ff19166001179055600681015460078201545f916132e191613f49565b90505f5f6132ef8584613f8c565b6006860154600787015460408051881515815260208101939093528201526060810183905260808101829052919350915085907f447c31d40d3af2e96c361a35f666c7c309e1b413bfab6314f99f5d76b4b59e6a9060a00160405180910390a2505050506115f760015f516020614d985f395f51905f5255565b6115f7815f61364f565b61338a5f516020614d585f395f51905f52336124fe565b15801561339e575061339c5f336124fe565b155b80156133b557506003546001600160a01b03163314155b156133d35760405163e653962160e01b815260040160405180910390fd5b5f81116134135760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161140d565b603a80549082905560408051828152602081018490527f40d8bfdf1085b28330a6753bdac4a0b338fcaef883a9b001eeae9ef9c4344ab3915f516020614d785f395f51905f529101611f0b565b5f6134785f516020614d585f395f51905f52836124fe565b8061348857506134885f836124fe565b806111065750506003546001600160a01b0390811691161490565b611b20670de0b6b3a76400006064614b4e565b6115f781336140e4565b6134c861411d565b60025f516020614d985f395f51905f5255565b60025460ff1615611b865760405163d93c066560e01b815260040160405180910390fd5b5f82815260208190526040902060010154613519816134b6565b5f516020614d385f395f51905f52830361354657604051637f95d39f60e01b815260040160405180910390fd5b6117ce838361414c565b5f61355b83836124fe565b156135b9575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001611106565b505f611106565b6135c8614176565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61361a6134db565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586135f53390565b5f61365a8383612627565b5f8181526001602052604081205491925081900361368b5760405163017c603d60e11b815260040160405180910390fd5b804210156136af57604051637f26f8ff60e01b81526004810182905260240161140d565b5f828152600160205260408120558215613716576136db5f516020614d385f395f51905f525b856124fe565b156136f9576040516305e890c760e01b815260040160405180910390fd5b6137105f516020614d385f395f51905f52856138ef565b50613762565b61372c5f516020614d385f395f51905f526136d5565b613749576040516305e890c760e01b815260040160405180910390fd5b6137605f516020614d385f395f51905f5285613550565b505b836001600160a01b0316827fb1c135628e84cbdb9191baf90d328a496f2b9316420bce3ffb41770250d6fa52856040516112c3911515815260200190565b6042545f9060ff166137bb5750670de0b6b3a7640000919050565b60375f9054906101000a90046001600160a01b03166001600160a01b03166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613829575060408051601f3d908101601f1916820190925261382691810190614b05565b60015b61383557505060415490565b80613844575050604154919050565b50603754604051631d699f5760e21b81526001600160a01b038481166004830152909116906375a67d5c90602401602060405180830381865afa9250505080156138ab575060408051601f3d908101601f191682019092526138a891810190614ab4565b60015b6138b757505060415490565b805f036138c8575050604154919050565b61121181614199565b5f670de0b6b3a76400006138e58385614b4e565b6112119190614d04565b5f6138fa83836124fe565b6135b9575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561392f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001611106565b5f6139828383612627565b5f81815260016020526040902054909150156139b15760405163a559d95b60e01b815260040160405180910390fd5b5f6139bf6202a30042614adf565b5f83815260016020908152604091829020839055815186151581529081018390529192506001600160a01b0386169184917f0a54b76d9e7ca8c07b662a9ab90ed367b94496ea4e563cbfb06de6b7dee143c3910160405180910390a35092915050565b5f85815260436020526040902060018101546001600160a01b0316613a595760405162461bcd60e51b815260040161140d90614b20565b80600401544210613aac5760405162461bcd60e51b815260206004820152601a60248201527f566572696669636174696f6e2077696e646f7720636c6f736564000000000000604482015260640161140d565b600581015460ff1615613af95760405162461bcd60e51b815260206004820152601560248201527410db185a5b48185b1c9958591e481cd95d1d1b1959605a1b604482015260640161140d565b5f86815260456020908152604080832033845290915290205460ff1615613b525760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b604482015260640161140d565b603a54841015613b9a5760405162461bcd60e51b81526020600482015260136024820152725374616b652062656c6f77206d696e696d756d60681b604482015260640161140d565b335f90815260466020526040902060010154613bb7908590614adf565b335f908152604660205260409020541015613c145760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420617661696c61626c65207374616b6500000000604482015260640161140d565b5f613c1e336137a0565b90508315613c3257613c32338286866141c2565b5f613c3d86836138d1565b335f90815260466020526040812060010180549293508892909190613c63908490614adf565b9250508190555060405180610100016040528060011515815260200188151581526020018781526020018281526020018381526020015f151581526020015f151581526020015f81525060455f8a81526020019081526020015f205f336001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548160ff02191690831515021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015f6101000a81548160ff02191690831515021790555060c08201518160040160016101000a81548160ff02191690831515021790555060e0820151816005015590505060405180604001604052808381526020014281525060485f336001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015560208201518160010155905050336001600160a01b03167fb547ab1384ab8f129db037bffcce88db057673a7b359f4181e2c74bb0a85e6268342604051613e16929190918252602082015260400190565b60405180910390a25f8881526047602090815260408220805460018101825590835291200180546001600160a01b031916331790558615613e6f5780836006015f828254613e649190614adf565b90915550613e889050565b80836007015f828254613e829190614adf565b90915550505b85836008015f828254613e9b9190614adf565b90915550506040805188151581526020810188905290810182905260608101839052339089907f6f6f95f30a8e58dcbd04046390ab11f621176801303e8fd816ddb1002c0004d99060800160405180910390a35050505050505050565b5f82815260208190526040902060010154613f12816134b6565b5f516020614d385f395f51905f528303613f3f57604051637f95d39f60e01b815260040160405180910390fd5b6117ce8383614350565b5f80613f558385614adf565b9050805f03613f67575f915050611106565b5f81613f74606487614b4e565b613f7e9190614d04565b603b54111595945050505050565b5f82815260436020526040812081908184613fab578160070154613fb1565b81600601545b90505f85613fc3578260060154613fc9565b82600701545b90505f613fd68888614374565b9050613fe481603d546143e7565b9450613ff088886143f4565b9450613ffe85603c546143e7565b955084604a5f8282546140119190614adf565b9250508190555085604b5f8282546140299190614adf565b9250508190555060405180610100016040528088151581526020018781526020018681526020018481526020018381526020016140668a8a6144ae565b81525f602080830182905260409283018290529a815260448b528190208251815460ff19169015151781559982015160018b015581015160028a0155606081015160038a0155608081015160048a015560a081015160058a015560c081015160068a015560e001516007909801979097555092959194509092505050565b6140ee82826124fe565b6116045760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161140d565b5f516020614d985f395f51905f5254600203611b8657604051633ee5aeb560e01b815260040160405180910390fd5b5f82815260208190526040902060010154614166816134b6565b61417083836138ef565b50505050565b60025460ff16611b8657604051638dfc202b60e01b815260040160405180910390fd5b5f603f548210156141ac575050603f5490565b6040548211156141be57505060405490565b5090565b6001600160a01b0384165f9081526048602090815260408083208151808301909252805482526001015491810182905291036141fe5750614170565b81156142a0575f83851161421b576142168585614af2565b614225565b6142258486614af2565b90505f8461423583612710614b4e565b61423f9190614d04565b90508381111561429d5760405162461bcd60e51b8152602060048201526024808201527f52657075746174696f6e206368616e676564206d6f7265207468616e20616c6c6044820152631bddd95960e21b606482015260840161140d565b50505b5f8160200151426142b19190614af2565b9050610e108111156142fc5760405162461bcd60e51b815260206004820152601460248201527352657075746174696f6e20746f6f207374616c6560601b604482015260640161140d565b60408051858152602081018790529081018490526001600160a01b038716907fc6ee1d8cf29cb77855ee99348d21850e52cd24f90a18fcc96d1bdef5940487e69060600160405180910390a2505050505050565b5f8281526020819052604090206001015461436a816134b6565b6141708383613550565b5f82815260436020526040812060078101546006820154839161439691614adf565b90505f846143a85782600601546143ae565b82600701545b9050815f036143c2575f9350505050611106565b818184600801546143d39190614b4e565b6143dd9190614d04565b9695505050505050565b5f6112118383606461453c565b5f828152604760205260408120815b81548110156144a6575f82828154811061441f5761441f614d23565b5f9182526020808320909101548883526045825260408084206001600160a01b0390921680855291909252912080549192509060ff61010090910416151586151514801590614494575f6144798360010154603d546143e7565b60058401819055905061448c8188614adf565b96505061449b565b5f60058301555b505050600101614403565b505092915050565b5f828152604760205260408120815b81548110156144a6575f858152604560205260408120835482908590859081106144e9576144e9614d23565b5f918252602080832091909101546001600160a01b031683528201929092526040019020805490915085151561010090910460ff1615150361453357614530600185614adf565b93505b506001016144bd565b5f5f5f61454986866145ec565b91509150815f0361456d5783818161456357614563614cf0565b0492505050611211565b818411614584576145846003851502601118614608565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f60208284031215614629575f5ffd5b81356001600160e01b031981168114611211575f5ffd5b8035601281106123fc575f5ffd5b80356001600160a01b03811681146123fc575f5ffd5b5f5f60408385031215614675575f5ffd5b61467e83614640565b915061468c6020840161464e565b90509250929050565b80151581146115f7575f5ffd5b5f5f604083850312156146b3575f5ffd5b6146bc8361464e565b915060208301356146cc81614695565b809150509250929050565b5f602082840312156146e7575f5ffd5b6112118261464e565b5f60208284031215614700575f5ffd5b813561121181614695565b5f6020828403121561471b575f5ffd5b5035919050565b5f5f60408385031215614733575f5ffd5b8235915061468c6020840161464e565b5f5f60408385031215614754575f5ffd5b61475d83614640565b946020939093013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b60208152815160208201525f60208301516147bf60408401826001600160a01b03169052565b50604083015161012060608401526147db61014084018261476b565b905060608401516080840152608084015160a084015260a084015161480460c085018215159052565b5060c084015160e084015260e08401516101008401526101008401516101208401528091505092915050565b5f5f60408385031215614841575f5ffd5b61475d8361464e565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561486e575f5ffd5b813567ffffffffffffffff811115614884575f5ffd5b8201601f81018413614894575f5ffd5b803567ffffffffffffffff8111156148ae576148ae61484a565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156148dd576148dd61484a565b6040528181528282016020018610156148f4575f5ffd5b816020840160208301375f91810160200191909152949350505050565b8981526001600160a01b0389166020820152610120604082018190525f9061493b9083018a61476b565b606083019890985250608081019590955292151560a085015260c084019190915260e0830152610100909101529392505050565b5f6101008201905082511515825260208301511515602083015260408301516040830152606083015160608301526080830151608083015260a0830151151560a083015260c08301516149c660c084018215159052565b5060e092830151919092015290565b5f5f604083850312156149e6575f5ffd5b50508035926020909101359150565b5f5f5f5f5f60a08688031215614a09575f5ffd5b853594506020860135614a1b81614695565b94979496505050506040830135926060810135926080909101359150565b5f5f5f60608486031215614a4b575f5ffd5b833592506020840135614a5d81614695565b929592945050506040919091013590565b60128110614a8a57634e487b7160e01b5f52602160045260245ffd5b9052565b60408101614a9c8285614a6e565b6001600160a01b039290921660209190910152919050565b5f60208284031215614ac4575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561110657611106614acb565b8181038181111561110657611106614acb565b5f60208284031215614b15575f5ffd5b815161121181614695565b60208082526014908201527310db185a5b48191bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b808202811582820484141761110657611106614acb565b60408101614b738285614a6e565b8260208301529392505050565b600181811c90821680614b9457607f821691505b602082108103614bb257634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60018201614bc957614bc9614acb565b5060010190565b601f8211156117ce57805f5260205f20601f840160051c81016020851015614bf55750805b601f840160051c820191505b8181101561302f575f8155600101614c01565b815167ffffffffffffffff811115614c2e57614c2e61484a565b614c4281614c3c8454614b80565b84614bd0565b6020601f821160018114614c74575f8315614c5d5750848201515b5f19600385901b1c1916600184901b17845561302f565b5f84815260208120601f198516915b82811015614ca35787850151825560209485019460019092019101614c83565b5084821015614cc057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b604081525f614ce1604083018561476b565b90508260208301529392505050565b634e487b7160e01b5f52601260045260245ffd5b5f82614d1e57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffdfe92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb171840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb159d657359512cd63e5622af1c9696c1ba638c643e928d4c04c720f367138015f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220e123cbb62f4338088bbf91b50864b70911a6721cdf3caba1401d0b708458877064736f6c634300081c003371840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb1e7e0b301de1c1e268073a6b56ff0876cffca0becba0dca08f945c1394e3e972765d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775
\ No newline at end of file
diff --git a/contracts_TruthBounty_sol_TruthBounty.bin b/contracts_TruthBounty_sol_TruthBounty.bin
new file mode 100644
index 0000000..09d7ecc
--- /dev/null
+++ b/contracts_TruthBounty_sol_TruthBounty.bin
@@ -0,0 +1 @@
+60a060409081526002805460ff60a81b1916600160a81b17905562093a80603b55610e10603c90815568056bc75e2d63100000603d55603e556050603f556014905534801561004c575f5ffd5b506040516146d53803806146d583398101604081905261006b91610415565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556001600160a01b0383166100ea5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e2061646472657373000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0382166101405760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e2061646472657373000000000000000000000060448201526064016100e1565b6001600160a01b0383166080526101575f8361022d565b5061016f5f5160206146b55f395f51905f528361022d565b506101875f5160206146955f395f51905f528361022d565b506101bf7f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb15f5160206146b55f395f51905f526102d6565b6101f67fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca95f5160206146b55f395f51905f526102d6565b61021a5f5160206146955f395f51905f525f5160206146b55f395f51905f526102d6565b610225818380610320565b505050610455565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166102cd575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556102853390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102d0565b505f5b92915050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6001600160a01b0382166103475760405163d92e233d60e01b815260040160405180910390fd5b60028054610100600160a81b0319166101006001600160a01b038681169190910291909117909155600380546001600160a01b0319169183169190911790556103905f8361022d565b506103a85f5160206146755f395f51905f528361022d565b506001600160a01b038316156103d1576103cf5f5160206146555f395f51905f528461022d565b505b6103f55f5160206146555f395f51905f525f5160206146755f395f51905f526102d6565b505050565b80516001600160a01b0381168114610410575f5ffd5b919050565b5f5f5f60608486031215610427575f5ffd5b610430846103fa565b925061043e602085016103fa565b915061044c604085016103fa565b90509250925092565b6080516141c56104905f395f818161068301528181611532015281816119070152818161247d015281816129d70152612b3701526141c55ff3fe608060405260043610610434575f3560e01c80638415290611610228578063cd01bbc41161012d578063e0ca1184116100b5578063f017960111610079578063f017960114610fe3578063f188768414611002578063f36c8f5c14611017578063fefeffcb14611037578063ff12cb741461106a57610471565b8063e0ca118414610f20578063e406f1d814610f53578063e63ab1e914610f72578063e855f53514610fa5578063eb4af04514610fc457610471565b8063d23254b4116100fc578063d23254b414610e18578063d37f7a0614610ea2578063d46a5d7e14610eb7578063d547741f14610ed6578063da6ff5cf14610ef557610471565b8063cd01bbc414610d92578063ce2661f114610db1578063d030205114610dd0578063d11a57ec14610de557610471565b8063a434e98c116101b0578063aed29d071161017f578063aed29d0714610c1d578063b6f31f7b14610c32578063bc3f931f14610c51578063c1c5dd2714610d54578063ccfb077514610d7357610471565b8063a434e98c14610b87578063a694fc3a14610ba6578063a84195ea14610bc5578063a888c2cd14610be957610471565b80638e9a4b4c116101f75780638e9a4b4c14610b0257806391d1485414610b2157806397f2d3e114610b40578063a201bbdd14610b5f578063a217fddf14610b7457610471565b80638415290614610a3a5780638456cb5914610a5957806384c08ed314610a6d5780638591567114610a8c57610471565b806351858e271161033957806375a7d098116102c15780637d963850116102855780637d9638501461099457806380de7f91146109aa5780638244a517146109bf57806382d9d6e7146109d457806383aa15b614610a0757610471565b806375a7d098146108c457806375b238fc146108e35780637717addd1461091657806377fb8d7a1461094157806378fab2601461097457610471565b80635c975abb116103085780635c975abb1461083b5780636343b15f14610852578063645d2c411461086757806367e8216e1461088657806370905dce146108a557610471565b806351858e27146107a9578063550b2595146107bd57806357a25803146107f05780635aef24471461080f57610471565b80632d4147e3116103bc57806337d1cc8d1161038b57806337d1cc8d1461071a57806339260e36146107395780633f4ba83a1461076c5780634a4e3bd5146107805780634efa8f171461079457610471565b80632d4147e3146106725780632f2ff15d146106bd57806335da3394146106dc57806336568abe146106fb57610471565b80630cbb2aea116104035780630cbb2aea146105455780630fa137f414610564578063139ae68b146105de578063248a9ca31461062557806325d5971f1461065357610471565b806301ffc9a7146104a357806303b82d3c146104d7578063099a04e5146105045780630b3978fc1461052557610471565b366104715760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a906020015b60405180910390a2005b60405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a90602001610467565b3480156104ae575f5ffd5b506104c26104bd366004613af7565b61107d565b60405190151581526020015b60405180910390f35b3480156104e2575f5ffd5b506104f66104f1366004613b40565b6110b3565b6040519081526020016104ce565b34801561050f575f5ffd5b5061052361051e366004613b75565b6111bf565b005b348015610530575f5ffd5b506002546104c290600160a81b900460ff1681565b348015610550575f5ffd5b5061052361055f366004613bac565b6113c8565b34801561056f575f5ffd5b506105c361057e366004613bd8565b604080518082019091525f8082526020820152506001600160a01b03165f90815260396020908152604091829020825180840190935280548352600101549082015290565b604080518251815260209283015192810192909252016104ce565b3480156105e9575f5ffd5b506106106105f8366004613bd8565b60396020525f90815260409020805460019091015482565b604080519283526020830191909152016104ce565b348015610630575f5ffd5b506104f661063f366004613bf3565b5f9081526020819052604090206001015490565b34801561065e575f5ffd5b5061052361066d366004613bf3565b611481565b34801561067d575f5ffd5b506106a57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016104ce565b3480156106c8575f5ffd5b506105236106d7366004613c0a565b611631565b3480156106e7575f5ffd5b506105236106f6366004613bd8565b61163f565b348015610706575f5ffd5b50610523610715366004613c0a565b6116c2565b348015610725575f5ffd5b50610523610734366004613bf3565b6116f5565b348015610744575f5ffd5b506104f67f15d68302491e4db51ed415aab114a2a9a6e7c7cc6ad7ee44eaf9b0504a3966c681565b348015610777575f5ffd5b50610523611a0e565b34801561078b575f5ffd5b50610523611a40565b34801561079f575f5ffd5b506104f660415481565b3480156107b4575f5ffd5b50610523611aa5565b3480156107c8575f5ffd5b506104f67f40d8bfdf1085b28330a6753bdac4a0b338fcaef883a9b001eeae9ef9c4344ab381565b3480156107fb575f5ffd5b506104f661080a366004613c2d565b611b08565b34801561081a575f5ffd5b5061082e610829366004613bf3565b611bcd565b6040516104ce9190613c75565b348015610846575f5ffd5b5060025460ff166104c2565b34801561085d575f5ffd5b506104f660405481565b348015610872575f5ffd5b50610523610881366004613bf3565b611d31565b348015610891575f5ffd5b506105236108a0366004613bd8565b611e33565b3480156108b0575f5ffd5b506003546106a5906001600160a01b031681565b3480156108cf575f5ffd5b506105236108de366004613bf3565b611e3e565b3480156108ee575f5ffd5b506104f67fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b348015610921575f5ffd5b506104f6610930366004613bd8565b603a6020525f908152604090205481565b34801561094c575f5ffd5b506104f67fe7e0b301de1c1e268073a6b56ff0876cffca0becba0dca08f945c1394e3e972781565b34801561097f575f5ffd5b506104f65f5160206141105f395f51905f5281565b34801561099f575f5ffd5b506104f66202a30081565b3480156109b5575f5ffd5b506104f6603c5481565b3480156109ca575f5ffd5b506104f6603e5481565b3480156109df575f5ffd5b506104f67f0b702e9ee16b785379e8bf860894ce33331f02aed2185a61adb51746a8a6f0ae81565b348015610a12575f5ffd5b506104f67ffc730eaab7fd4dfcf32eb626fe0d572338ee16fd74995c77d66320f34c6df2d481565b348015610a45575f5ffd5b50610523610a54366004613bd8565b611f40565b348015610a64575f5ffd5b50610523612003565b348015610a78575f5ffd5b506104f6610a87366004613d20565b612035565b348015610a97575f5ffd5b50610ad8610aa6366004613bf3565b60376020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016104ce565b348015610b0d575f5ffd5b50610523610b1c366004613bf3565b612187565b348015610b2c575f5ffd5b506104c2610b3b366004613c0a565b612284565b348015610b4b575f5ffd5b50610523610b5a366004613bf3565b6122ac565b348015610b6a575f5ffd5b506104f660425481565b348015610b7f575f5ffd5b506104f65f81565b348015610b92575f5ffd5b506104f6610ba1366004613bac565b6123ad565b348015610bb1575f5ffd5b50610523610bc0366004613bf3565b612403565b348015610bd0575f5ffd5b506002546106a59061010090046001600160a01b031681565b348015610bf4575f5ffd5b50610c08610c03366004613bf3565b61259b565b6040516104ce99989796959493929190613dd3565b348015610c28575f5ffd5b506104f660435481565b348015610c3d575f5ffd5b506104f6610c4c366004613bd8565b612678565b348015610c5c575f5ffd5b50610d0b610c6b366004613c0a565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f8281526038602090815260408083206001600160a01b0385168452825291829020825160a081018452815460ff808216151583526101009182900481161515948301949094526001830154948201949094526002909101548083161515606083015292909204161515608082015292915050565b6040516104ce91905f60a0820190508251151582526020830151151560208301526040830151604083015260608301511515606083015260808301511515608083015292915050565b348015610d5f575f5ffd5b50610523610d6e366004613bf3565b6126d7565b348015610d7e575f5ffd5b50610523610d8d366004613bf3565b6127d2565b348015610d9d575f5ffd5b506104f6610dac366004613bd8565b612c08565b348015610dbc575f5ffd5b50610523610dcb366004613e31565b612c67565b348015610ddb575f5ffd5b506104f6603f5481565b348015610df0575f5ffd5b506104f67fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca981565b348015610e23575f5ffd5b50610e74610e32366004613c0a565b603860209081525f928352604080842090915290825290208054600182015460029092015460ff80831693610100938490048216939092808316929190041685565b604080519515158652931515602086015292840191909152151560608301521515608082015260a0016104ce565b348015610ead575f5ffd5b506104f6603b5481565b348015610ec2575f5ffd5b50610523610ed1366004613e4c565b612cba565b348015610ee1575f5ffd5b50610523610ef0366004613c0a565b613043565b348015610f00575f5ffd5b506104f6610f0f366004613bf3565b60016020525f908152604090205481565b348015610f2b575f5ffd5b506104f67f940039135186f9eba0a670a2033b1c3bdc118074ba58bda087df1ec87e8e00c281565b348015610f5e575f5ffd5b50610523610f6d366004613bf3565b61304d565b348015610f7d575f5ffd5b506104f67f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b348015610fb0575f5ffd5b50610523610fbf366004613bd8565b613258565b348015610fcf575f5ffd5b50610523610fde366004613bf3565b613262565b348015610fee575f5ffd5b506104c2610ffd366004613bd8565b61334f565b34801561100d575f5ffd5b506104f6603d5481565b348015611022575f5ffd5b506104f65f5160206141305f395f51905f5281565b348015611042575f5ffd5b506104f67f907134a3d36001426d877b7e39fadc871ef6218acf943ed95e5a58e44472ec3e81565b348015611075575f5ffd5b5060016104f6565b5f6001600160e01b03198216637965db0b60e01b14806110ad57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6110cb5f5160206141305f395f51905f5233612284565b1580156110df57506110dd5f33612284565b155b80156110f657506003546001600160a01b03163314155b156111145760405163e653962160e01b815260040160405180910390fd5b60025461010090046001600160a01b03166111425760405163d92e233d60e01b815260040160405180910390fd5b60025460405163e2f4f82360e01b81526101009091046001600160a01b03169063e2f4f823906111789086908690600401613ea1565b6020604051808303815f875af1158015611194573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b89190613ec7565b9392505050565b7fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca96111e981613392565b6111f161339c565b6001600160a01b0383166112405760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b60448201526064015b60405180910390fd5b5f82116112845760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b6044820152606401611237565b814710156112d45760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74204554482062616c616e636500000000000000006044820152606401611237565b5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f811461131d576040519150601f19603f3d011682016040523d82523d5f602084013e611322565b606091505b50509050806113695760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401611237565b836001600160a01b03167fb3579861130e4da8bb7b87c54d2d139937f23bcd6e4ebed9e75d0f78ab1cc118846040516113a491815260200190565b60405180910390a2506113c360015f5160206141705f395f51905f5255565b505050565b6113de5f5160206141105f395f51905f5261063f565b6113e781613392565b5f6113f284846123ad565b5f81815260016020526040812054919250036114215760405163017c603d60e11b815260040160405180910390fd5b60015f8281526020019081526020015f205f9055836001600160a01b0316817fd25272da91bd0aa1897211e0dc233b5d855af72c8b9c7aaf7bd3c675adb4233585604051611473911515815260200190565b60405180910390a350505050565b61148961339c565b6114916133b7565b335f90815260396020526040902060018101546114af908390613ef2565b815410156114ff5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420617661696c61626c65207374616b65000000006044820152606401611237565b81815f015f8282546115119190613f05565b909155505060405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611580573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a49190613f18565b6115e25760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401611237565b60405182815233907f8108595eb6bad3acefa9da467d90cc2217686d5c5ac85460f8b7849c840645fc9060200160405180910390a25061162e60015f5160206141705f395f51905f5255565b50565b61163b82826133db565b5050565b5f61164981613392565b6001600160a01b0382166116705760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b038481166001600160a01b0319831681179093556040519116919082907fd33e3f943e596f2b7b99ed1a5330e4ff9e1a603b1c0bf9866f8c83e8ddb065f2905f90a3505050565b6001600160a01b03811633146116eb5760405163334bd91960e11b815260040160405180910390fd5b6113c3828261342c565b6116fd61339c565b5f818152603660205260409020600581015460ff166117525760405162461bcd60e51b815260206004820152601160248201527010db185a5b481b9bdd081cd95d1d1b1959607a1b6044820152606401611237565b5f8281526038602090815260408083203384529091529020805460ff166117aa5760405162461bcd60e51b815260206004820152600c60248201526b139bc81d9bdd194818d85cdd60a21b6044820152606401611237565b6002810154610100900460ff16156117fd5760405162461bcd60e51b815260206004820152601660248201527514dd185ad948185b1c9958591e481c995d1d5c9b995960521b6044820152606401611237565b5f83815260376020526040902080548254610100900460ff90811615159116151514801561187f5760405162461bcd60e51b815260206004820152602960248201527f57696e6e6572732073686f756c642075736520636c61696d536574746c656d656044820152686e745265776172647360b81b6064820152608401611237565b5f611890846001015460405461349c565b90505f8185600101546118a39190613f05565b60028601805461ff001916610100179055600186810154335f908152603960205260408120909201805493945090929091906118e0908490613f05565b909155505080156119bd5760405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015611955573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119799190613f18565b6119bd5760405162461bcd60e51b815260206004820152601560248201527414dd185ad9481d1c985b9cd9995c8819985a5b1959605a1b6044820152606401611237565b60405181815233907f8108595eb6bad3acefa9da467d90cc2217686d5c5ac85460f8b7849c840645fc9060200160405180910390a250505050505061162e60015f5160206141705f395f51905f5255565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611a3881613392565b61162e6134a9565b6003546001600160a01b0316331480611a5e5750611a5e5f33612284565b611a9b5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401611237565b611aa36134a9565b565b6003546001600160a01b0316331480611ac35750611ac35f33612284565b611b005760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401611237565b611aa36134fb565b5f611b205f5160206141305f395f51905f5233612284565b158015611b345750611b325f33612284565b155b8015611b4b57506003546001600160a01b03163314155b15611b695760405163e653962160e01b815260040160405180910390fd5b60025461010090046001600160a01b0316611b975760405163d92e233d60e01b815260040160405180910390fd5b600254604051638d34372b60e01b81526101009091046001600160a01b031690638d34372b906111789086908690600401613f33565b611c1f6040518061012001604052805f81526020015f6001600160a01b03168152602001606081526020015f81526020015f81526020015f151581526020015f81526020015f81526020015f81525090565b5f828152603660209081526040918290208251610120810184528154815260018201546001600160a01b0316928101929092526002810180549293919291840191611c6990613f4e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9590613f4e565b8015611ce05780601f10611cb757610100808354040283529160200191611ce0565b820191905f5260205f20905b815481529060010190602001808311611cc357829003601f168201915b50505091835250506003820154602082015260048201546040820152600582015460ff161515606082015260068201546080820152600782015460a082015260089091015460c09091015292915050565b611d485f5160206141305f395f51905f5233612284565b158015611d5c5750611d5a5f33612284565b155b8015611d7357506003546001600160a01b03163314155b15611d915760405163e653962160e01b815260040160405180910390fd5b5f81118015611da1575060648111155b611ddf5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081c195c98d95b9d608a1b6044820152606401611237565b6040805482825581518181526020810184905290917f907134a3d36001426d877b7e39fadc871ef6218acf943ed95e5a58e44472ec3e915f5160206141505f395f51905f5291015b60405180910390a25050565b61162e816001613538565b611e555f5160206141305f395f51905f5233612284565b158015611e695750611e675f33612284565b155b8015611e8057506003546001600160a01b03163314155b15611e9e5760405163e653962160e01b815260040160405180910390fd5b620151808110158015611eb4575062278d008111155b611ef35760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b6044820152606401611237565b603b80549082905560408051828152602081018490527f940039135186f9eba0a670a2033b1c3bdc118074ba58bda087df1ec87e8e00c2915f5160206141505f395f51905f529101611e27565b5f611f4a81613392565b60025461010090046001600160a01b03168015611f7a57611f785f5160206141305f395f51905f528261342c565b505b60028054610100600160a81b0319166101006001600160a01b0386169081029190911790915515611fbe57611fbc5f5160206141305f395f51905f5284613689565b505b826001600160a01b0316816001600160a01b03167f3b4545e5eddeaf93078116be9179dee76a26c4b60d502de3a660ba7f1277f65c60405160405180910390a3505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61202d81613392565b61162e6134fb565b5f61203e6133b7565b604180545f918261204e83613f86565b9190505590505f603b54426120639190613ef2565b6040805161012081018252848152336020808301918252828401898152426060850152608084018690525f60a0850181905260c0850181905260e08501819052610100850181905288815260369092529390208251815590516001820180546001600160a01b0319166001600160a01b0390921691909117905591519293509160028201906120f29082613fe9565b50606082015160038201556080820151600482015560a082015160058201805460ff191691151591909117905560c0820151600682015560e0820151600782015561010090910151600890910155604051339083907f8fe7139c7f2efce7b3da26b25a3ec60b52665d26d50c52ba8cf039f8e9e14a449061217690889086906140a4565b60405180910390a35090505b919050565b61219e5f5160206141305f395f51905f5233612284565b1580156121b257506121b05f33612284565b155b80156121c957506003546001600160a01b03163314155b156121e75760405163e653962160e01b815260040160405180910390fd5b5f811180156121f7575060648111155b6122375760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081d1a1c995cda1bdb19607a1b6044820152606401611237565b603e80549082905560408051828152602081018490527f0b702e9ee16b785379e8bf860894ce33331f02aed2185a61adb51746a8a6f0ae915f5160206141505f395f51905f529101611e27565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6122c35f5160206141305f395f51905f5233612284565b1580156122d757506122d55f33612284565b155b80156122ee57506003546001600160a01b03163314155b1561230c5760405163e653962160e01b815260040160405180910390fd5b61012c8110158015612321575062093a808111155b6123605760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b6044820152606401611237565b603c80549082905560408051828152602081018490527ffc730eaab7fd4dfcf32eb626fe0d572338ee16fd74995c77d66320f34c6df2d4915f5160206141505f395f51905f529101611e27565b60408051306020808301919091525f5160206141105f395f51905f52828401526001600160a01b039490941660608201529115156080808401919091528151808403909101815260a09092019052805191012090565b61240b61339c565b6124136133b7565b603d5481101561245b5760405162461bcd60e51b81526020600482015260136024820152725374616b652062656c6f77206d696e696d756d60681b6044820152606401611237565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af11580156124cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124ef9190613f18565b61252d5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401611237565b335f908152603960205260408120805483929061254b908490613ef2565b909155505060405181815233907f0a7bb2e28cc4698aac06db79cf9163bfcc20719286cf59fa7d492ceda1b8edc29060200160405180910390a261162e60015f5160206141705f395f51905f5255565b60366020525f908152604090208054600182015460028301805492936001600160a01b03909216926125cc90613f4e565b80601f01602080910402602001604051908101604052809291908181526020018280546125f890613f4e565b80156126435780601f1061261a57610100808354040283529160200191612643565b820191905f5260205f20905b81548152906001019060200180831161262657829003601f168201915b505050600384015460048501546005860154600687015460078801546008909801549697939692955060ff9091169350919089565b5f61268f5f5160206141105f395f51905f5261063f565b61269881613392565b6126b05f5160206141105f395f51905f525b84612284565b6126cd576040516305e890c760e01b815260040160405180910390fd5b6111b8835f613711565b6126ee5f5160206141305f395f51905f5233612284565b15801561270257506127005f33612284565b155b801561271957506003546001600160a01b03163314155b156127375760405163e653962160e01b815260040160405180910390fd5b5f81118015612747575060648111155b6127855760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081c195c98d95b9d608a1b6044820152606401611237565b603f80549082905560408051828152602081018490527f15d68302491e4db51ed415aab114a2a9a6e7c7cc6ad7ee44eaf9b0504a3966c6915f5160206141505f395f51905f529101611e27565b6127da61339c565b6127e26133b7565b5f818152603660205260409020600581015460ff166128375760405162461bcd60e51b815260206004820152601160248201527010db185a5b481b9bdd081cd95d1d1b1959607a1b6044820152606401611237565b5f8281526038602090815260408083203384529091529020805460ff1661288f5760405162461bcd60e51b815260206004820152600c60248201526b139bc81d9bdd194818d85cdd60a21b6044820152606401611237565b600281015460ff16156128e45760405162461bcd60e51b815260206004820152601760248201527f5265776172647320616c726561647920636c61696d65640000000000000000006044820152606401611237565b5f838152603760205260409020600381015461292f5760405162461bcd60e51b815260206004820152600a6024820152694e6f2077696e6e65727360b01b6044820152606401611237565b80548254610100900460ff90811615159116151514806129805760405162461bcd60e51b815260206004820152600c60248201526b2737ba1030903bb4b73732b960a11b6044820152606401611237565b5f82600301548360010154856001015461299a91906140c5565b6129a491906140f0565b60028501805460ff1916600117905590508015612ac65760405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612a25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a499190613f18565b612a8e5760405162461bcd60e51b815260206004820152601660248201527514995dd85c99081d1c985b9cd9995c8819985a5b195960521b6044820152606401611237565b604051818152339087907f4cbfa67f54cf0255619787991cb52aa46c0d3ee5cfabb0abf659f2b310f474859060200160405180910390a35b6002840154610100900460ff16612bed5760028401805461ff001916610100179055600184810154335f908152603960205260408120909201805491929091612b10908490613f05565b9091555050600184015460405163a9059cbb60e01b815233600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612b85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ba99190613f18565b612bed5760405162461bcd60e51b815260206004820152601560248201527414dd185ad9481d1c985b9cd9995c8819985a5b1959605a1b6044820152606401611237565b505050505061162e60015f5160206141705f395f51905f5255565b5f612c1f5f5160206141105f395f51905f5261063f565b612c2881613392565b612c3e5f5160206141105f395f51905f526126aa565b15612c5c576040516305e890c760e01b815260040160405180910390fd5b6111b8836001613711565b5f612c7181613392565b6002805460ff60a81b1916600160a81b841515908102919091179091556040517f920f1adeb0f6efa8584984bf3cb6461ecd85827e6b18b4d99d74840b21a005b5905f90a25050565b612cc261339c565b612cca6133b7565b5f83815260366020526040902060018101546001600160a01b0316612d285760405162461bcd60e51b815260206004820152601460248201527310db185a5b48191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401611237565b80600401544210612d7b5760405162461bcd60e51b815260206004820152601a60248201527f566572696669636174696f6e2077696e646f7720636c6f7365640000000000006044820152606401611237565b600581015460ff1615612dc85760405162461bcd60e51b815260206004820152601560248201527410db185a5b48185b1c9958591e481cd95d1d1b1959605a1b6044820152606401611237565b5f84815260386020908152604080832033845290915290205460ff1615612e215760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606401611237565b603d54821015612e695760405162461bcd60e51b81526020600482015260136024820152725374616b652062656c6f77206d696e696d756d60681b6044820152606401611237565b335f90815260396020526040902060010154612e86908390613ef2565b335f908152603960205260409020541015612ee35760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420617661696c61626c65207374616b65000000006044820152606401611237565b335f9081526039602052604081206001018054849290612f04908490613ef2565b90915550506040805160a08101825260018082528515801560208085019182528486018881525f60608701818152608088018281528d835260388552898320338452909452979020955186549351151561010090810261ff0019921515831661ffff19968716171788559151958701959095559551600290950180549151151590960294151590931692169190911791909117909155612fbc5781816006015f828254612fb19190613ef2565b90915550612fd59050565b81816007015f828254612fcf9190613ef2565b90915550505b81816008015f828254612fe89190613ef2565b909155505060408051841515815260208101849052339186917fcbdf6214089cba887ecbf35a0b6a734589959c9763342c756bb2a80ca2bc9f6e910160405180910390a3506113c360015f5160206141705f395f51905f5255565b61163b82826137bc565b61305561339c565b61305d6133b7565b5f81815260366020526040902060018101546001600160a01b03166130bb5760405162461bcd60e51b815260206004820152601460248201527310db185a5b48191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401611237565b603c5481600401546130cd9190613ef2565b42101561311c5760405162461bcd60e51b815260206004820152601a60248201527f436f6e6669726d6174696f6e2064656c61792070656e64696e670000000000006044820152606401611237565b600581015460ff16156131695760405162461bcd60e51b815260206004820152601560248201527410db185a5b48185b1c9958591e481cd95d1d1b1959605a1b6044820152606401611237565b5f8160080154116131ac5760405162461bcd60e51b815260206004820152600d60248201526c139bc81d9bdd195cc818d85cdd609a1b6044820152606401611237565b60058101805460ff19166001179055600681015460078201545f916131d09161380d565b90505f5f6131de8584613850565b6006860154600787015460408051881515815260208101939093528201526060810183905260808101829052919350915085907f447c31d40d3af2e96c361a35f666c7c309e1b413bfab6314f99f5d76b4b59e6a9060a00160405180910390a25050505061162e60015f5160206141705f395f51905f5255565b61162e815f613538565b6132795f5160206141305f395f51905f5233612284565b15801561328d575061328b5f33612284565b155b80156132a457506003546001600160a01b03163314155b156132c25760405163e653962160e01b815260040160405180910390fd5b5f81116133025760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401611237565b603d80549082905560408051828152602081018490527f40d8bfdf1085b28330a6753bdac4a0b338fcaef883a9b001eeae9ef9c4344ab3915f5160206141505f395f51905f529101611e27565b5f6133675f5160206141305f395f51905f5283612284565b8061337757506133775f83612284565b806110ad5750506003546001600160a01b0390811691161490565b61162e8133613941565b6133a461397a565b60025f5160206141705f395f51905f5255565b60025460ff1615611aa35760405163d93c066560e01b815260040160405180910390fd5b5f828152602081905260409020600101546133f581613392565b5f5160206141105f395f51905f52830361342257604051637f95d39f60e01b815260040160405180910390fd5b6113c383836139a9565b5f6134378383612284565b15613495575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016110ad565b505f6110ad565b5f6111b8838360646139d3565b6134b1613a83565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6135036133b7565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586134de3390565b5f61354383836123ad565b5f818152600160205260408120549192508190036135745760405163017c603d60e11b815260040160405180910390fd5b8042101561359857604051637f26f8ff60e01b815260048101829052602401611237565b5f8281526001602052604081205582156135ff576135c45f5160206141105f395f51905f525b85612284565b156135e2576040516305e890c760e01b815260040160405180910390fd5b6135f95f5160206141105f395f51905f5285613689565b5061364b565b6136155f5160206141105f395f51905f526135be565b613632576040516305e890c760e01b815260040160405180910390fd5b6136495f5160206141105f395f51905f528561342c565b505b836001600160a01b0316827fb1c135628e84cbdb9191baf90d328a496f2b9316420bce3ffb41770250d6fa5285604051611473911515815260200190565b5f6136948383612284565b613495575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556136c93390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016110ad565b5f61371c83836123ad565b5f818152600160205260409020549091501561374b5760405163a559d95b60e01b815260040160405180910390fd5b5f6137596202a30042613ef2565b5f83815260016020908152604091829020839055815186151581529081018390529192506001600160a01b0386169184917f0a54b76d9e7ca8c07b662a9ab90ed367b94496ea4e563cbfb06de6b7dee143c3910160405180910390a35092915050565b5f828152602081905260409020600101546137d681613392565b5f5160206141105f395f51905f52830361380357604051637f95d39f60e01b815260040160405180910390fd5b6113c38383613aa6565b5f806138198385613ef2565b9050805f0361382b575f9150506110ad565b5f816138388660646140c5565b61384291906140f0565b603e54111595945050505050565b5f8281526036602052604081208190818461386f578160070154613875565b81600601545b90505f8561388757826006015461388d565b82600701545b905061389b8160405461349c565b93506138a984603f5461349c565b94508360425f8282546138bc9190613ef2565b925050819055508460435f8282546138d49190613ef2565b90915550506040805160a0810182529615158752602080880187815288830187815260608a0195865260808a019485525f9a8b526037909252919098209651875460ff19169015151787555160018701559551600286015551600385015550925160049092019190915591565b61394b8282612284565b61163b5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611237565b5f5160206141705f395f51905f5254600203611aa357604051633ee5aeb560e01b815260040160405180910390fd5b5f828152602081905260409020600101546139c381613392565b6139cd8383613689565b50505050565b5f5f5f6139e08686613aca565b91509150815f03613a04578381816139fa576139fa6140dc565b04925050506111b8565b818411613a1b57613a1b6003851502601118613ae6565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b60025460ff16611aa357604051638dfc202b60e01b815260040160405180910390fd5b5f82815260208190526040902060010154613ac081613392565b6139cd838361342c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f60208284031215613b07575f5ffd5b81356001600160e01b0319811681146111b8575f5ffd5b803560128110612182575f5ffd5b6001600160a01b038116811461162e575f5ffd5b5f5f60408385031215613b51575f5ffd5b613b5a83613b1e565b91506020830135613b6a81613b2c565b809150509250929050565b5f5f60408385031215613b86575f5ffd5b8235613b9181613b2c565b946020939093013593505050565b801515811461162e575f5ffd5b5f5f60408385031215613bbd575f5ffd5b8235613bc881613b2c565b91506020830135613b6a81613b9f565b5f60208284031215613be8575f5ffd5b81356111b881613b2c565b5f60208284031215613c03575f5ffd5b5035919050565b5f5f60408385031215613c1b575f5ffd5b823591506020830135613b6a81613b2c565b5f5f60408385031215613c3e575f5ffd5b613b9183613b1e565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b60208152815160208201525f6020830151613c9b60408401826001600160a01b03169052565b5060408301516101206060840152613cb7610140840182613c47565b905060608401516080840152608084015160a084015260a0840151613ce060c085018215159052565b5060c084015160e084015260e08401516101008401526101008401516101208401528091505092915050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215613d30575f5ffd5b813567ffffffffffffffff811115613d46575f5ffd5b8201601f81018413613d56575f5ffd5b803567ffffffffffffffff811115613d7057613d70613d0c565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715613d9f57613d9f613d0c565b604052818152828201602001861015613db6575f5ffd5b816020840160208301375f91810160200191909152949350505050565b8981526001600160a01b0389166020820152610120604082018190525f90613dfd9083018a613c47565b606083019890985250608081019590955292151560a085015260c084019190915260e0830152610100909101529392505050565b5f60208284031215613e41575f5ffd5b81356111b881613b9f565b5f5f5f60608486031215613e5e575f5ffd5b833592506020840135613e7081613b9f565b929592945050506040919091013590565b60128110613e9d57634e487b7160e01b5f52602160045260245ffd5b9052565b60408101613eaf8285613e81565b6001600160a01b039290921660209190910152919050565b5f60208284031215613ed7575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156110ad576110ad613ede565b818103818111156110ad576110ad613ede565b5f60208284031215613f28575f5ffd5b81516111b881613b9f565b60408101613f418285613e81565b8260208301529392505050565b600181811c90821680613f6257607f821691505b602082108103613f8057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60018201613f9757613f97613ede565b5060010190565b601f8211156113c357805f5260205f20601f840160051c81016020851015613fc35750805b601f840160051c820191505b81811015613fe2575f8155600101613fcf565b5050505050565b815167ffffffffffffffff81111561400357614003613d0c565b614017816140118454613f4e565b84613f9e565b6020601f821160018114614049575f83156140325750848201515b5f19600385901b1c1916600184901b178455613fe2565b5f84815260208120601f198516915b828110156140785787850151825560209485019460019092019101614058565b508482101561409557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b604081525f6140b66040830185613c47565b90508260208301529392505050565b80820281158282048414176110ad576110ad613ede565b634e487b7160e01b5f52601260045260245ffd5b5f8261410a57634e487b7160e01b5f52601260045260245ffd5b50049056fe92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb171840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb159d657359512cd63e5622af1c9696c1ba638c643e928d4c04c720f367138015f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212207f3dc5d310cc1a9592458c11874233438022f37bf7117ded76ab4cac0f3d28d964736f6c634300081c003371840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb1e7e0b301de1c1e268073a6b56ff0876cffca0becba0dca08f945c1394e3e972765d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775
\ No newline at end of file
diff --git a/contracts_TruthBounty_sol_TruthBountyToken.bin b/contracts_TruthBounty_sol_TruthBountyToken.bin
new file mode 100644
index 0000000..2449311
--- /dev/null
+++ b/contracts_TruthBounty_sol_TruthBountyToken.bin
@@ -0,0 +1 @@
+60a060405230608052600a600855348015610018575f5ffd5b506040516123bb3803806123bb833981016040819052610037916103cb565b6040518060400160405280600b81526020016a5472757468426f756e747960a81b81525060405180604001604052806006815260200165424f554e545960d01b81525081600390816100899190610490565b5060046100968282610490565b5050506001600160a01b0381166100f45760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e2061646472657373000000000000000000000060448201526064015b60405180910390fd5b610116816101046012600a610641565b610111906298968061064f565b610176565b6101205f826101ae565b506101385f51602061239b5f395f51905f52826101ae565b506101707f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb15f51602061239b5f395f51905f5261025b565b50610679565b6001600160a01b03821661019f5760405163ec442f0560e01b81525f60048201526024016100eb565b6101aa5f83836102a5565b5050565b5f8281526005602090815260408083206001600160a01b038516845290915281205460ff16610252575f8381526005602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561020a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610255565b505f5b92915050565b5f82815260056020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6001600160a01b0383166102cf578060025f8282546102c49190610666565b9091555061033f9050565b6001600160a01b0383165f90815260208190526040902054818110156103215760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100eb565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661035b57600280548290039055610379565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516103be91815260200190565b60405180910390a3505050565b5f602082840312156103db575f5ffd5b81516001600160a01b03811681146103f1575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061042057607f821691505b60208210810361043e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561048b57805f5260205f20601f840160051c810160208510156104695750805b601f840160051c820191505b81811015610488575f8155600101610475565b50505b505050565b81516001600160401b038111156104a9576104a96103f8565b6104bd816104b7845461040c565b84610444565b6020601f8211600181146104ef575f83156104d85750848201515b5f19600385901b1c1916600184901b178455610488565b5f84815260208120601f198516915b8281101561051e57878501518255602094850194600190920191016104fe565b508482101561053b57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156105995780850481111561057d5761057d61054a565b600184161561058b57908102905b60019390931c928002610562565b935093915050565b5f826105af57506001610255565b816105bb57505f610255565b81600181146105d157600281146105db576105f7565b6001915050610255565b60ff8411156105ec576105ec61054a565b50506001821b610255565b5060208310610133831016604e8410600b841016171561061a575081810a610255565b6106265f19848461055e565b805f19048211156106395761063961054a565b029392505050565b5f6103f160ff8416836105a1565b80820281158282048414176102555761025561054a565b808201808211156102555761025561054a565b608051611cfc61069f5f395f818161101b0152818161104401526111940152611cfc5ff3fe60806040526004361061021d575f3560e01c80637d9638501161011e578063b6f31f7b116100a8578063da6ff5cf1161006d578063da6ff5cf14610617578063dd62ed3e14610642578063e855f53514610686578063ea42418b146106a5578063f65ecc21146106dc575f5ffd5b8063b6f31f7b146105a5578063ba9cf01d14610471578063bd58199a146105c4578063cd01bbc4146105d9578063d547741f146105f8575f5ffd5b8063a434e98c116100ee578063a434e98c146104ed578063a4c8f1071461050c578063a694fc3a14610537578063a9059cbb14610556578063ad3cb1cc14610575575f5ffd5b80637d9638501461049157806391d14854146104a757806395d89b41146104c6578063a217fddf146104da575f5ffd5b8063313ce567116101aa57806352d1902d1161016f57806352d1902d146103ea57806367e8216e146103fe57806370a082311461041d57806375b238fc1461045157806378fab26014610471575f5ffd5b8063313ce5671461035f57806336568abe1461037a5780633719fd0514610399578063393ebbf8146103b85780634f1ef286146103d7575f5ffd5b806318160ddd116101f057806318160ddd146102b657806323b872dd146102d4578063248a9ca3146102f357806325d5971f146103215780632f2ff15d14610340575f5ffd5b806301ffc9a71461022157806306fdde0314610255578063095ea7b3146102765780630cbb2aea14610295575b5f5ffd5b34801561022c575f5ffd5b5061024061023b366004611881565b6106fb565b60405190151581526020015b60405180910390f35b348015610260575f5ffd5b50610269610731565b60405161024c91906118a8565b348015610281575f5ffd5b506102406102903660046118f8565b6107c1565b3480156102a0575f5ffd5b506102b46102af366004611920565b6107d8565b005b3480156102c1575f5ffd5b506002545b60405190815260200161024c565b3480156102df575f5ffd5b506102406102ee366004611959565b610891565b3480156102fe575f5ffd5b506102c661030d366004611993565b5f9081526005602052604090206001015490565b34801561032c575f5ffd5b506102b461033b366004611993565b6108b4565b34801561034b575f5ffd5b506102b461035a3660046119aa565b610974565b34801561036a575f5ffd5b506040516012815260200161024c565b348015610385575f5ffd5b506102b46103943660046119aa565b6109ca565b3480156103a4575f5ffd5b506102b46103b33660046119d4565b6109fd565b3480156103c3575f5ffd5b506102b46103d2366004611993565b610a57565b6102b46103e5366004611a01565b610aba565b3480156103f5575f5ffd5b506102c6610ad5565b348015610409575f5ffd5b506102b46104183660046119d4565b610af0565b348015610428575f5ffd5b506102c66104373660046119d4565b6001600160a01b03165f9081526020819052604090205490565b34801561045c575f5ffd5b506102c65f516020611ca75f395f51905f5281565b34801561047c575f5ffd5b506102c65f516020611c675f395f51905f5281565b34801561049c575f5ffd5b506102c66202a30081565b3480156104b2575f5ffd5b506102406104c13660046119aa565b610afe565b3480156104d1575f5ffd5b50610269610b28565b3480156104e5575f5ffd5b506102c65f81565b3480156104f8575f5ffd5b506102c6610507366004611920565b610b37565b348015610517575f5ffd5b506102c66105263660046119d4565b60096020525f908152604090205481565b348015610542575f5ffd5b506102b4610551366004611993565b610b8d565b348015610561575f5ffd5b506102406105703660046118f8565b610c2d565b348015610580575f5ffd5b50610269604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156105b0575f5ffd5b506102c66105bf3660046119d4565b610c3a565b3480156105cf575f5ffd5b506102c660085481565b3480156105e4575f5ffd5b506102c66105f33660046119d4565b610ca0565b348015610603575f5ffd5b506102b46106123660046119aa565b610cff565b348015610622575f5ffd5b506102c6610631366004611993565b60066020525f908152604090205481565b34801561064d575f5ffd5b506102c661065c366004611ac5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610691575f5ffd5b506102b46106a03660046119d4565b610d50565b3480156106b0575f5ffd5b506007546106c4906001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b3480156106e7575f5ffd5b506102b46106f6366004611aed565b610d5a565b5f6001600160e01b03198216637965db0b60e01b148061072b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461074090611b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461076c90611b6b565b80156107b75780601f1061078e576101008083540402835291602001916107b7565b820191905f5260205f20905b81548152906001019060200180831161079a57829003601f168201915b5050505050905090565b5f336107ce818585610e7e565b5060019392505050565b6107ee5f516020611c675f395f51905f5261030d565b6107f781610e8b565b5f6108028484610b37565b5f81815260066020526040812054919250036108315760405163017c603d60e11b815260040160405180910390fd5b60065f8281526020019081526020015f205f9055836001600160a01b0316817fd25272da91bd0aa1897211e0dc233b5d855af72c8b9c7aaf7bd3c675adb4233585604051610883911515815260200190565b60405180910390a350505050565b5f3361089e858285610e95565b6108a9858585610f11565b506001949350505050565b335f9081526009602052604090205481111561090c5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e74207374616b6560701b60448201526064015b60405180910390fd5b335f908152600960205260408120805483929061092a908490611bb7565b9091555061093b9050303383610f11565b60405181815233907f8108595eb6bad3acefa9da467d90cc2217686d5c5ac85460f8b7849c840645fc906020015b60405180910390a250565b5f8281526005602052604090206001015461098e81610e8b565b5f516020611c675f395f51905f5283036109bb57604051637f95d39f60e01b815260040160405180910390fd5b6109c58383610f6e565b505050565b6001600160a01b03811633146109f35760405163334bd91960e11b815260040160405180910390fd5b6109c58282610f92565b5f516020611ca75f395f51905f52610a1481610e8b565b600780546001600160a01b0319166001600160a01b038416179055610a465f516020611c675f395f51905f5283610afe565b610a53576109c582611004565b5050565b5f516020611ca75f395f51905f52610a6e81610e8b565b6064821115610ab45760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642070657263656e7461676560701b6044820152606401610903565b50600855565b610ac2611010565b610acb826110b6565b610a5382826110cd565b5f610ade611189565b505f516020611c875f395f51905f5290565b610afb8160016111d2565b50565b5f9182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461074090611b6b565b60408051306020808301919091525f516020611c675f395f51905f52828401526001600160a01b039490941660608201529115156080808401919091528151808403909101815260a09092019052805191012090565b5f8111610bcd5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401610903565b610bd8333083610f11565b335f9081526009602052604081208054839290610bf6908490611bca565b909155505060405181815233907f0a7bb2e28cc4698aac06db79cf9163bfcc20719286cf59fa7d492ceda1b8edc290602001610969565b5f336107ce818585610f11565b5f610c515f516020611c675f395f51905f5261030d565b610c5a81610e8b565b610c725f516020611c675f395f51905f525b84610afe565b610c8f576040516305e890c760e01b815260040160405180910390fd5b610c99835f611323565b9392505050565b5f610cb75f516020611c675f395f51905f5261030d565b610cc081610e8b565b610cd65f516020611c675f395f51905f52610c6c565b15610cf4576040516305e890c760e01b815260040160405180910390fd5b610c99836001611323565b5f82815260056020526040902060010154610d1981610e8b565b5f516020611c675f395f51905f528303610d4657604051637f95d39f60e01b815260040160405180910390fd5b6109c583836113ce565b610afb815f6111d2565b610d715f516020611c675f395f51905f52336113f2565b6001600160a01b0383165f9081526009602052604090205480610dca5760405162461bcd60e51b815260206004820152601160248201527009cde40e6e8c2d6ca40e8de40e6d8c2e6d607b1b6044820152606401610903565b5f606460085483610ddb9190611bdd565b610de59190611bf4565b6001600160a01b0386165f90815260096020526040812080549293508392909190610e11908490611bb7565b90915550610e219050308261142b565b6001600160a01b0385165f81815260096020526040908190205490517f1108f6d194a29c5822955210ff5025bbeda996d7d04548ad8b690dc0c578646a91610e6f9185919089908990611c13565b60405180910390a25050505050565b6109c5838383600161145f565b610afb81336113f2565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610f0b5781811015610efd57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610903565b610f0b84848484035f61145f565b50505050565b6001600160a01b038316610f3a57604051634b637e8f60e11b81525f6004820152602401610903565b6001600160a01b038216610f635760405163ec442f0560e01b81525f6004820152602401610903565b6109c5838383611523565b5f82815260056020526040902060010154610f8881610e8b565b610f0b8383611649565b5f610f9d8383610afe565b15610ffd575f8381526005602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161072b565b505f61072b565b5f61072b826001611323565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061109657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661108a5f516020611c875f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156110b45760405163703e46dd60e11b815260040160405180910390fd5b565b5f516020611ca75f395f51905f52610a5381610e8b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611127575060408051601f3d908101601f1916820190925261112491810190611c4f565b60015b61114f57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610903565b5f516020611c875f395f51905f52811461117f57604051632a87526960e21b815260048101829052602401610903565b6109c583836116d3565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110b45760405163703e46dd60e11b815260040160405180910390fd5b5f6111dd8383610b37565b5f8181526006602052604081205491925081900361120e5760405163017c603d60e11b815260040160405180910390fd5b8042101561123257604051637f26f8ff60e01b815260048101829052602401610903565b5f8281526006602052604081205582156112995761125e5f516020611c675f395f51905f525b85610afe565b1561127c576040516305e890c760e01b815260040160405180910390fd5b6112935f516020611c675f395f51905f5285611649565b506112e5565b6112af5f516020611c675f395f51905f52611258565b6112cc576040516305e890c760e01b815260040160405180910390fd5b6112e35f516020611c675f395f51905f5285610f92565b505b836001600160a01b0316827fb1c135628e84cbdb9191baf90d328a496f2b9316420bce3ffb41770250d6fa5285604051610883911515815260200190565b5f61132e8383610b37565b5f818152600660205260409020549091501561135d5760405163a559d95b60e01b815260040160405180910390fd5b5f61136b6202a30042611bca565b5f83815260066020908152604091829020839055815186151581529081018390529192506001600160a01b0386169184917f0a54b76d9e7ca8c07b662a9ab90ed367b94496ea4e563cbfb06de6b7dee143c3910160405180910390a35092915050565b5f828152600560205260409020600101546113e881610e8b565b610f0b8383610f92565b6113fc8282610afe565b610a535760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610903565b6001600160a01b03821661145457604051634b637e8f60e11b81525f6004820152602401610903565b610a53825f83611523565b6001600160a01b0384166114885760405163e602df0560e01b81525f6004820152602401610903565b6001600160a01b0383166114b157604051634a1406b160e11b81525f6004820152602401610903565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610f0b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161088391815260200190565b6001600160a01b03831661154d578060025f8282546115429190611bca565b909155506115bd9050565b6001600160a01b0383165f908152602081905260409020548181101561159f5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610903565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166115d9576002805482900390556115f7565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161163c91815260200190565b60405180910390a3505050565b5f6116548383610afe565b610ffd575f8381526005602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561168b3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161072b565b6116dc82611728565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611720576109c5828261178b565b610a5361182b565b806001600160a01b03163b5f0361175d57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610903565b5f516020611c875f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f611798848461184a565b90508080156117b957505f3d11806117b957505f846001600160a01b03163b115b156117ce576117c661185d565b91505061072b565b80156117f857604051639996b31560e01b81526001600160a01b0385166004820152602401610903565b3d1561180b57611806611876565b611824565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b34156110b45760405163b398979f60e01b815260040160405180910390fd5b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f60208284031215611891575f5ffd5b81356001600160e01b031981168114610c99575f5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146118f3575f5ffd5b919050565b5f5f60408385031215611909575f5ffd5b611912836118dd565b946020939093013593505050565b5f5f60408385031215611931575f5ffd5b61193a836118dd565b91506020830135801515811461194e575f5ffd5b809150509250929050565b5f5f5f6060848603121561196b575f5ffd5b611974846118dd565b9250611982602085016118dd565b929592945050506040919091013590565b5f602082840312156119a3575f5ffd5b5035919050565b5f5f604083850312156119bb575f5ffd5b823591506119cb602084016118dd565b90509250929050565b5f602082840312156119e4575f5ffd5b610c99826118dd565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215611a12575f5ffd5b611a1b836118dd565b9150602083013567ffffffffffffffff811115611a36575f5ffd5b8301601f81018513611a46575f5ffd5b803567ffffffffffffffff811115611a6057611a606119ed565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611a8f57611a8f6119ed565b604052818152828201602001871015611aa6575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f60408385031215611ad6575f5ffd5b611adf836118dd565b91506119cb602084016118dd565b5f5f5f60408486031215611aff575f5ffd5b611b08846118dd565b9250602084013567ffffffffffffffff811115611b23575f5ffd5b8401601f81018613611b33575f5ffd5b803567ffffffffffffffff811115611b49575f5ffd5b866020828401011115611b5a575f5ffd5b939660209190910195509293505050565b600181811c90821680611b7f57607f821691505b602082108103611b9d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561072b5761072b611ba3565b8082018082111561072b5761072b611ba3565b808202811582820484141761072b5761072b611ba3565b5f82611c0e57634e487b7160e01b5f52601260045260245ffd5b500490565b84815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f60208284031215611c5f575f5ffd5b505191905056fe92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb1360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220d69dc8e20abd473530ce51118877c0b5762995bc18b99d62b303f18778b8043e64736f6c634300081c0033a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775
\ No newline at end of file
diff --git a/contracts_governance_GovernanceHooks_sol_GovernanceHooks.bin b/contracts_governance_GovernanceHooks_sol_GovernanceHooks.bin
new file mode 100644
index 0000000..e69de29
diff --git a/contracts_governance_GovernanceOwnable_sol_GovernanceOwnable.bin b/contracts_governance_GovernanceOwnable_sol_GovernanceOwnable.bin
new file mode 100644
index 0000000..e69de29
diff --git a/contracts_utils_ResolverRoleTimelock_sol_ResolverRoleTimelock.bin b/contracts_utils_ResolverRoleTimelock_sol_ResolverRoleTimelock.bin
new file mode 100644
index 0000000..e69de29
diff --git a/foundry.lock b/foundry.lock
new file mode 100644
index 0000000..b746cec
--- /dev/null
+++ b/foundry.lock
@@ -0,0 +1,8 @@
+{
+ "lib/forge-std": {
+ "rev": "b3bc8b154382a75d0b0ef22d7fd4a0a5f0feee0e"
+ },
+ "lib/openzeppelin-contracts": {
+ "rev": "74edc4baff50b93c06977021ee9ba25987803291"
+ }
+}
\ No newline at end of file
diff --git a/lib/openzeppelin-contracts-upgradeable/README.md b/lib/openzeppelin-contracts-upgradeable/README.md
new file mode 100644
index 0000000..b01c6e8
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/README.md
@@ -0,0 +1,126 @@
+#
+
+[](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/latest)
+[](https://www.npmjs.org/package/@openzeppelin/contracts)
+[](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts)
+[](https://www.gitpoap.io/gh/OpenZeppelin/openzeppelin-contracts)
+[](https://docs.openzeppelin.com/contracts)
+[](https://forum.openzeppelin.com/)
+
+**A library for secure smart contract development.** Build on a solid foundation of community-vetted code.
+
+ * Implementations of standards like [ERC20](https://docs.openzeppelin.com/contracts/erc20) and [ERC721](https://docs.openzeppelin.com/contracts/erc721).
+ * Flexible [role-based permissioning](https://docs.openzeppelin.com/contracts/access-control) scheme.
+ * Reusable [Solidity components](https://docs.openzeppelin.com/contracts/utilities) to build custom contracts and complex decentralized systems.
+
+:mage: **Not sure how to get started?** Check out [Contracts Wizard](https://wizard.openzeppelin.com/) — an interactive smart contract generator.
+
+> [!IMPORTANT]
+> OpenZeppelin Contracts uses semantic versioning to communicate backwards compatibility of its API and storage layout. For upgradeable contracts, the storage layout of different major versions should be assumed incompatible, for example, it is unsafe to upgrade from 4.9.3 to 5.0.0. Learn more at [Backwards Compatibility](https://docs.openzeppelin.com/contracts/backwards-compatibility).
+
+> [!NOTE]
+> You are looking at the upgradeable variant of OpenZeppelin Contracts. Be sure to review the documentation on [Using OpenZeppelin Contracts with Upgrades](https://docs.openzeppelin.com/contracts/upgradeable).
+
+## Overview
+
+### Release tags
+
+We use NPM tags to clearly distinguish between audited and non-audited versions of our package:
+
+| Tag | Purpose | Description |
+| :--------- | :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **latest** | ✅ Audited releases | Stable, audited versions of the package. This is the **default** version installed when users run `npm install @openzeppelin/contracts`. |
+| **dev** | 🧪 Final but not audited | Versions that are finalized and feature-complete but have **not yet been audited**. This version is fully tested, can be used in production and is covered by the bug bounty. |
+| **next** | 🚧 Release candidates | Pre-release versions that are **not final**. Used for testing and validation before the version becomes a final `dev` or `latest` release. |
+
+### Installation
+
+#### Hardhat (npm)
+
+```
+$ npm install @openzeppelin/contracts-upgradeable
+```
+→ Installs the latest audited release (`latest`).
+
+```
+$ npm install @openzeppelin/contracts-upgradeable@dev
+```
+→ Installs the latest unaudited release (`dev`).
+
+#### Foundry (git)
+
+> [!WARNING]
+> When installing via git, it is a common error to use the `master` branch. This is a development branch that should be avoided in favor of tagged releases. The release process involves security measures that the `master` branch does not guarantee.
+
+> [!WARNING]
+> Foundry installs the latest version initially, but subsequent `forge update` commands will use the `master` branch.
+
+```
+$ forge install OpenZeppelin/openzeppelin-contracts-upgradeable
+```
+
+Add `@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/` in `remappings.txt`.
+
+### Usage
+
+Once installed, you can use the contracts in the library by importing them:
+
+```solidity
+pragma solidity ^0.8.20;
+
+import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";
+
+contract MyCollectible is ERC721Upgradeable {
+ function initialize() initializer public {
+ __ERC721_init("MyCollectible", "MCO");
+ }
+}
+```
+
+_If you're new to smart contract development, head to [Developing Smart Contracts](https://docs.openzeppelin.com/learn/developing-smart-contracts) to learn about creating a new project and compiling your contracts._
+
+To keep your system secure, you should **always** use the installed code as-is, and neither copy-paste it from online sources nor modify it yourself. The library is designed so that only the contracts and functions you use are deployed, so you don't need to worry about it needlessly increasing gas costs.
+
+## Learn More
+
+The guides in the [documentation site](https://docs.openzeppelin.com/contracts) will teach about different concepts, and how to use the related contracts that OpenZeppelin Contracts provides:
+
+* [Access Control](https://docs.openzeppelin.com/contracts/access-control): decide who can perform each of the actions on your system.
+* [Tokens](https://docs.openzeppelin.com/contracts/tokens): create tradeable assets or collectibles for popular ERC standards like ERC-20, ERC-721, ERC-1155, and ERC-6909.
+* [Utilities](https://docs.openzeppelin.com/contracts/utilities): generic useful tools including non-overflowing math, signature verification, and trustless paying systems.
+
+The [full API](https://docs.openzeppelin.com/contracts/api/token/ERC20) is also thoroughly documented, and serves as a great reference when developing your smart contract application. You can also ask for help or follow Contracts' development in the [community forum](https://forum.openzeppelin.com).
+
+Finally, you may want to take a look at the [guides on our blog](https://blog.openzeppelin.com/), which cover several common use cases and good practices. The following articles provide great background reading, though please note that some of the referenced tools have changed, as the tooling in the ecosystem continues to rapidly evolve.
+
+* [The Hitchhiker’s Guide to Smart Contracts in Ethereum](https://blog.openzeppelin.com/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05) will help you get an overview of the various tools available for smart contract development, and help you set up your environment.
+* [A Gentle Introduction to Ethereum Programming, Part 1](https://blog.openzeppelin.com/a-gentle-introduction-to-ethereum-programming-part-1-783cc7796094) provides very useful information on an introductory level, including many basic concepts from the Ethereum platform.
+* For a more in-depth dive, you may read the guide [Designing the Architecture for Your Ethereum Application](https://blog.openzeppelin.com/designing-the-architecture-for-your-ethereum-application-9cec086f8317), which discusses how to better structure your application and its relationship to the real world.
+
+## Security
+
+This project is maintained by [OpenZeppelin](https://openzeppelin.com) with the goal of providing a secure and reliable library of smart contract components for the ecosystem. We address security through risk management in various areas such as engineering and open source best practices, scoping and API design, multi-layered review processes, and incident response preparedness.
+
+The [OpenZeppelin Contracts Security Center](https://contracts.openzeppelin.com/security) contains more details about the secure development process.
+
+The security policy is detailed in [`SECURITY.md`](./SECURITY.md) as well, and specifies how you can report security vulnerabilities, which versions will receive security patches, and how to stay informed about them. We run a [bug bounty program on Immunefi](https://immunefi.com/bounty/openzeppelin) to reward the responsible disclosure of vulnerabilities.
+
+The engineering guidelines we follow to promote project quality can be found in [`GUIDELINES.md`](./GUIDELINES.md).
+
+Past audits can be found in [`audits/`](./audits).
+
+Smart contracts are a nascent technology and carry a high level of technical risk and uncertainty. Although OpenZeppelin is well known for its security audits, using OpenZeppelin Contracts is not a substitute for a security audit.
+
+OpenZeppelin Contracts is made available under the MIT License, which disclaims all warranties in relation to the project and which limits the liability of those that contribute and maintain the project, including OpenZeppelin. As set out further in the Terms, you acknowledge that you are solely responsible for any use of OpenZeppelin Contracts and you assume all risks associated with any such use.
+
+## Contribute
+
+OpenZeppelin Contracts exists thanks to its contributors. There are many ways you can participate and help build high quality software. Check out the [contribution guide](CONTRIBUTING.md)!
+
+## License
+
+OpenZeppelin Contracts is released under the [MIT License](LICENSE).
+
+## Legal
+
+Your use of this Project is governed by the terms found at www.openzeppelin.com/tos (the "Terms").
diff --git a/lib/openzeppelin-contracts-upgradeable/access/AccessControlUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/access/AccessControlUpgradeable.sol
new file mode 100644
index 0000000..b9e7399
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/access/AccessControlUpgradeable.sol
@@ -0,0 +1,231 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (access/AccessControl.sol)
+
+pragma solidity ^0.8.20;
+
+import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
+import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
+import {ERC165Upgradeable} from "../utils/introspection/ERC165Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Contract module that allows children to implement role-based access
+ * control mechanisms. This is a lightweight version that doesn't allow enumerating role
+ * members except through off-chain means by accessing the contract event logs. Some
+ * applications may benefit from on-chain enumerability, for those cases see
+ * {AccessControlEnumerable}.
+ *
+ * Roles are referred to by their `bytes32` identifier. These should be exposed
+ * in the external API and be unique. The best way to achieve this is by
+ * using `public constant` hash digests:
+ *
+ * ```solidity
+ * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
+ * ```
+ *
+ * Roles can be used to represent a set of permissions. To restrict access to a
+ * function call, use {hasRole}:
+ *
+ * ```solidity
+ * function foo() public {
+ * require(hasRole(MY_ROLE, msg.sender));
+ * ...
+ * }
+ * ```
+ *
+ * Roles can be granted and revoked dynamically via the {grantRole} and
+ * {revokeRole} functions. Each role has an associated admin role, and only
+ * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
+ *
+ * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
+ * that only accounts with this role will be able to grant or revoke other
+ * roles. More complex role relationships can be created by using
+ * {_setRoleAdmin}.
+ *
+ * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
+ * grant and revoke this role. Extra precautions should be taken to secure
+ * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
+ * to enforce additional security measures for this role.
+ */
+abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControl, ERC165Upgradeable {
+ struct RoleData {
+ mapping(address account => bool) hasRole;
+ bytes32 adminRole;
+ }
+
+ bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
+
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.AccessControl
+ struct AccessControlStorage {
+ mapping(bytes32 role => RoleData) _roles;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControl")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant AccessControlStorageLocation = 0x02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800;
+
+ function _getAccessControlStorage() private pure returns (AccessControlStorage storage $) {
+ assembly {
+ $.slot := AccessControlStorageLocation
+ }
+ }
+
+ /**
+ * @dev Modifier that checks that an account has a specific role. Reverts
+ * with an {AccessControlUnauthorizedAccount} error including the required role.
+ */
+ modifier onlyRole(bytes32 role) {
+ _checkRole(role);
+ _;
+ }
+
+ function __AccessControl_init() internal onlyInitializing {
+ }
+
+ function __AccessControl_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc ERC165Upgradeable
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
+ return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /**
+ * @dev Returns `true` if `account` has been granted `role`.
+ */
+ function hasRole(bytes32 role, address account) public view virtual returns (bool) {
+ AccessControlStorage storage $ = _getAccessControlStorage();
+ return $._roles[role].hasRole[account];
+ }
+
+ /**
+ * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
+ * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
+ */
+ function _checkRole(bytes32 role) internal view virtual {
+ _checkRole(role, _msgSender());
+ }
+
+ /**
+ * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
+ * is missing `role`.
+ */
+ function _checkRole(bytes32 role, address account) internal view virtual {
+ if (!hasRole(role, account)) {
+ revert AccessControlUnauthorizedAccount(account, role);
+ }
+ }
+
+ /**
+ * @dev Returns the admin role that controls `role`. See {grantRole} and
+ * {revokeRole}.
+ *
+ * To change a role's admin, use {_setRoleAdmin}.
+ */
+ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
+ AccessControlStorage storage $ = _getAccessControlStorage();
+ return $._roles[role].adminRole;
+ }
+
+ /**
+ * @dev Grants `role` to `account`.
+ *
+ * If `account` had not been already granted `role`, emits a {RoleGranted}
+ * event.
+ *
+ * Requirements:
+ *
+ * - the caller must have ``role``'s admin role.
+ *
+ * May emit a {RoleGranted} event.
+ */
+ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
+ _grantRole(role, account);
+ }
+
+ /**
+ * @dev Revokes `role` from `account`.
+ *
+ * If `account` had been granted `role`, emits a {RoleRevoked} event.
+ *
+ * Requirements:
+ *
+ * - the caller must have ``role``'s admin role.
+ *
+ * May emit a {RoleRevoked} event.
+ */
+ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
+ _revokeRole(role, account);
+ }
+
+ /**
+ * @dev Revokes `role` from the calling account.
+ *
+ * Roles are often managed via {grantRole} and {revokeRole}: this function's
+ * purpose is to provide a mechanism for accounts to lose their privileges
+ * if they are compromised (such as when a trusted device is misplaced).
+ *
+ * If the calling account had been revoked `role`, emits a {RoleRevoked}
+ * event.
+ *
+ * Requirements:
+ *
+ * - the caller must be `callerConfirmation`.
+ *
+ * May emit a {RoleRevoked} event.
+ */
+ function renounceRole(bytes32 role, address callerConfirmation) public virtual {
+ if (callerConfirmation != _msgSender()) {
+ revert AccessControlBadConfirmation();
+ }
+
+ _revokeRole(role, callerConfirmation);
+ }
+
+ /**
+ * @dev Sets `adminRole` as ``role``'s admin role.
+ *
+ * Emits a {RoleAdminChanged} event.
+ */
+ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
+ AccessControlStorage storage $ = _getAccessControlStorage();
+ bytes32 previousAdminRole = getRoleAdmin(role);
+ $._roles[role].adminRole = adminRole;
+ emit RoleAdminChanged(role, previousAdminRole, adminRole);
+ }
+
+ /**
+ * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
+ *
+ * Internal function without access restriction.
+ *
+ * May emit a {RoleGranted} event.
+ */
+ function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
+ AccessControlStorage storage $ = _getAccessControlStorage();
+ if (!hasRole(role, account)) {
+ $._roles[role].hasRole[account] = true;
+ emit RoleGranted(role, account, _msgSender());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.
+ *
+ * Internal function without access restriction.
+ *
+ * May emit a {RoleRevoked} event.
+ */
+ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
+ AccessControlStorage storage $ = _getAccessControlStorage();
+ if (hasRole(role, account)) {
+ $._roles[role].hasRole[account] = false;
+ emit RoleRevoked(role, account, _msgSender());
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/access/Ownable2StepUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/access/Ownable2StepUpgradeable.sol
new file mode 100644
index 0000000..2d27ac8
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/access/Ownable2StepUpgradeable.sol
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)
+
+pragma solidity ^0.8.20;
+
+import {OwnableUpgradeable} from "./OwnableUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Contract module which provides access control mechanism, where
+ * there is an account (an owner) that can be granted exclusive access to
+ * specific functions.
+ *
+ * This extension of the {Ownable} contract includes a two-step mechanism to transfer
+ * ownership, where the new owner must call {acceptOwnership} in order to replace the
+ * old one. This can help prevent common mistakes, such as transfers of ownership to
+ * incorrect accounts, or to contracts that are unable to interact with the
+ * permission system.
+ *
+ * The initial owner is specified at deployment time in the constructor for `Ownable`. This
+ * can later be changed with {transferOwnership} and {acceptOwnership}.
+ *
+ * This module is used through inheritance. It will make available all functions
+ * from parent (Ownable).
+ */
+abstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.Ownable2Step
+ struct Ownable2StepStorage {
+ address _pendingOwner;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable2Step")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant Ownable2StepStorageLocation = 0x237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00;
+
+ function _getOwnable2StepStorage() private pure returns (Ownable2StepStorage storage $) {
+ assembly {
+ $.slot := Ownable2StepStorageLocation
+ }
+ }
+
+ event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
+
+ function __Ownable2Step_init() internal onlyInitializing {
+ }
+
+ function __Ownable2Step_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Returns the address of the pending owner.
+ */
+ function pendingOwner() public view virtual returns (address) {
+ Ownable2StepStorage storage $ = _getOwnable2StepStorage();
+ return $._pendingOwner;
+ }
+
+ /**
+ * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
+ * Can only be called by the current owner.
+ *
+ * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.
+ */
+ function transferOwnership(address newOwner) public virtual override onlyOwner {
+ Ownable2StepStorage storage $ = _getOwnable2StepStorage();
+ $._pendingOwner = newOwner;
+ emit OwnershipTransferStarted(owner(), newOwner);
+ }
+
+ /**
+ * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
+ * Internal function without access restriction.
+ */
+ function _transferOwnership(address newOwner) internal virtual override {
+ Ownable2StepStorage storage $ = _getOwnable2StepStorage();
+ delete $._pendingOwner;
+ super._transferOwnership(newOwner);
+ }
+
+ /**
+ * @dev The new owner accepts the ownership transfer.
+ */
+ function acceptOwnership() public virtual {
+ address sender = _msgSender();
+ if (pendingOwner() != sender) {
+ revert OwnableUnauthorizedAccount(sender);
+ }
+ _transferOwnership(sender);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/access/OwnableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/access/OwnableUpgradeable.sol
new file mode 100644
index 0000000..1697c76
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/access/OwnableUpgradeable.sol
@@ -0,0 +1,119 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
+
+pragma solidity ^0.8.20;
+
+import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Contract module which provides a basic access control mechanism, where
+ * there is an account (an owner) that can be granted exclusive access to
+ * specific functions.
+ *
+ * The initial owner is set to the address provided by the deployer. This can
+ * later be changed with {transferOwnership}.
+ *
+ * This module is used through inheritance. It will make available the modifier
+ * `onlyOwner`, which can be applied to your functions to restrict their use to
+ * the owner.
+ */
+abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.Ownable
+ struct OwnableStorage {
+ address _owner;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;
+
+ function _getOwnableStorage() private pure returns (OwnableStorage storage $) {
+ assembly {
+ $.slot := OwnableStorageLocation
+ }
+ }
+
+ /**
+ * @dev The caller account is not authorized to perform an operation.
+ */
+ error OwnableUnauthorizedAccount(address account);
+
+ /**
+ * @dev The owner is not a valid owner account. (eg. `address(0)`)
+ */
+ error OwnableInvalidOwner(address owner);
+
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ /**
+ * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
+ */
+ function __Ownable_init(address initialOwner) internal onlyInitializing {
+ __Ownable_init_unchained(initialOwner);
+ }
+
+ function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {
+ if (initialOwner == address(0)) {
+ revert OwnableInvalidOwner(address(0));
+ }
+ _transferOwnership(initialOwner);
+ }
+
+ /**
+ * @dev Throws if called by any account other than the owner.
+ */
+ modifier onlyOwner() {
+ _checkOwner();
+ _;
+ }
+
+ /**
+ * @dev Returns the address of the current owner.
+ */
+ function owner() public view virtual returns (address) {
+ OwnableStorage storage $ = _getOwnableStorage();
+ return $._owner;
+ }
+
+ /**
+ * @dev Throws if the sender is not the owner.
+ */
+ function _checkOwner() internal view virtual {
+ if (owner() != _msgSender()) {
+ revert OwnableUnauthorizedAccount(_msgSender());
+ }
+ }
+
+ /**
+ * @dev Leaves the contract without owner. It will not be possible to call
+ * `onlyOwner` functions. Can only be called by the current owner.
+ *
+ * NOTE: Renouncing ownership will leave the contract without an owner,
+ * thereby disabling any functionality that is only available to the owner.
+ */
+ function renounceOwnership() public virtual onlyOwner {
+ _transferOwnership(address(0));
+ }
+
+ /**
+ * @dev Transfers ownership of the contract to a new account (`newOwner`).
+ * Can only be called by the current owner.
+ */
+ function transferOwnership(address newOwner) public virtual onlyOwner {
+ if (newOwner == address(0)) {
+ revert OwnableInvalidOwner(address(0));
+ }
+ _transferOwnership(newOwner);
+ }
+
+ /**
+ * @dev Transfers ownership of the contract to a new account (`newOwner`).
+ * Internal function without access restriction.
+ */
+ function _transferOwnership(address newOwner) internal virtual {
+ OwnableStorage storage $ = _getOwnableStorage();
+ address oldOwner = $._owner;
+ $._owner = newOwner;
+ emit OwnershipTransferred(oldOwner, newOwner);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/access/extensions/AccessControlDefaultAdminRulesUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/access/extensions/AccessControlDefaultAdminRulesUpgradeable.sol
new file mode 100644
index 0000000..761ad6d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/access/extensions/AccessControlDefaultAdminRulesUpgradeable.sol
@@ -0,0 +1,401 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (access/extensions/AccessControlDefaultAdminRules.sol)
+
+pragma solidity ^0.8.20;
+
+import {IAccessControlDefaultAdminRules} from "@openzeppelin/contracts/access/extensions/IAccessControlDefaultAdminRules.sol";
+import {AccessControlUpgradeable} from "../AccessControlUpgradeable.sol";
+import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {IERC5313} from "@openzeppelin/contracts/interfaces/IERC5313.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {AccessControl} that allows specifying special rules to manage
+ * the `DEFAULT_ADMIN_ROLE` holder, which is a sensitive role with special permissions
+ * over other roles that may potentially have privileged rights in the system.
+ *
+ * If a specific role doesn't have an admin role assigned, the holder of the
+ * `DEFAULT_ADMIN_ROLE` will have the ability to grant it and revoke it.
+ *
+ * This contract implements the following risk mitigations on top of {AccessControl}:
+ *
+ * * Only one account holds the `DEFAULT_ADMIN_ROLE` since deployment until it's potentially renounced.
+ * * Enforces a 2-step process to transfer the `DEFAULT_ADMIN_ROLE` to another account.
+ * * Enforces a configurable delay between the two steps, with the ability to cancel before the transfer is accepted.
+ * * The delay can be changed by scheduling, see {changeDefaultAdminDelay}.
+ * * Role transfers must wait at least one block after scheduling before it can be accepted.
+ * * It is not possible to use another role to manage the `DEFAULT_ADMIN_ROLE`.
+ *
+ * Example usage:
+ *
+ * ```solidity
+ * contract MyToken is AccessControlDefaultAdminRules {
+ * constructor() AccessControlDefaultAdminRules(
+ * 3 days,
+ * msg.sender // Explicit initial `DEFAULT_ADMIN_ROLE` holder
+ * ) {}
+ * }
+ * ```
+ */
+abstract contract AccessControlDefaultAdminRulesUpgradeable is Initializable, IAccessControlDefaultAdminRules, IERC5313, AccessControlUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.AccessControlDefaultAdminRules
+ struct AccessControlDefaultAdminRulesStorage {
+ // pending admin pair read/written together frequently
+ address _pendingDefaultAdmin;
+ uint48 _pendingDefaultAdminSchedule; // 0 == unset
+
+ uint48 _currentDelay;
+ address _currentDefaultAdmin;
+
+ // pending delay pair read/written together frequently
+ uint48 _pendingDelay;
+ uint48 _pendingDelaySchedule; // 0 == unset
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControlDefaultAdminRules")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant AccessControlDefaultAdminRulesStorageLocation = 0xeef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400;
+
+ function _getAccessControlDefaultAdminRulesStorage() private pure returns (AccessControlDefaultAdminRulesStorage storage $) {
+ assembly {
+ $.slot := AccessControlDefaultAdminRulesStorageLocation
+ }
+ }
+
+ /**
+ * @dev Sets the initial values for {defaultAdminDelay} and {defaultAdmin} address.
+ */
+ function __AccessControlDefaultAdminRules_init(uint48 initialDelay, address initialDefaultAdmin) internal onlyInitializing {
+ __AccessControlDefaultAdminRules_init_unchained(initialDelay, initialDefaultAdmin);
+ }
+
+ function __AccessControlDefaultAdminRules_init_unchained(uint48 initialDelay, address initialDefaultAdmin) internal onlyInitializing {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ if (initialDefaultAdmin == address(0)) {
+ revert AccessControlInvalidDefaultAdmin(address(0));
+ }
+ $._currentDelay = initialDelay;
+ _grantRole(DEFAULT_ADMIN_ROLE, initialDefaultAdmin);
+ }
+
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
+ return interfaceId == type(IAccessControlDefaultAdminRules).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /// @inheritdoc IERC5313
+ function owner() public view virtual returns (address) {
+ return defaultAdmin();
+ }
+
+ ///
+ /// Override AccessControl role management
+ ///
+
+ /**
+ * @dev See {AccessControl-grantRole}. Reverts for `DEFAULT_ADMIN_ROLE`.
+ */
+ function grantRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControl) {
+ if (role == DEFAULT_ADMIN_ROLE) {
+ revert AccessControlEnforcedDefaultAdminRules();
+ }
+ super.grantRole(role, account);
+ }
+
+ /**
+ * @dev See {AccessControl-revokeRole}. Reverts for `DEFAULT_ADMIN_ROLE`.
+ */
+ function revokeRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControl) {
+ if (role == DEFAULT_ADMIN_ROLE) {
+ revert AccessControlEnforcedDefaultAdminRules();
+ }
+ super.revokeRole(role, account);
+ }
+
+ /**
+ * @dev See {AccessControl-renounceRole}.
+ *
+ * For the `DEFAULT_ADMIN_ROLE`, it only allows renouncing in two steps by first calling
+ * {beginDefaultAdminTransfer} to the `address(0)`, so it's required that the {pendingDefaultAdmin} schedule
+ * has also passed when calling this function.
+ *
+ * After its execution, it will not be possible to call `onlyRole(DEFAULT_ADMIN_ROLE)` functions.
+ *
+ * NOTE: Renouncing `DEFAULT_ADMIN_ROLE` will leave the contract without a {defaultAdmin},
+ * thereby disabling any functionality that is only available for it, and the possibility of reassigning a
+ * non-administrated role.
+ */
+ function renounceRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControl) {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ if (role == DEFAULT_ADMIN_ROLE && account == defaultAdmin()) {
+ (address newDefaultAdmin, uint48 schedule) = pendingDefaultAdmin();
+ if (newDefaultAdmin != address(0) || !_isScheduleSet(schedule) || !_hasSchedulePassed(schedule)) {
+ revert AccessControlEnforcedDefaultAdminDelay(schedule);
+ }
+ delete $._pendingDefaultAdminSchedule;
+ }
+ super.renounceRole(role, account);
+ }
+
+ /**
+ * @dev See {AccessControl-_grantRole}.
+ *
+ * For `DEFAULT_ADMIN_ROLE`, it only allows granting if there isn't already a {defaultAdmin} or if the
+ * role has been previously renounced.
+ *
+ * NOTE: Exposing this function through another mechanism may make the `DEFAULT_ADMIN_ROLE`
+ * assignable again. Make sure to guarantee this is the expected behavior in your implementation.
+ */
+ function _grantRole(bytes32 role, address account) internal virtual override returns (bool) {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ if (role == DEFAULT_ADMIN_ROLE) {
+ if (defaultAdmin() != address(0)) {
+ revert AccessControlEnforcedDefaultAdminRules();
+ }
+ $._currentDefaultAdmin = account;
+ }
+ return super._grantRole(role, account);
+ }
+
+ /// @inheritdoc AccessControlUpgradeable
+ function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ if (role == DEFAULT_ADMIN_ROLE && account == defaultAdmin()) {
+ delete $._currentDefaultAdmin;
+ }
+ return super._revokeRole(role, account);
+ }
+
+ /**
+ * @dev See {AccessControl-_setRoleAdmin}. Reverts for `DEFAULT_ADMIN_ROLE`.
+ */
+ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual override {
+ if (role == DEFAULT_ADMIN_ROLE) {
+ revert AccessControlEnforcedDefaultAdminRules();
+ }
+ super._setRoleAdmin(role, adminRole);
+ }
+
+ ///
+ /// AccessControlDefaultAdminRules accessors
+ ///
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function defaultAdmin() public view virtual returns (address) {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ return $._currentDefaultAdmin;
+ }
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function pendingDefaultAdmin() public view virtual returns (address newAdmin, uint48 schedule) {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ return ($._pendingDefaultAdmin, $._pendingDefaultAdminSchedule);
+ }
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function defaultAdminDelay() public view virtual returns (uint48) {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ uint48 schedule = $._pendingDelaySchedule;
+ return (_isScheduleSet(schedule) && _hasSchedulePassed(schedule)) ? $._pendingDelay : $._currentDelay;
+ }
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function pendingDefaultAdminDelay() public view virtual returns (uint48 newDelay, uint48 schedule) {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ schedule = $._pendingDelaySchedule;
+ return (_isScheduleSet(schedule) && !_hasSchedulePassed(schedule)) ? ($._pendingDelay, schedule) : (0, 0);
+ }
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function defaultAdminDelayIncreaseWait() public view virtual returns (uint48) {
+ return 5 days;
+ }
+
+ ///
+ /// AccessControlDefaultAdminRules public and internal setters for defaultAdmin/pendingDefaultAdmin
+ ///
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function beginDefaultAdminTransfer(address newAdmin) public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
+ _beginDefaultAdminTransfer(newAdmin);
+ }
+
+ /**
+ * @dev See {beginDefaultAdminTransfer}.
+ *
+ * Internal function without access restriction.
+ */
+ function _beginDefaultAdminTransfer(address newAdmin) internal virtual {
+ uint48 newSchedule = SafeCast.toUint48(block.timestamp) + defaultAdminDelay();
+ _setPendingDefaultAdmin(newAdmin, newSchedule);
+ emit DefaultAdminTransferScheduled(newAdmin, newSchedule);
+ }
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function cancelDefaultAdminTransfer() public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
+ _cancelDefaultAdminTransfer();
+ }
+
+ /**
+ * @dev See {cancelDefaultAdminTransfer}.
+ *
+ * Internal function without access restriction.
+ */
+ function _cancelDefaultAdminTransfer() internal virtual {
+ _setPendingDefaultAdmin(address(0), 0);
+ }
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function acceptDefaultAdminTransfer() public virtual {
+ (address newDefaultAdmin, ) = pendingDefaultAdmin();
+ if (_msgSender() != newDefaultAdmin) {
+ // Enforce newDefaultAdmin explicit acceptance.
+ revert AccessControlInvalidDefaultAdmin(_msgSender());
+ }
+ _acceptDefaultAdminTransfer();
+ }
+
+ /**
+ * @dev See {acceptDefaultAdminTransfer}.
+ *
+ * Internal function without access restriction.
+ */
+ function _acceptDefaultAdminTransfer() internal virtual {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ (address newAdmin, uint48 schedule) = pendingDefaultAdmin();
+ if (!_isScheduleSet(schedule) || !_hasSchedulePassed(schedule)) {
+ revert AccessControlEnforcedDefaultAdminDelay(schedule);
+ }
+ _revokeRole(DEFAULT_ADMIN_ROLE, defaultAdmin());
+ _grantRole(DEFAULT_ADMIN_ROLE, newAdmin);
+ delete $._pendingDefaultAdmin;
+ delete $._pendingDefaultAdminSchedule;
+ }
+
+ ///
+ /// AccessControlDefaultAdminRules public and internal setters for defaultAdminDelay/pendingDefaultAdminDelay
+ ///
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function changeDefaultAdminDelay(uint48 newDelay) public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
+ _changeDefaultAdminDelay(newDelay);
+ }
+
+ /**
+ * @dev See {changeDefaultAdminDelay}.
+ *
+ * Internal function without access restriction.
+ */
+ function _changeDefaultAdminDelay(uint48 newDelay) internal virtual {
+ uint48 newSchedule = SafeCast.toUint48(block.timestamp) + _delayChangeWait(newDelay);
+ _setPendingDelay(newDelay, newSchedule);
+ emit DefaultAdminDelayChangeScheduled(newDelay, newSchedule);
+ }
+
+ /// @inheritdoc IAccessControlDefaultAdminRules
+ function rollbackDefaultAdminDelay() public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
+ _rollbackDefaultAdminDelay();
+ }
+
+ /**
+ * @dev See {rollbackDefaultAdminDelay}.
+ *
+ * Internal function without access restriction.
+ */
+ function _rollbackDefaultAdminDelay() internal virtual {
+ _setPendingDelay(0, 0);
+ }
+
+ /**
+ * @dev Returns the amount of seconds to wait after the `newDelay` will
+ * become the new {defaultAdminDelay}.
+ *
+ * The value returned guarantees that if the delay is reduced, it will go into effect
+ * after a wait that honors the previously set delay.
+ *
+ * See {defaultAdminDelayIncreaseWait}.
+ */
+ function _delayChangeWait(uint48 newDelay) internal view virtual returns (uint48) {
+ uint48 currentDelay = defaultAdminDelay();
+
+ // When increasing the delay, we schedule the delay change to occur after a period of "new delay" has passed, up
+ // to a maximum given by defaultAdminDelayIncreaseWait, by default 5 days. For example, if increasing from 1 day
+ // to 3 days, the new delay will come into effect after 3 days. If increasing from 1 day to 10 days, the new
+ // delay will come into effect after 5 days. The 5 day wait period is intended to be able to fix an error like
+ // using milliseconds instead of seconds.
+ //
+ // When decreasing the delay, we wait the difference between "current delay" and "new delay". This guarantees
+ // that an admin transfer cannot be made faster than "current delay" at the time the delay change is scheduled.
+ // For example, if decreasing from 10 days to 3 days, the new delay will come into effect after 7 days.
+ return
+ newDelay > currentDelay
+ ? uint48(Math.min(newDelay, defaultAdminDelayIncreaseWait())) // no need to safecast, both inputs are uint48
+ : currentDelay - newDelay;
+ }
+
+ ///
+ /// Private setters
+ ///
+
+ /**
+ * @dev Setter of the tuple for pending admin and its schedule.
+ *
+ * May emit a {DefaultAdminTransferCanceled} event.
+ */
+ function _setPendingDefaultAdmin(address newAdmin, uint48 newSchedule) private {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ (, uint48 oldSchedule) = pendingDefaultAdmin();
+
+ $._pendingDefaultAdmin = newAdmin;
+ $._pendingDefaultAdminSchedule = newSchedule;
+
+ // An `oldSchedule` from `pendingDefaultAdmin()` is only set if it hasn't been accepted.
+ if (_isScheduleSet(oldSchedule)) {
+ // Emit for implicit cancellations when another default admin was scheduled.
+ emit DefaultAdminTransferCanceled();
+ }
+ }
+
+ /**
+ * @dev Setter of the tuple for pending delay and its schedule.
+ *
+ * May emit a {DefaultAdminDelayChangeCanceled} event.
+ */
+ function _setPendingDelay(uint48 newDelay, uint48 newSchedule) private {
+ AccessControlDefaultAdminRulesStorage storage $ = _getAccessControlDefaultAdminRulesStorage();
+ uint48 oldSchedule = $._pendingDelaySchedule;
+
+ if (_isScheduleSet(oldSchedule)) {
+ if (_hasSchedulePassed(oldSchedule)) {
+ // Materialize a virtual delay
+ $._currentDelay = $._pendingDelay;
+ } else {
+ // Emit for implicit cancellations when another delay was scheduled.
+ emit DefaultAdminDelayChangeCanceled();
+ }
+ }
+
+ $._pendingDelay = newDelay;
+ $._pendingDelaySchedule = newSchedule;
+ }
+
+ ///
+ /// Private helpers
+ ///
+
+ /**
+ * @dev Defines if a `schedule` is considered set. For consistency purposes.
+ */
+ function _isScheduleSet(uint48 schedule) private pure returns (bool) {
+ return schedule != 0;
+ }
+
+ /**
+ * @dev Defines if a `schedule` is considered passed. For consistency purposes.
+ */
+ function _hasSchedulePassed(uint48 schedule) private view returns (bool) {
+ return schedule < block.timestamp;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/access/extensions/AccessControlEnumerableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/access/extensions/AccessControlEnumerableUpgradeable.sol
new file mode 100644
index 0000000..3aa7b0a
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/access/extensions/AccessControlEnumerableUpgradeable.sol
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (access/extensions/AccessControlEnumerable.sol)
+
+pragma solidity ^0.8.24;
+
+import {IAccessControlEnumerable} from "@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.sol";
+import {AccessControlUpgradeable} from "../AccessControlUpgradeable.sol";
+import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {AccessControl} that allows enumerating the members of each role.
+ */
+abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerable, AccessControlUpgradeable {
+ using EnumerableSet for EnumerableSet.AddressSet;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.AccessControlEnumerable
+ struct AccessControlEnumerableStorage {
+ mapping(bytes32 role => EnumerableSet.AddressSet) _roleMembers;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControlEnumerable")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant AccessControlEnumerableStorageLocation = 0xc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000;
+
+ function _getAccessControlEnumerableStorage() private pure returns (AccessControlEnumerableStorage storage $) {
+ assembly {
+ $.slot := AccessControlEnumerableStorageLocation
+ }
+ }
+
+ function __AccessControlEnumerable_init() internal onlyInitializing {
+ }
+
+ function __AccessControlEnumerable_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
+ return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /**
+ * @dev Returns one of the accounts that have `role`. `index` must be a
+ * value between 0 and {getRoleMemberCount}, non-inclusive.
+ *
+ * Role bearers are not sorted in any particular way, and their ordering may
+ * change at any point.
+ *
+ * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
+ * you perform all queries on the same block. See the following
+ * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
+ * for more information.
+ */
+ function getRoleMember(bytes32 role, uint256 index) public view virtual returns (address) {
+ AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
+ return $._roleMembers[role].at(index);
+ }
+
+ /**
+ * @dev Returns the number of accounts that have `role`. Can be used
+ * together with {getRoleMember} to enumerate all bearers of a role.
+ */
+ function getRoleMemberCount(bytes32 role) public view virtual returns (uint256) {
+ AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
+ return $._roleMembers[role].length();
+ }
+
+ /**
+ * @dev Return all accounts that have `role`
+ *
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
+ * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
+ */
+ function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) {
+ AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
+ return $._roleMembers[role].values();
+ }
+
+ /**
+ * @dev Overload {AccessControl-_grantRole} to track enumerable memberships
+ */
+ function _grantRole(bytes32 role, address account) internal virtual override returns (bool) {
+ AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
+ bool granted = super._grantRole(role, account);
+ if (granted) {
+ $._roleMembers[role].add(account);
+ }
+ return granted;
+ }
+
+ /**
+ * @dev Overload {AccessControl-_revokeRole} to track enumerable memberships
+ */
+ function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) {
+ AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
+ bool revoked = super._revokeRole(role, account);
+ if (revoked) {
+ $._roleMembers[role].remove(account);
+ }
+ return revoked;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol
new file mode 100644
index 0000000..8067829
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/AccessManaged.sol)
+
+pragma solidity ^0.8.20;
+
+import {AuthorityUtils} from "@openzeppelin/contracts/access/manager/AuthorityUtils.sol";
+import {IAccessManager} from "@openzeppelin/contracts/access/manager/IAccessManager.sol";
+import {IAccessManaged} from "@openzeppelin/contracts/access/manager/IAccessManaged.sol";
+import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev This contract module makes available a {restricted} modifier. Functions decorated with this modifier will be
+ * permissioned according to an "authority": a contract like {AccessManager} that follows the {IAuthority} interface,
+ * implementing a policy that allows certain callers to access certain functions.
+ *
+ * IMPORTANT: The `restricted` modifier should never be used on `internal` functions, judiciously used in `public`
+ * functions, and ideally only used in `external` functions. See {restricted}.
+ */
+abstract contract AccessManagedUpgradeable is Initializable, ContextUpgradeable, IAccessManaged {
+ /// @custom:storage-location erc7201:openzeppelin.storage.AccessManaged
+ struct AccessManagedStorage {
+ address _authority;
+
+ bool _consumingSchedule;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessManaged")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant AccessManagedStorageLocation = 0xf3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a00;
+
+ function _getAccessManagedStorage() private pure returns (AccessManagedStorage storage $) {
+ assembly {
+ $.slot := AccessManagedStorageLocation
+ }
+ }
+
+ /**
+ * @dev Initializes the contract connected to an initial authority.
+ */
+ function __AccessManaged_init(address initialAuthority) internal onlyInitializing {
+ __AccessManaged_init_unchained(initialAuthority);
+ }
+
+ function __AccessManaged_init_unchained(address initialAuthority) internal onlyInitializing {
+ _setAuthority(initialAuthority);
+ }
+
+ /**
+ * @dev Restricts access to a function as defined by the connected Authority for this contract and the
+ * caller and selector of the function that entered the contract.
+ *
+ * [IMPORTANT]
+ * ====
+ * In general, this modifier should only be used on `external` functions. It is okay to use it on `public`
+ * functions that are used as external entry points and are not called internally. Unless you know what you're
+ * doing, it should never be used on `internal` functions. Failure to follow these rules can have critical security
+ * implications! This is because the permissions are determined by the function that entered the contract, i.e. the
+ * function at the bottom of the call stack, and not the function where the modifier is visible in the source code.
+ * ====
+ *
+ * [WARNING]
+ * ====
+ * Avoid adding this modifier to the https://docs.soliditylang.org/en/v0.8.20/contracts.html#receive-ether-function[`receive()`]
+ * function or the https://docs.soliditylang.org/en/v0.8.20/contracts.html#fallback-function[`fallback()`]. These
+ * functions are the only execution paths where a function selector cannot be unambiguously determined from the calldata
+ * since the selector defaults to `0x00000000` in the `receive()` function and similarly in the `fallback()` function
+ * if no calldata is provided. (See {_checkCanCall}).
+ *
+ * The `receive()` function will always panic whereas the `fallback()` may panic depending on the calldata length.
+ * ====
+ */
+ modifier restricted() {
+ _checkCanCall(_msgSender(), _msgData());
+ _;
+ }
+
+ /// @inheritdoc IAccessManaged
+ function authority() public view virtual returns (address) {
+ AccessManagedStorage storage $ = _getAccessManagedStorage();
+ return $._authority;
+ }
+
+ /// @inheritdoc IAccessManaged
+ function setAuthority(address newAuthority) public virtual {
+ address caller = _msgSender();
+ if (caller != authority()) {
+ revert AccessManagedUnauthorized(caller);
+ }
+ if (newAuthority.code.length == 0) {
+ revert AccessManagedInvalidAuthority(newAuthority);
+ }
+ _setAuthority(newAuthority);
+ }
+
+ /// @inheritdoc IAccessManaged
+ function isConsumingScheduledOp() public view returns (bytes4) {
+ AccessManagedStorage storage $ = _getAccessManagedStorage();
+ return $._consumingSchedule ? this.isConsumingScheduledOp.selector : bytes4(0);
+ }
+
+ /**
+ * @dev Transfers control to a new authority. Internal function with no access restriction. Allows bypassing the
+ * permissions set by the current authority.
+ */
+ function _setAuthority(address newAuthority) internal virtual {
+ AccessManagedStorage storage $ = _getAccessManagedStorage();
+ $._authority = newAuthority;
+ emit AuthorityUpdated(newAuthority);
+ }
+
+ /**
+ * @dev Reverts if the caller is not allowed to call the function identified by a selector. Panics if the calldata
+ * is less than 4 bytes long.
+ */
+ function _checkCanCall(address caller, bytes calldata data) internal virtual {
+ AccessManagedStorage storage $ = _getAccessManagedStorage();
+ (bool immediate, uint32 delay) = AuthorityUtils.canCallWithDelay(
+ authority(),
+ caller,
+ address(this),
+ bytes4(data[0:4])
+ );
+ if (!immediate) {
+ if (delay > 0) {
+ $._consumingSchedule = true;
+ IAccessManager(authority()).consumeScheduledOp(caller, data);
+ $._consumingSchedule = false;
+ } else {
+ revert AccessManagedUnauthorized(caller);
+ }
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/access/manager/AccessManagerUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/access/manager/AccessManagerUpgradeable.sol
new file mode 100644
index 0000000..9e064a4
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/access/manager/AccessManagerUpgradeable.sol
@@ -0,0 +1,784 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (access/manager/AccessManager.sol)
+
+pragma solidity ^0.8.20;
+
+import {IAccessManager} from "@openzeppelin/contracts/access/manager/IAccessManager.sol";
+import {IAccessManaged} from "@openzeppelin/contracts/access/manager/IAccessManaged.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol";
+import {MulticallUpgradeable} from "../../utils/MulticallUpgradeable.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {Time} from "@openzeppelin/contracts/utils/types/Time.sol";
+import {Hashes} from "@openzeppelin/contracts/utils/cryptography/Hashes.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev AccessManager is a central contract to store the permissions of a system.
+ *
+ * A smart contract under the control of an AccessManager instance is known as a target, and will inherit from the
+ * {AccessManaged} contract, be connected to this contract as its manager and implement the {AccessManaged-restricted}
+ * modifier on a set of functions selected to be permissioned. Note that any function without this setup won't be
+ * effectively restricted.
+ *
+ * The restriction rules for such functions are defined in terms of "roles" identified by an `uint64` and scoped
+ * by target (`address`) and function selectors (`bytes4`). These roles are stored in this contract and can be
+ * configured by admins (`ADMIN_ROLE` members) after a delay (see {getTargetAdminDelay}).
+ *
+ * For each target contract, admins can configure the following without any delay:
+ *
+ * * The target's {AccessManaged-authority} via {updateAuthority}.
+ * * Close or open a target via {setTargetClosed} keeping the permissions intact.
+ * * The roles that are allowed (or disallowed) to call a given function (identified by its selector) through {setTargetFunctionRole}.
+ *
+ * By default every address is member of the `PUBLIC_ROLE` and every target function is restricted to the `ADMIN_ROLE` until configured otherwise.
+ * Additionally, each role has the following configuration options restricted to this manager's admins:
+ *
+ * * A role's admin role via {setRoleAdmin} who can grant or revoke roles.
+ * * A role's guardian role via {setRoleGuardian} who's allowed to cancel operations.
+ * * A delay in which a role takes effect after being granted through {setGrantDelay}.
+ * * A delay of any target's admin action via {setTargetAdminDelay}.
+ * * A role label for discoverability purposes with {labelRole}.
+ *
+ * Any account can be added and removed into any number of these roles by using the {grantRole} and {revokeRole} functions
+ * restricted to each role's admin (see {getRoleAdmin}).
+ *
+ * Since all the permissions of the managed system can be modified by the admins of this instance, it is expected that
+ * they will be highly secured (e.g., a multisig or a well-configured DAO).
+ *
+ * NOTE: This contract implements a form of the {IAuthority} interface, but {canCall} has additional return data so it
+ * doesn't inherit `IAuthority`. It is however compatible with the `IAuthority` interface since the first 32 bytes of
+ * the return data are a boolean as expected by that interface.
+ *
+ * NOTE: Systems that implement other access control mechanisms (for example using {Ownable}) can be paired with an
+ * {AccessManager} by transferring permissions (ownership in the case of {Ownable}) directly to the {AccessManager}.
+ * Users will be able to interact with these contracts through the {execute} function, following the access rules
+ * registered in the {AccessManager}. Keep in mind that in that context, the msg.sender seen by restricted functions
+ * will be {AccessManager} itself.
+ *
+ * WARNING: When granting permissions over an {Ownable} or {AccessControl} contract to an {AccessManager}, be very
+ * mindful of the danger associated with functions such as {Ownable-renounceOwnership} or
+ * {AccessControl-renounceRole}.
+ */
+contract AccessManagerUpgradeable is Initializable, ContextUpgradeable, MulticallUpgradeable, IAccessManager {
+ using Time for *;
+
+ // Structure that stores the details for a target contract.
+ struct TargetConfig {
+ mapping(bytes4 selector => uint64 roleId) allowedRoles;
+ Time.Delay adminDelay;
+ bool closed;
+ }
+
+ // Structure that stores the details for a role/account pair. This structure fits into a single slot.
+ struct Access {
+ // Timepoint at which the user gets the permission.
+ // If this is either 0 or in the future, then the role permission is not available.
+ uint48 since;
+ // Delay for execution. Only applies to restricted() / execute() calls.
+ Time.Delay delay;
+ }
+
+ // Structure that stores the details of a role.
+ struct Role {
+ // Members of the role.
+ mapping(address user => Access access) members;
+ // Admin who can grant or revoke permissions.
+ uint64 admin;
+ // Guardian who can cancel operations targeting functions that need this role.
+ uint64 guardian;
+ // Delay in which the role takes effect after being granted.
+ Time.Delay grantDelay;
+ }
+
+ // Structure that stores the details for a scheduled operation. This structure fits into a single slot.
+ struct Schedule {
+ // Moment at which the operation can be executed.
+ uint48 timepoint;
+ // Operation nonce to allow third-party contracts to identify the operation.
+ uint32 nonce;
+ }
+
+ /**
+ * @dev The identifier of the admin role. Required to perform most configuration operations including
+ * other roles' management and target restrictions.
+ */
+ uint64 public constant ADMIN_ROLE = type(uint64).min; // 0
+
+ /**
+ * @dev The identifier of the public role. Automatically granted to all addresses with no delay.
+ */
+ uint64 public constant PUBLIC_ROLE = type(uint64).max; // 2**64-1
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.AccessManager
+ struct AccessManagerStorage {
+ mapping(address target => TargetConfig mode) _targets;
+ mapping(uint64 roleId => Role) _roles;
+ mapping(bytes32 operationId => Schedule) _schedules;
+
+ // Used to identify operations that are currently being executed via {execute}.
+ // This should be transient storage when supported by the EVM.
+ bytes32 _executionId;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessManager")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant AccessManagerStorageLocation = 0x40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad00;
+
+ function _getAccessManagerStorage() private pure returns (AccessManagerStorage storage $) {
+ assembly {
+ $.slot := AccessManagerStorageLocation
+ }
+ }
+
+ /**
+ * @dev Check that the caller is authorized to perform the operation.
+ * See {AccessManager} description for a detailed breakdown of the authorization logic.
+ */
+ modifier onlyAuthorized() {
+ _checkAuthorized();
+ _;
+ }
+
+ function initialize(address initialAdmin) public virtual initializer {
+ __AccessManager_init(initialAdmin);
+ }
+ function __AccessManager_init(address initialAdmin) internal onlyInitializing {
+ __AccessManager_init_unchained(initialAdmin);
+ }
+
+ function __AccessManager_init_unchained(address initialAdmin) internal onlyInitializing {
+ if (initialAdmin == address(0)) {
+ revert AccessManagerInvalidInitialAdmin(address(0));
+ }
+
+ // admin is active immediately and without any execution delay.
+ _grantRole(ADMIN_ROLE, initialAdmin, 0, 0);
+ }
+
+ // =================================================== GETTERS ====================================================
+ /// @inheritdoc IAccessManager
+ function canCall(
+ address caller,
+ address target,
+ bytes4 selector
+ ) public view virtual returns (bool immediate, uint32 delay) {
+ if (isTargetClosed(target)) {
+ return (false, 0);
+ } else if (caller == address(this)) {
+ // Caller is AccessManager, this means the call was sent through {execute} and it already checked
+ // permissions. We verify that the call "identifier", which is set during {execute}, is correct.
+ return (_isExecuting(target, selector), 0);
+ } else {
+ uint64 roleId = getTargetFunctionRole(target, selector);
+ (bool isMember, uint32 currentDelay) = hasRole(roleId, caller);
+ return isMember ? (currentDelay == 0, currentDelay) : (false, 0);
+ }
+ }
+
+ /// @inheritdoc IAccessManager
+ function expiration() public view virtual returns (uint32) {
+ return 1 weeks;
+ }
+
+ /// @inheritdoc IAccessManager
+ function minSetback() public view virtual returns (uint32) {
+ return 5 days;
+ }
+
+ /// @inheritdoc IAccessManager
+ function isTargetClosed(address target) public view virtual returns (bool) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ return $._targets[target].closed;
+ }
+
+ /// @inheritdoc IAccessManager
+ function getTargetFunctionRole(address target, bytes4 selector) public view virtual returns (uint64) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ return $._targets[target].allowedRoles[selector];
+ }
+
+ /// @inheritdoc IAccessManager
+ function getTargetAdminDelay(address target) public view virtual returns (uint32) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ return $._targets[target].adminDelay.get();
+ }
+
+ /// @inheritdoc IAccessManager
+ function getRoleAdmin(uint64 roleId) public view virtual returns (uint64) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ return $._roles[roleId].admin;
+ }
+
+ /// @inheritdoc IAccessManager
+ function getRoleGuardian(uint64 roleId) public view virtual returns (uint64) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ return $._roles[roleId].guardian;
+ }
+
+ /// @inheritdoc IAccessManager
+ function getRoleGrantDelay(uint64 roleId) public view virtual returns (uint32) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ return $._roles[roleId].grantDelay.get();
+ }
+
+ /// @inheritdoc IAccessManager
+ function getAccess(
+ uint64 roleId,
+ address account
+ ) public view virtual returns (uint48 since, uint32 currentDelay, uint32 pendingDelay, uint48 effect) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ Access storage access = $._roles[roleId].members[account];
+
+ since = access.since;
+ (currentDelay, pendingDelay, effect) = access.delay.getFull();
+
+ return (since, currentDelay, pendingDelay, effect);
+ }
+
+ /// @inheritdoc IAccessManager
+ function hasRole(
+ uint64 roleId,
+ address account
+ ) public view virtual returns (bool isMember, uint32 executionDelay) {
+ if (roleId == PUBLIC_ROLE) {
+ return (true, 0);
+ } else {
+ (uint48 hasRoleSince, uint32 currentDelay, , ) = getAccess(roleId, account);
+ return (hasRoleSince != 0 && hasRoleSince <= Time.timestamp(), currentDelay);
+ }
+ }
+
+ // =============================================== ROLE MANAGEMENT ===============================================
+ /// @inheritdoc IAccessManager
+ function labelRole(uint64 roleId, string calldata label) public virtual onlyAuthorized {
+ if (roleId == ADMIN_ROLE || roleId == PUBLIC_ROLE) {
+ revert AccessManagerLockedRole(roleId);
+ }
+ emit RoleLabel(roleId, label);
+ }
+
+ /// @inheritdoc IAccessManager
+ function grantRole(uint64 roleId, address account, uint32 executionDelay) public virtual onlyAuthorized {
+ _grantRole(roleId, account, getRoleGrantDelay(roleId), executionDelay);
+ }
+
+ /// @inheritdoc IAccessManager
+ function revokeRole(uint64 roleId, address account) public virtual onlyAuthorized {
+ _revokeRole(roleId, account);
+ }
+
+ /// @inheritdoc IAccessManager
+ function renounceRole(uint64 roleId, address callerConfirmation) public virtual {
+ if (callerConfirmation != _msgSender()) {
+ revert AccessManagerBadConfirmation();
+ }
+ _revokeRole(roleId, callerConfirmation);
+ }
+
+ /// @inheritdoc IAccessManager
+ function setRoleAdmin(uint64 roleId, uint64 admin) public virtual onlyAuthorized {
+ _setRoleAdmin(roleId, admin);
+ }
+
+ /// @inheritdoc IAccessManager
+ function setRoleGuardian(uint64 roleId, uint64 guardian) public virtual onlyAuthorized {
+ _setRoleGuardian(roleId, guardian);
+ }
+
+ /// @inheritdoc IAccessManager
+ function setGrantDelay(uint64 roleId, uint32 newDelay) public virtual onlyAuthorized {
+ _setGrantDelay(roleId, newDelay);
+ }
+
+ /**
+ * @dev Internal version of {grantRole} without access control. Returns true if the role was newly granted.
+ *
+ * Emits a {RoleGranted} event.
+ */
+ function _grantRole(
+ uint64 roleId,
+ address account,
+ uint32 grantDelay,
+ uint32 executionDelay
+ ) internal virtual returns (bool) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ if (roleId == PUBLIC_ROLE) {
+ revert AccessManagerLockedRole(roleId);
+ }
+
+ bool newMember = $._roles[roleId].members[account].since == 0;
+ uint48 since;
+
+ if (newMember) {
+ since = Time.timestamp() + grantDelay;
+ $._roles[roleId].members[account] = Access({since: since, delay: executionDelay.toDelay()});
+ } else {
+ // No setback here. Value can be reset by doing revoke + grant, effectively allowing the admin to perform
+ // any change to the execution delay within the duration of the role admin delay.
+ ($._roles[roleId].members[account].delay, since) = $._roles[roleId].members[account].delay.withUpdate(
+ executionDelay,
+ 0
+ );
+ }
+
+ emit RoleGranted(roleId, account, executionDelay, since, newMember);
+ return newMember;
+ }
+
+ /**
+ * @dev Internal version of {revokeRole} without access control. This logic is also used by {renounceRole}.
+ * Returns true if the role was previously granted.
+ *
+ * Emits a {RoleRevoked} event if the account had the role.
+ */
+ function _revokeRole(uint64 roleId, address account) internal virtual returns (bool) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ if (roleId == PUBLIC_ROLE) {
+ revert AccessManagerLockedRole(roleId);
+ }
+
+ if ($._roles[roleId].members[account].since == 0) {
+ return false;
+ }
+
+ delete $._roles[roleId].members[account];
+
+ emit RoleRevoked(roleId, account);
+ return true;
+ }
+
+ /**
+ * @dev Internal version of {setRoleAdmin} without access control.
+ *
+ * Emits a {RoleAdminChanged} event.
+ *
+ * NOTE: Setting the admin role as the `PUBLIC_ROLE` is allowed, but it will effectively allow
+ * anyone to set grant or revoke such role.
+ */
+ function _setRoleAdmin(uint64 roleId, uint64 admin) internal virtual {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ if (roleId == ADMIN_ROLE || roleId == PUBLIC_ROLE) {
+ revert AccessManagerLockedRole(roleId);
+ }
+
+ $._roles[roleId].admin = admin;
+
+ emit RoleAdminChanged(roleId, admin);
+ }
+
+ /**
+ * @dev Internal version of {setRoleGuardian} without access control.
+ *
+ * Emits a {RoleGuardianChanged} event.
+ *
+ * NOTE: Setting the guardian role as the `PUBLIC_ROLE` is allowed, but it will effectively allow
+ * anyone to cancel any scheduled operation for such role.
+ */
+ function _setRoleGuardian(uint64 roleId, uint64 guardian) internal virtual {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ if (roleId == ADMIN_ROLE || roleId == PUBLIC_ROLE) {
+ revert AccessManagerLockedRole(roleId);
+ }
+
+ $._roles[roleId].guardian = guardian;
+
+ emit RoleGuardianChanged(roleId, guardian);
+ }
+
+ /**
+ * @dev Internal version of {setGrantDelay} without access control.
+ *
+ * Emits a {RoleGrantDelayChanged} event.
+ */
+ function _setGrantDelay(uint64 roleId, uint32 newDelay) internal virtual {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ if (roleId == PUBLIC_ROLE) {
+ revert AccessManagerLockedRole(roleId);
+ }
+
+ uint48 effect;
+ ($._roles[roleId].grantDelay, effect) = $._roles[roleId].grantDelay.withUpdate(newDelay, minSetback());
+
+ emit RoleGrantDelayChanged(roleId, newDelay, effect);
+ }
+
+ // ============================================= FUNCTION MANAGEMENT ==============================================
+ /// @inheritdoc IAccessManager
+ function setTargetFunctionRole(
+ address target,
+ bytes4[] calldata selectors,
+ uint64 roleId
+ ) public virtual onlyAuthorized {
+ for (uint256 i = 0; i < selectors.length; ++i) {
+ _setTargetFunctionRole(target, selectors[i], roleId);
+ }
+ }
+
+ /**
+ * @dev Internal version of {setTargetFunctionRole} without access control.
+ *
+ * Emits a {TargetFunctionRoleUpdated} event.
+ */
+ function _setTargetFunctionRole(address target, bytes4 selector, uint64 roleId) internal virtual {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ $._targets[target].allowedRoles[selector] = roleId;
+ emit TargetFunctionRoleUpdated(target, selector, roleId);
+ }
+
+ /// @inheritdoc IAccessManager
+ function setTargetAdminDelay(address target, uint32 newDelay) public virtual onlyAuthorized {
+ _setTargetAdminDelay(target, newDelay);
+ }
+
+ /**
+ * @dev Internal version of {setTargetAdminDelay} without access control.
+ *
+ * Emits a {TargetAdminDelayUpdated} event.
+ */
+ function _setTargetAdminDelay(address target, uint32 newDelay) internal virtual {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ uint48 effect;
+ ($._targets[target].adminDelay, effect) = $._targets[target].adminDelay.withUpdate(newDelay, minSetback());
+
+ emit TargetAdminDelayUpdated(target, newDelay, effect);
+ }
+
+ // =============================================== MODE MANAGEMENT ================================================
+ /// @inheritdoc IAccessManager
+ function setTargetClosed(address target, bool closed) public virtual onlyAuthorized {
+ _setTargetClosed(target, closed);
+ }
+
+ /**
+ * @dev Set the closed flag for a contract. This is an internal setter with no access restrictions.
+ *
+ * Emits a {TargetClosed} event.
+ */
+ function _setTargetClosed(address target, bool closed) internal virtual {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ $._targets[target].closed = closed;
+ emit TargetClosed(target, closed);
+ }
+
+ // ============================================== DELAYED OPERATIONS ==============================================
+ /// @inheritdoc IAccessManager
+ function getSchedule(bytes32 id) public view virtual returns (uint48) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ uint48 timepoint = $._schedules[id].timepoint;
+ return _isExpired(timepoint) ? 0 : timepoint;
+ }
+
+ /// @inheritdoc IAccessManager
+ function getNonce(bytes32 id) public view virtual returns (uint32) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ return $._schedules[id].nonce;
+ }
+
+ /// @inheritdoc IAccessManager
+ function schedule(
+ address target,
+ bytes calldata data,
+ uint48 when
+ ) public virtual returns (bytes32 operationId, uint32 nonce) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ address caller = _msgSender();
+
+ // Fetch restrictions that apply to the caller on the targeted function
+ (, uint32 setback) = _canCallExtended(caller, target, data);
+
+ uint48 minWhen = Time.timestamp() + setback;
+
+ // If call with delay is not authorized, or if requested timing is too soon, revert
+ if (setback == 0 || (when > 0 && when < minWhen)) {
+ revert AccessManagerUnauthorizedCall(caller, target, _checkSelector(data));
+ }
+
+ // Reuse variable due to stack too deep
+ when = uint48(Math.max(when, minWhen)); // cast is safe: both inputs are uint48
+
+ // If caller is authorised, schedule operation
+ operationId = hashOperation(caller, target, data);
+
+ _checkNotScheduled(operationId);
+
+ unchecked {
+ // It's not feasible to overflow the nonce in less than 1000 years
+ nonce = $._schedules[operationId].nonce + 1;
+ }
+ $._schedules[operationId].timepoint = when;
+ $._schedules[operationId].nonce = nonce;
+ emit OperationScheduled(operationId, nonce, when, caller, target, data);
+
+ // Using named return values because otherwise we get stack too deep
+ }
+
+ /**
+ * @dev Reverts if the operation is currently scheduled and has not expired.
+ *
+ * NOTE: This function was introduced due to stack too deep errors in schedule.
+ */
+ function _checkNotScheduled(bytes32 operationId) private view {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ uint48 prevTimepoint = $._schedules[operationId].timepoint;
+ if (prevTimepoint != 0 && !_isExpired(prevTimepoint)) {
+ revert AccessManagerAlreadyScheduled(operationId);
+ }
+ }
+
+ /// @inheritdoc IAccessManager
+ // Reentrancy is not an issue because permissions are checked on msg.sender. Additionally,
+ // _consumeScheduledOp guarantees a scheduled operation is only executed once.
+ // slither-disable-next-line reentrancy-no-eth
+ function execute(address target, bytes calldata data) public payable virtual returns (uint32) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ address caller = _msgSender();
+
+ // Fetch restrictions that apply to the caller on the targeted function
+ (bool immediate, uint32 setback) = _canCallExtended(caller, target, data);
+
+ // If call is not authorized, revert
+ if (!immediate && setback == 0) {
+ revert AccessManagerUnauthorizedCall(caller, target, _checkSelector(data));
+ }
+
+ bytes32 operationId = hashOperation(caller, target, data);
+ uint32 nonce;
+
+ // If caller is authorised, check operation was scheduled early enough
+ // Consume an available schedule even if there is no currently enforced delay
+ if (setback != 0 || getSchedule(operationId) != 0) {
+ nonce = _consumeScheduledOp(operationId);
+ }
+
+ // Mark the target and selector as authorised
+ bytes32 executionIdBefore = $._executionId;
+ $._executionId = _hashExecutionId(target, _checkSelector(data));
+
+ // Perform call
+ Address.functionCallWithValue(target, data, msg.value);
+
+ // Reset execute identifier
+ $._executionId = executionIdBefore;
+
+ return nonce;
+ }
+
+ /// @inheritdoc IAccessManager
+ function cancel(address caller, address target, bytes calldata data) public virtual returns (uint32) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ address msgsender = _msgSender();
+ bytes4 selector = _checkSelector(data);
+
+ bytes32 operationId = hashOperation(caller, target, data);
+ if ($._schedules[operationId].timepoint == 0) {
+ revert AccessManagerNotScheduled(operationId);
+ } else if (caller != msgsender) {
+ // calls can only be canceled by the account that scheduled them, a global admin, or by a guardian of the required role.
+ (bool isAdmin, ) = hasRole(ADMIN_ROLE, msgsender);
+ (bool isGuardian, ) = hasRole(getRoleGuardian(getTargetFunctionRole(target, selector)), msgsender);
+ if (!isAdmin && !isGuardian) {
+ revert AccessManagerUnauthorizedCancel(msgsender, caller, target, selector);
+ }
+ }
+
+ delete $._schedules[operationId].timepoint; // reset the timepoint, keep the nonce
+ uint32 nonce = $._schedules[operationId].nonce;
+ emit OperationCanceled(operationId, nonce);
+
+ return nonce;
+ }
+
+ /// @inheritdoc IAccessManager
+ function consumeScheduledOp(address caller, bytes calldata data) public virtual {
+ address target = _msgSender();
+ if (IAccessManaged(target).isConsumingScheduledOp() != IAccessManaged.isConsumingScheduledOp.selector) {
+ revert AccessManagerUnauthorizedConsume(target);
+ }
+ _consumeScheduledOp(hashOperation(caller, target, data));
+ }
+
+ /**
+ * @dev Internal variant of {consumeScheduledOp} that operates on bytes32 operationId.
+ *
+ * Returns the nonce of the scheduled operation that is consumed.
+ */
+ function _consumeScheduledOp(bytes32 operationId) internal virtual returns (uint32) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ uint48 timepoint = $._schedules[operationId].timepoint;
+ uint32 nonce = $._schedules[operationId].nonce;
+
+ if (timepoint == 0) {
+ revert AccessManagerNotScheduled(operationId);
+ } else if (timepoint > Time.timestamp()) {
+ revert AccessManagerNotReady(operationId);
+ } else if (_isExpired(timepoint)) {
+ revert AccessManagerExpired(operationId);
+ }
+
+ delete $._schedules[operationId].timepoint; // reset the timepoint, keep the nonce
+ emit OperationExecuted(operationId, nonce);
+
+ return nonce;
+ }
+
+ /// @inheritdoc IAccessManager
+ function hashOperation(address caller, address target, bytes calldata data) public view virtual returns (bytes32) {
+ return keccak256(abi.encode(caller, target, data));
+ }
+
+ // ==================================================== OTHERS ====================================================
+ /// @inheritdoc IAccessManager
+ function updateAuthority(address target, address newAuthority) public virtual onlyAuthorized {
+ IAccessManaged(target).setAuthority(newAuthority);
+ }
+
+ // ================================================= ADMIN LOGIC ==================================================
+ /**
+ * @dev Check if the current call is authorized according to admin and roles logic.
+ *
+ * WARNING: Carefully review the considerations of {AccessManaged-restricted} since they apply to this modifier.
+ */
+ function _checkAuthorized() private {
+ address caller = _msgSender();
+ (bool immediate, uint32 delay) = _canCallSelf(caller, _msgData());
+ if (!immediate) {
+ if (delay == 0) {
+ (, uint64 requiredRole, ) = _getAdminRestrictions(_msgData());
+ revert AccessManagerUnauthorizedAccount(caller, requiredRole);
+ } else {
+ _consumeScheduledOp(hashOperation(caller, address(this), _msgData()));
+ }
+ }
+ }
+
+ /**
+ * @dev Get the admin restrictions of a given function call based on the function and arguments involved.
+ *
+ * Returns:
+ * - bool restricted: does this data match a restricted operation
+ * - uint64: which role is this operation restricted to
+ * - uint32: minimum delay to enforce for that operation (max between operation's delay and admin's execution delay)
+ */
+ function _getAdminRestrictions(
+ bytes calldata data
+ ) private view returns (bool adminRestricted, uint64 roleAdminId, uint32 executionDelay) {
+ if (data.length < 4) {
+ return (false, 0, 0);
+ }
+
+ bytes4 selector = _checkSelector(data);
+
+ // Restricted to ADMIN with no delay beside any execution delay the caller may have
+ if (
+ selector == this.labelRole.selector ||
+ selector == this.setRoleAdmin.selector ||
+ selector == this.setRoleGuardian.selector ||
+ selector == this.setGrantDelay.selector ||
+ selector == this.setTargetAdminDelay.selector
+ ) {
+ return (true, ADMIN_ROLE, 0);
+ }
+
+ // Restricted to ADMIN with the admin delay corresponding to the target
+ if (
+ selector == this.updateAuthority.selector ||
+ selector == this.setTargetClosed.selector ||
+ selector == this.setTargetFunctionRole.selector
+ ) {
+ // First argument is a target.
+ address target = abi.decode(data[0x04:0x24], (address));
+ uint32 delay = getTargetAdminDelay(target);
+ return (true, ADMIN_ROLE, delay);
+ }
+
+ // Restricted to that role's admin with no delay beside any execution delay the caller may have.
+ if (selector == this.grantRole.selector || selector == this.revokeRole.selector) {
+ // First argument is a roleId.
+ uint64 roleId = abi.decode(data[0x04:0x24], (uint64));
+ return (true, getRoleAdmin(roleId), 0);
+ }
+
+ return (false, getTargetFunctionRole(address(this), selector), 0);
+ }
+
+ // =================================================== HELPERS ====================================================
+ /**
+ * @dev An extended version of {canCall} for internal usage that checks {_canCallSelf}
+ * when the target is this contract.
+ *
+ * Returns:
+ * - bool immediate: whether the operation can be executed immediately (with no delay)
+ * - uint32 delay: the execution delay
+ */
+ function _canCallExtended(
+ address caller,
+ address target,
+ bytes calldata data
+ ) private view returns (bool immediate, uint32 delay) {
+ if (target == address(this)) {
+ return _canCallSelf(caller, data);
+ } else {
+ return data.length < 4 ? (false, 0) : canCall(caller, target, _checkSelector(data));
+ }
+ }
+
+ /**
+ * @dev A version of {canCall} that checks for restrictions in this contract.
+ */
+ function _canCallSelf(address caller, bytes calldata data) private view returns (bool immediate, uint32 delay) {
+ if (data.length < 4) {
+ return (false, 0);
+ }
+
+ if (caller == address(this)) {
+ // Caller is AccessManager, this means the call was sent through {execute} and it already checked
+ // permissions. We verify that the call "identifier", which is set during {execute}, is correct.
+ return (_isExecuting(address(this), _checkSelector(data)), 0);
+ }
+
+ (bool adminRestricted, uint64 roleId, uint32 operationDelay) = _getAdminRestrictions(data);
+
+ // isTargetClosed apply to non-admin-restricted function
+ if (!adminRestricted && isTargetClosed(address(this))) {
+ return (false, 0);
+ }
+
+ (bool inRole, uint32 executionDelay) = hasRole(roleId, caller);
+ if (!inRole) {
+ return (false, 0);
+ }
+
+ // downcast is safe because both options are uint32
+ delay = uint32(Math.max(operationDelay, executionDelay));
+ return (delay == 0, delay);
+ }
+
+ /**
+ * @dev Returns true if a call with `target` and `selector` is being executed via {executed}.
+ */
+ function _isExecuting(address target, bytes4 selector) private view returns (bool) {
+ AccessManagerStorage storage $ = _getAccessManagerStorage();
+ return $._executionId == _hashExecutionId(target, selector);
+ }
+
+ /**
+ * @dev Returns true if a schedule timepoint is past its expiration deadline.
+ */
+ function _isExpired(uint48 timepoint) private view returns (bool) {
+ return timepoint + expiration() <= Time.timestamp();
+ }
+
+ /**
+ * @dev Extracts the selector from calldata. Panics if data is not at least 4 bytes
+ */
+ function _checkSelector(bytes calldata data) private pure returns (bytes4) {
+ return bytes4(data[0:4]);
+ }
+
+ /**
+ * @dev Hashing function for execute protection
+ */
+ function _hashExecutionId(address target, bytes4 selector) private pure returns (bytes32) {
+ return Hashes.efficientKeccak256(bytes32(uint256(uint160(target))), selector);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol
new file mode 100644
index 0000000..6dad23d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol
@@ -0,0 +1,128 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (account/extensions/draft-AccountERC7579Hooked.sol)
+
+pragma solidity ^0.8.26;
+
+import {IERC7579Hook, MODULE_TYPE_HOOK} from "@openzeppelin/contracts/interfaces/draft-IERC7579.sol";
+import {ERC7579Utils, Mode} from "@openzeppelin/contracts/account/utils/draft-ERC7579Utils.sol";
+import {AccountERC7579Upgradeable} from "./draft-AccountERC7579Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {AccountERC7579} with support for a single hook module (type 4).
+ *
+ * If installed, this extension will call the hook module's {IERC7579Hook-preCheck} before executing any operation
+ * with {_execute} (including {execute} and {executeFromExecutor} by default) and {IERC7579Hook-postCheck} thereafter.
+ *
+ * NOTE: Hook modules break the check-effect-interaction pattern. In particular, the {IERC7579Hook-preCheck} hook can
+ * lead to potentially dangerous reentrancy. Using the `withHook()` modifier is safe if no effect is performed
+ * before the preHook or after the postHook. That is the case on all functions here, but it may not be the case if
+ * functions that have this modifier are overridden. Developers should be extremely careful when implementing hook
+ * modules or further overriding functions that involve hooks.
+ */
+abstract contract AccountERC7579HookedUpgradeable is Initializable, AccountERC7579Upgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.AccountERC7579Hooked
+ struct AccountERC7579HookedStorage {
+ address _hook;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccountERC7579Hooked")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant AccountERC7579HookedStorageLocation = 0x2b49b75317ffc1021ca7da4ca3423bf8403e18b223e63e6bc7abe8f39a5ed700;
+
+ function _getAccountERC7579HookedStorage() private pure returns (AccountERC7579HookedStorage storage $) {
+ assembly {
+ $.slot := AccountERC7579HookedStorageLocation
+ }
+ }
+
+ /// @dev A hook module is already present. This contract only supports one hook module.
+ error ERC7579HookModuleAlreadyPresent(address hook);
+
+ /**
+ * @dev Calls {IERC7579Hook-preCheck} before executing the modified function and {IERC7579Hook-postCheck}
+ * thereafter.
+ */
+ modifier withHook() {
+ address hook_ = hook();
+ bytes memory hookData;
+
+ // slither-disable-next-line reentrancy-no-eth
+ if (hook_ != address(0)) hookData = IERC7579Hook(hook_).preCheck(msg.sender, msg.value, msg.data);
+ _;
+ if (hook_ != address(0)) IERC7579Hook(hook_).postCheck(hookData);
+ }
+
+ function __AccountERC7579Hooked_init() internal onlyInitializing {
+ }
+
+ function __AccountERC7579Hooked_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc AccountERC7579Upgradeable
+ function accountId() public view virtual override returns (string memory) {
+ // vendorname.accountname.semver
+ return "@openzeppelin/contracts.AccountERC7579Hooked.v1.0.0";
+ }
+
+ /// @dev Returns the hook module address if installed, or `address(0)` otherwise.
+ function hook() public view virtual returns (address) {
+ AccountERC7579HookedStorage storage $ = _getAccountERC7579HookedStorage();
+ return $._hook;
+ }
+
+ /// @dev Supports hook modules. See {AccountERC7579-supportsModule}
+ function supportsModule(uint256 moduleTypeId) public view virtual override returns (bool) {
+ return moduleTypeId == MODULE_TYPE_HOOK || super.supportsModule(moduleTypeId);
+ }
+
+ /// @inheritdoc AccountERC7579Upgradeable
+ function isModuleInstalled(
+ uint256 moduleTypeId,
+ address module,
+ bytes calldata data
+ ) public view virtual override returns (bool) {
+ return
+ (moduleTypeId == MODULE_TYPE_HOOK && module == hook()) ||
+ super.isModuleInstalled(moduleTypeId, module, data);
+ }
+
+ /// @dev Installs a module with support for hook modules. See {AccountERC7579-_installModule}
+ function _installModule(
+ uint256 moduleTypeId,
+ address module,
+ bytes memory initData
+ ) internal virtual override withHook {
+ AccountERC7579HookedStorage storage $ = _getAccountERC7579HookedStorage();
+ if (moduleTypeId == MODULE_TYPE_HOOK) {
+ require($._hook == address(0), ERC7579HookModuleAlreadyPresent($._hook));
+ $._hook = module;
+ }
+ super._installModule(moduleTypeId, module, initData);
+ }
+
+ /// @dev Uninstalls a module with support for hook modules. See {AccountERC7579-_uninstallModule}
+ function _uninstallModule(
+ uint256 moduleTypeId,
+ address module,
+ bytes memory deInitData
+ ) internal virtual override withHook {
+ AccountERC7579HookedStorage storage $ = _getAccountERC7579HookedStorage();
+ if (moduleTypeId == MODULE_TYPE_HOOK) {
+ require($._hook == module, ERC7579Utils.ERC7579UninstalledModule(moduleTypeId, module));
+ $._hook = address(0);
+ }
+ super._uninstallModule(moduleTypeId, module, deInitData);
+ }
+
+ /// @dev Hooked version of {AccountERC7579-_execute}.
+ function _execute(
+ Mode mode,
+ bytes calldata executionCalldata
+ ) internal virtual override withHook returns (bytes[] memory) {
+ return super._execute(mode, executionCalldata);
+ }
+
+ /// @dev Hooked version of {AccountERC7579-_fallback}.
+ function _fallback() internal virtual override withHook returns (bytes memory) {
+ return super._fallback();
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol
new file mode 100644
index 0000000..151b459
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol
@@ -0,0 +1,433 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (account/extensions/draft-AccountERC7579.sol)
+
+pragma solidity ^0.8.26;
+
+import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";
+import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";
+import {IERC7579Module, IERC7579Validator, IERC7579Execution, IERC7579AccountConfig, IERC7579ModuleConfig, MODULE_TYPE_VALIDATOR, MODULE_TYPE_EXECUTOR, MODULE_TYPE_FALLBACK} from "@openzeppelin/contracts/interfaces/draft-IERC7579.sol";
+import {ERC7579Utils, Mode, CallType, ExecType} from "@openzeppelin/contracts/account/utils/draft-ERC7579Utils.sol";
+import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
+import {LowLevelCall} from "@openzeppelin/contracts/utils/LowLevelCall.sol";
+import {Bytes} from "@openzeppelin/contracts/utils/Bytes.sol";
+import {Packing} from "@openzeppelin/contracts/utils/Packing.sol";
+import {Calldata} from "@openzeppelin/contracts/utils/Calldata.sol";
+import {Account} from "@openzeppelin/contracts/account/Account.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Account} that implements support for ERC-7579 modules.
+ *
+ * To comply with the ERC-1271 support requirement, this contract defers signature validation to
+ * installed validator modules by calling {IERC7579Validator-isValidSignatureWithSender}.
+ *
+ * This contract does not implement validation logic for user operations since this functionality
+ * is often delegated to self-contained validation modules. Developers must install a validator module
+ * upon initialization (or any other mechanism to enable execution from the account):
+ *
+ * ```solidity
+ * contract MyAccountERC7579 is AccountERC7579, Initializable {
+ * function initializeAccount(address validator, bytes calldata validatorData) public initializer {
+ * _installModule(MODULE_TYPE_VALIDATOR, validator, validatorData);
+ * }
+ * }
+ * ```
+ *
+ * [NOTE]
+ * ====
+ * * Hook support is not included. See {AccountERC7579Hooked} for a version that hooks to execution.
+ * * Validator selection, when verifying either ERC-1271 signature or ERC-4337 UserOperation is implemented in
+ * internal virtual functions {_extractUserOpValidator} and {_extractSignatureValidator}. Both are implemented
+ * following common practices. However, this part is not standardized in ERC-7579 (or in any follow-up ERC). Some
+ * accounts may want to override these internal functions.
+ * * When combined with {ERC7739}, resolution ordering of {isValidSignature} may have an impact ({ERC7739} does not
+ * call super). Manual resolution might be necessary.
+ * * Static calls (using callType `0xfe`) are currently NOT supported.
+ * ====
+ *
+ * WARNING: Removing all validator modules will render the account inoperable, as no user operations can be validated thereafter.
+ */
+abstract contract AccountERC7579Upgradeable is Initializable, Account, IERC1271, IERC7579Execution, IERC7579AccountConfig, IERC7579ModuleConfig {
+ using Bytes for *;
+ using ERC7579Utils for *;
+ using EnumerableSet for *;
+ using Packing for bytes32;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.AccountERC7579
+ struct AccountERC7579Storage {
+ EnumerableSet.AddressSet _validators;
+ EnumerableSet.AddressSet _executors;
+ mapping(bytes4 selector => address) _fallbacks;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccountERC7579")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant AccountERC7579StorageLocation = 0x0a47d913d72b2639f4ca1c145cc07ddf7170b73b257c8e0d4fced7cc8e3e3900;
+
+ function _getAccountERC7579Storage() private pure returns (AccountERC7579Storage storage $) {
+ assembly {
+ $.slot := AccountERC7579StorageLocation
+ }
+ }
+
+ /// @dev The account's {fallback} was called with a selector that doesn't have an installed handler.
+ error ERC7579MissingFallbackHandler(bytes4 selector);
+
+ /// @dev The provided initData/deInitData for a fallback module is too short to extract a selector.
+ error ERC7579CannotDecodeFallbackData();
+
+ /// @dev Modifier that checks if the caller is an installed module of the given type.
+ modifier onlyModule(uint256 moduleTypeId, bytes calldata additionalContext) {
+ _checkModule(moduleTypeId, msg.sender, additionalContext);
+ _;
+ }
+
+ function __AccountERC7579_init() internal onlyInitializing {
+ }
+
+ function __AccountERC7579_init_unchained() internal onlyInitializing {
+ }
+ /// @dev See {_fallback}.
+ fallback(bytes calldata) external payable virtual returns (bytes memory) {
+ return _fallback();
+ }
+
+ /// @inheritdoc IERC7579AccountConfig
+ function accountId() public view virtual returns (string memory) {
+ // vendorname.accountname.semver
+ return "@openzeppelin/contracts.AccountERC7579.v1.0.0";
+ }
+
+ /**
+ * @inheritdoc IERC7579AccountConfig
+ *
+ * @dev Supported call types:
+ * * Single (`0x00`): A single transaction execution.
+ * * Batch (`0x01`): A batch of transactions execution.
+ * * Delegate (`0xff`): A delegate call execution.
+ *
+ * Supported exec types:
+ * * Default (`0x00`): Default execution type (revert on failure).
+ * * Try (`0x01`): Try execution type (emits ERC7579TryExecuteFail on failure).
+ */
+ function supportsExecutionMode(bytes32 encodedMode) public view virtual returns (bool) {
+ (CallType callType, ExecType execType, , ) = Mode.wrap(encodedMode).decodeMode();
+ return
+ (callType == ERC7579Utils.CALLTYPE_SINGLE ||
+ callType == ERC7579Utils.CALLTYPE_BATCH ||
+ callType == ERC7579Utils.CALLTYPE_DELEGATECALL) &&
+ (execType == ERC7579Utils.EXECTYPE_DEFAULT || execType == ERC7579Utils.EXECTYPE_TRY);
+ }
+
+ /**
+ * @inheritdoc IERC7579AccountConfig
+ *
+ * @dev Supported module types:
+ *
+ * * Validator: A module used during the validation phase to determine if a transaction is valid and
+ * should be executed on the account.
+ * * Executor: A module that can execute transactions on behalf of the smart account via a callback.
+ * * Fallback Handler: A module that can extend the fallback functionality of a smart account.
+ */
+ function supportsModule(uint256 moduleTypeId) public view virtual returns (bool) {
+ return
+ moduleTypeId == MODULE_TYPE_VALIDATOR ||
+ moduleTypeId == MODULE_TYPE_EXECUTOR ||
+ moduleTypeId == MODULE_TYPE_FALLBACK;
+ }
+
+ /// @inheritdoc IERC7579ModuleConfig
+ function installModule(
+ uint256 moduleTypeId,
+ address module,
+ bytes calldata initData
+ ) public virtual onlyEntryPointOrSelf {
+ _installModule(moduleTypeId, module, initData);
+ }
+
+ /// @inheritdoc IERC7579ModuleConfig
+ function uninstallModule(
+ uint256 moduleTypeId,
+ address module,
+ bytes calldata deInitData
+ ) public virtual onlyEntryPointOrSelf {
+ _uninstallModule(moduleTypeId, module, deInitData);
+ }
+
+ /// @inheritdoc IERC7579ModuleConfig
+ function isModuleInstalled(
+ uint256 moduleTypeId,
+ address module,
+ bytes calldata additionalContext
+ ) public view virtual returns (bool) {
+ AccountERC7579Storage storage $ = _getAccountERC7579Storage();
+ if (moduleTypeId == MODULE_TYPE_VALIDATOR) return $._validators.contains(module);
+ if (moduleTypeId == MODULE_TYPE_EXECUTOR) return $._executors.contains(module);
+ if (moduleTypeId == MODULE_TYPE_FALLBACK)
+ // ERC-7579 requires this function to return bool, never revert. Check length to avoid out-of-bounds access.
+ return additionalContext.length > 3 && $._fallbacks[bytes4(additionalContext[0:4])] == module;
+ return false;
+ }
+
+ /// @inheritdoc IERC7579Execution
+ function execute(bytes32 mode, bytes calldata executionCalldata) public payable virtual onlyEntryPointOrSelf {
+ _execute(Mode.wrap(mode), executionCalldata);
+ }
+
+ /// @inheritdoc IERC7579Execution
+ function executeFromExecutor(
+ bytes32 mode,
+ bytes calldata executionCalldata
+ )
+ public
+ payable
+ virtual
+ onlyModule(MODULE_TYPE_EXECUTOR, Calldata.emptyBytes())
+ returns (bytes[] memory returnData)
+ {
+ return _execute(Mode.wrap(mode), executionCalldata);
+ }
+
+ /**
+ * @dev Implement ERC-1271 through IERC7579Validator modules. If module based validation fails, fallback to
+ * "native" validation by the abstract signer.
+ *
+ * NOTE: when combined with {ERC7739}, resolution ordering may have an impact ({ERC7739} does not call super).
+ * Manual resolution might be necessary.
+ */
+ function isValidSignature(bytes32 hash, bytes calldata signature) public view virtual returns (bytes4) {
+ // check signature length is enough for extraction
+ if (signature.length >= 20) {
+ (address module, bytes calldata innerSignature) = _extractSignatureValidator(signature);
+ // if module is not installed, skip
+ if (isModuleInstalled(MODULE_TYPE_VALIDATOR, module, Calldata.emptyBytes())) {
+ // try validation, skip any revert
+ try IERC7579Validator(module).isValidSignatureWithSender(msg.sender, hash, innerSignature) returns (
+ bytes4 magic
+ ) {
+ return magic;
+ } catch {}
+ }
+ }
+ return bytes4(0xffffffff);
+ }
+
+ /**
+ * @dev Validates a user operation with {_signableUserOpHash} and returns the validation data
+ * if the module specified by the first 20 bytes of the nonce key is installed. Falls back to
+ * {Account-_validateUserOp} otherwise.
+ *
+ * See {_extractUserOpValidator} for the module extraction logic.
+ */
+ function _validateUserOp(
+ PackedUserOperation calldata userOp,
+ bytes32 userOpHash,
+ bytes calldata signature
+ ) internal virtual override returns (uint256) {
+ address module = _extractUserOpValidator(userOp);
+ return
+ isModuleInstalled(MODULE_TYPE_VALIDATOR, module, Calldata.emptyBytes())
+ ? IERC7579Validator(module).validateUserOp(userOp, _signableUserOpHash(userOp, userOpHash))
+ : super._validateUserOp(userOp, userOpHash, signature);
+ }
+
+ /**
+ * @dev ERC-7579 execution logic. See {supportsExecutionMode} for supported modes.
+ *
+ * Reverts if the call type is not supported.
+ */
+ function _execute(
+ Mode mode,
+ bytes calldata executionCalldata
+ ) internal virtual returns (bytes[] memory returnData) {
+ (CallType callType, ExecType execType, , ) = mode.decodeMode();
+ if (callType == ERC7579Utils.CALLTYPE_SINGLE) return executionCalldata.execSingle(execType);
+ if (callType == ERC7579Utils.CALLTYPE_BATCH) return executionCalldata.execBatch(execType);
+ if (callType == ERC7579Utils.CALLTYPE_DELEGATECALL) return executionCalldata.execDelegateCall(execType);
+ revert ERC7579Utils.ERC7579UnsupportedCallType(callType);
+ }
+
+ /**
+ * @dev Installs a module of the given type with the given initialization data.
+ *
+ * For the fallback module type, the `initData` is expected to be the (packed) concatenation of a 4-byte
+ * selector and the rest of the data to be sent to the handler when calling {IERC7579Module-onInstall}.
+ *
+ * Requirements:
+ *
+ * * Module type must be supported. See {supportsModule}. Reverts with {ERC7579Utils-ERC7579UnsupportedModuleType}.
+ * * Module must be of the given type. Reverts with {ERC7579Utils-ERC7579MismatchedModuleTypeId}.
+ * * Module must not be already installed. Reverts with {ERC7579Utils-ERC7579AlreadyInstalledModule}.
+ *
+ * Emits a {IERC7579ModuleConfig-ModuleInstalled} event.
+ */
+ function _installModule(uint256 moduleTypeId, address module, bytes memory initData) internal virtual {
+ AccountERC7579Storage storage $ = _getAccountERC7579Storage();
+ require(supportsModule(moduleTypeId), ERC7579Utils.ERC7579UnsupportedModuleType(moduleTypeId));
+ require(
+ IERC7579Module(module).isModuleType(moduleTypeId),
+ ERC7579Utils.ERC7579MismatchedModuleTypeId(moduleTypeId, module)
+ );
+
+ if (moduleTypeId == MODULE_TYPE_VALIDATOR) {
+ require($._validators.add(module), ERC7579Utils.ERC7579AlreadyInstalledModule(moduleTypeId, module));
+ } else if (moduleTypeId == MODULE_TYPE_EXECUTOR) {
+ require($._executors.add(module), ERC7579Utils.ERC7579AlreadyInstalledModule(moduleTypeId, module));
+ } else if (moduleTypeId == MODULE_TYPE_FALLBACK) {
+ bytes4 selector;
+ (selector, initData) = _decodeFallbackData(initData);
+ require(
+ $._fallbacks[selector] == address(0),
+ ERC7579Utils.ERC7579AlreadyInstalledModule(moduleTypeId, module)
+ );
+ $._fallbacks[selector] = module;
+ }
+
+ IERC7579Module(module).onInstall(initData);
+ emit ModuleInstalled(moduleTypeId, module);
+ }
+
+ /**
+ * @dev Uninstalls a module of the given type with the given de-initialization data.
+ *
+ * For the fallback module type, the `deInitData` is expected to be the (packed) concatenation of a 4-byte
+ * selector and the rest of the data to be sent to the handler when calling {IERC7579Module-onUninstall}.
+ *
+ * Requirements:
+ *
+ * * Module must be already installed. Reverts with {ERC7579Utils-ERC7579UninstalledModule} otherwise.
+ */
+ function _uninstallModule(uint256 moduleTypeId, address module, bytes memory deInitData) internal virtual {
+ AccountERC7579Storage storage $ = _getAccountERC7579Storage();
+ require(supportsModule(moduleTypeId), ERC7579Utils.ERC7579UnsupportedModuleType(moduleTypeId));
+
+ if (moduleTypeId == MODULE_TYPE_VALIDATOR) {
+ require($._validators.remove(module), ERC7579Utils.ERC7579UninstalledModule(moduleTypeId, module));
+ } else if (moduleTypeId == MODULE_TYPE_EXECUTOR) {
+ require($._executors.remove(module), ERC7579Utils.ERC7579UninstalledModule(moduleTypeId, module));
+ } else if (moduleTypeId == MODULE_TYPE_FALLBACK) {
+ bytes4 selector;
+ (selector, deInitData) = _decodeFallbackData(deInitData);
+ require(
+ _fallbackHandler(selector) == module && module != address(0),
+ ERC7579Utils.ERC7579UninstalledModule(moduleTypeId, module)
+ );
+ delete $._fallbacks[selector];
+ }
+
+ // Ignores success purposely to avoid modules that revert on uninstall
+ LowLevelCall.callNoReturn(module, abi.encodeCall(IERC7579Module.onUninstall, (deInitData)));
+ emit ModuleUninstalled(moduleTypeId, module);
+ }
+
+ /**
+ * @dev Fallback function that delegates the call to the installed handler for the given selector.
+ *
+ * Reverts with {ERC7579MissingFallbackHandler} if the handler is not installed.
+ *
+ * Calls the handler with the original `msg.sender` appended at the end of the calldata following
+ * the ERC-2771 format.
+ */
+ function _fallback() internal virtual returns (bytes memory) {
+ address handler = _fallbackHandler(msg.sig);
+ require(handler != address(0), ERC7579MissingFallbackHandler(msg.sig));
+
+ // From https://eips.ethereum.org/EIPS/eip-7579#fallback[ERC-7579 specifications]:
+ // - MUST utilize ERC-2771 to add the original msg.sender to the calldata sent to the fallback handler
+ // - MUST use call to invoke the fallback handler
+ if (LowLevelCall.callNoReturn(handler, msg.value, abi.encodePacked(msg.data, msg.sender))) {
+ return LowLevelCall.returnData();
+ } else {
+ LowLevelCall.bubbleRevert();
+ }
+ }
+
+ /// @dev Returns the fallback handler for the given selector. Returns `address(0)` if not installed.
+ function _fallbackHandler(bytes4 selector) internal view virtual returns (address) {
+ AccountERC7579Storage storage $ = _getAccountERC7579Storage();
+ return $._fallbacks[selector];
+ }
+
+ /// @dev Checks if the module is installed. Reverts if the module is not installed.
+ function _checkModule(
+ uint256 moduleTypeId,
+ address module,
+ bytes calldata additionalContext
+ ) internal view virtual {
+ require(
+ isModuleInstalled(moduleTypeId, module, additionalContext),
+ ERC7579Utils.ERC7579UninstalledModule(moduleTypeId, module)
+ );
+ }
+
+ /**
+ * @dev Extracts the nonce validator from the user operation.
+ *
+ * To construct a nonce key, set nonce as follows:
+ *
+ * ```
+ * | |
+ * ```
+ * NOTE: The default behavior of this function replicates the behavior of
+ * https://github.com/rhinestonewtf/safe7579/blob/bb29e8b1a66658790c4169e72608e27d220f79be/src/Safe7579.sol#L266[Safe adapter],
+ * https://github.com/etherspot/etherspot-prime-contracts/blob/cfcdb48c4172cea0d66038324c0bae3288aa8caa/src/modular-etherspot-wallet/wallet/ModularEtherspotWallet.sol#L227[Etherspot's Prime Account], and
+ * https://github.com/erc7579/erc7579-implementation/blob/16138d1afd4e9711f6c1425133538837bd7787b5/src/MSAAdvanced.sol#L247[ERC7579 reference implementation].
+ *
+ * This is not standardized in ERC-7579 (or in any follow-up ERC). Some accounts may want to override these internal functions.
+ *
+ * For example, https://github.com/bcnmy/nexus/blob/54f4e19baaff96081a8843672977caf712ef19f4/contracts/lib/NonceLib.sol#L17[Biconomy's Nexus]
+ * uses a similar yet incompatible approach (the validator address is also part of the nonce, but not at the same location)
+ */
+ function _extractUserOpValidator(PackedUserOperation calldata userOp) internal pure virtual returns (address) {
+ return address(bytes32(userOp.nonce).extract_32_20(0));
+ }
+
+ /**
+ * @dev Extracts the signature validator from the signature.
+ *
+ * To construct a signature, set the first 20 bytes as the module address and the remaining bytes as the
+ * signature data:
+ *
+ * ```
+ * |
+ * ```
+ *
+ * NOTE: The default behavior of this function replicates the behavior of
+ * https://github.com/rhinestonewtf/safe7579/blob/bb29e8b1a66658790c4169e72608e27d220f79be/src/Safe7579.sol#L350[Safe adapter],
+ * https://github.com/bcnmy/nexus/blob/54f4e19baaff96081a8843672977caf712ef19f4/contracts/Nexus.sol#L239[Biconomy's Nexus],
+ * https://github.com/etherspot/etherspot-prime-contracts/blob/cfcdb48c4172cea0d66038324c0bae3288aa8caa/src/modular-etherspot-wallet/wallet/ModularEtherspotWallet.sol#L252[Etherspot's Prime Account], and
+ * https://github.com/erc7579/erc7579-implementation/blob/16138d1afd4e9711f6c1425133538837bd7787b5/src/MSAAdvanced.sol#L296[ERC7579 reference implementation].
+ *
+ * This is not standardized in ERC-7579 (or in any follow-up ERC). Some accounts may want to override these internal functions.
+ *
+ * NOTE: This function expects the signature to be at least 20 bytes long. Panics with {Panic-ARRAY_OUT_OF_BOUNDS} (0x32) otherwise.
+ */
+ function _extractSignatureValidator(
+ bytes calldata signature
+ ) internal pure virtual returns (address module, bytes calldata innerSignature) {
+ return (address(bytes20(signature)), signature[20:]);
+ }
+
+ /**
+ * @dev Extract the function selector from initData/deInitData for MODULE_TYPE_FALLBACK
+ *
+ * NOTE: If we had calldata here, we could use calldata slice which are cheaper to manipulate and don't require
+ * actual copy. However, this would require `_installModule` to get a calldata bytes object instead of a memory
+ * bytes object. This would prevent calling `_installModule` from a contract constructor and would force the use
+ * of external initializers. That may change in the future, as most accounts will probably be deployed as
+ * clones/proxy/EIP-7702 delegates and therefore rely on initializers anyway.
+ */
+ function _decodeFallbackData(
+ bytes memory data
+ ) internal pure virtual returns (bytes4 selector, bytes memory remaining) {
+ require(data.length > 3, ERC7579CannotDecodeFallbackData());
+ return (bytes4(data), data.slice(4));
+ }
+
+ /// @dev By default, only use the modules for validation of userOp and signature. Disable raw signatures.
+ function _rawSignatureValidation(
+ bytes32 /*hash*/,
+ bytes calldata /*signature*/
+ ) internal view virtual override returns (bool) {
+ return false;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlDefaultAdminRulesUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlDefaultAdminRulesUpgradeable.json
new file mode 100644
index 0000000..6b588bc
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlDefaultAdminRulesUpgradeable.json
@@ -0,0 +1,487 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "AccessControlDefaultAdminRulesUpgradeable",
+ "sourceName": "contracts/access/extensions/AccessControlDefaultAdminRulesUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "AccessControlBadConfirmation",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint48",
+ "name": "schedule",
+ "type": "uint48"
+ }
+ ],
+ "name": "AccessControlEnforcedDefaultAdminDelay",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AccessControlEnforcedDefaultAdminRules",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "defaultAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AccessControlInvalidDefaultAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "neededRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessControlUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "DefaultAdminDelayChangeCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "newDelay",
+ "type": "uint48"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "effectSchedule",
+ "type": "uint48"
+ }
+ ],
+ "name": "DefaultAdminDelayChangeScheduled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "DefaultAdminTransferCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "acceptSchedule",
+ "type": "uint48"
+ }
+ ],
+ "name": "DefaultAdminTransferScheduled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "previousAdminRole",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "newAdminRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RoleAdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleGranted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleRevoked",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "DEFAULT_ADMIN_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "acceptDefaultAdminTransfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "beginDefaultAdminTransfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "cancelDefaultAdminTransfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint48",
+ "name": "newDelay",
+ "type": "uint48"
+ }
+ ],
+ "name": "changeDefaultAdminDelay",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "defaultAdmin",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "defaultAdminDelay",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "defaultAdminDelayIncreaseWait",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getRoleAdmin",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "grantRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasRole",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "pendingDefaultAdmin",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ },
+ {
+ "internalType": "uint48",
+ "name": "schedule",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "pendingDefaultAdminDelay",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "newDelay",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "schedule",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "renounceRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "revokeRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "rollbackDefaultAdminDelay",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlEnumerableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlEnumerableUpgradeable.json
new file mode 100644
index 0000000..3931cbb
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlEnumerableUpgradeable.json
@@ -0,0 +1,321 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "AccessControlEnumerableUpgradeable",
+ "sourceName": "contracts/access/extensions/AccessControlEnumerableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "AccessControlBadConfirmation",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "neededRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessControlUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "previousAdminRole",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "newAdminRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RoleAdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleGranted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleRevoked",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "DEFAULT_ADMIN_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getRoleAdmin",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "getRoleMember",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getRoleMemberCount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getRoleMembers",
+ "outputs": [
+ {
+ "internalType": "address[]",
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "grantRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasRole",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "callerConfirmation",
+ "type": "address"
+ }
+ ],
+ "name": "renounceRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "revokeRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlUpgradeable.json
new file mode 100644
index 0000000..4c7cffd
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessControlUpgradeable.json
@@ -0,0 +1,259 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "AccessControlUpgradeable",
+ "sourceName": "contracts/access/AccessControlUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "AccessControlBadConfirmation",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "neededRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessControlUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "previousAdminRole",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "newAdminRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RoleAdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleGranted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleRevoked",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "DEFAULT_ADMIN_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getRoleAdmin",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "grantRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasRole",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "callerConfirmation",
+ "type": "address"
+ }
+ ],
+ "name": "renounceRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "revokeRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessManagedUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessManagedUpgradeable.json
new file mode 100644
index 0000000..a12cdc3
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessManagedUpgradeable.json
@@ -0,0 +1,124 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "AccessManagedUpgradeable",
+ "sourceName": "contracts/access/manager/AccessManagedUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "authority",
+ "type": "address"
+ }
+ ],
+ "name": "AccessManagedInvalidAuthority",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "delay",
+ "type": "uint32"
+ }
+ ],
+ "name": "AccessManagedRequiredDelay",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AccessManagedUnauthorized",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "authority",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorityUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "authority",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "isConsumingScheduledOp",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newAuthority",
+ "type": "address"
+ }
+ ],
+ "name": "setAuthority",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessManagerUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessManagerUpgradeable.json
new file mode 100644
index 0000000..0331cbc
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccessManagerUpgradeable.json
@@ -0,0 +1,1200 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "AccessManagerUpgradeable",
+ "sourceName": "contracts/access/manager/AccessManagerUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessManagerAlreadyScheduled",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AccessManagerBadConfirmation",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessManagerExpired",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "initialAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AccessManagerInvalidInitialAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ }
+ ],
+ "name": "AccessManagerLockedRole",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessManagerNotReady",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessManagerNotScheduled",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "msgsender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ }
+ ],
+ "name": "AccessManagerUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ }
+ ],
+ "name": "AccessManagerUnauthorizedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "msgsender",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ }
+ ],
+ "name": "AccessManagerUnauthorizedCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AccessManagerUnauthorizedConsume",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "nonce",
+ "type": "uint32"
+ }
+ ],
+ "name": "OperationCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "nonce",
+ "type": "uint32"
+ }
+ ],
+ "name": "OperationExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "nonce",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "schedule",
+ "type": "uint48"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "OperationScheduled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "admin",
+ "type": "uint64"
+ }
+ ],
+ "name": "RoleAdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "delay",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "since",
+ "type": "uint48"
+ }
+ ],
+ "name": "RoleGrantDelayChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "delay",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "since",
+ "type": "uint48"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "newMember",
+ "type": "bool"
+ }
+ ],
+ "name": "RoleGranted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "guardian",
+ "type": "uint64"
+ }
+ ],
+ "name": "RoleGuardianChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "label",
+ "type": "string"
+ }
+ ],
+ "name": "RoleLabel",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "RoleRevoked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "delay",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "since",
+ "type": "uint48"
+ }
+ ],
+ "name": "TargetAdminDelayUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "closed",
+ "type": "bool"
+ }
+ ],
+ "name": "TargetClosed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ }
+ ],
+ "name": "TargetFunctionRoleUpdated",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "ADMIN_ROLE",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "PUBLIC_ROLE",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ }
+ ],
+ "name": "canCall",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "immediate",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint32",
+ "name": "delay",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "consumeScheduledOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "expiration",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getAccess",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "since",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint32",
+ "name": "currentDelay",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint32",
+ "name": "pendingDelay",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "effect",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ }
+ ],
+ "name": "getRoleAdmin",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ }
+ ],
+ "name": "getRoleGrantDelay",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ }
+ ],
+ "name": "getRoleGuardian",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getSchedule",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "getTargetAdminDelay",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ }
+ ],
+ "name": "getTargetFunctionRole",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "executionDelay",
+ "type": "uint32"
+ }
+ ],
+ "name": "grantRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasRole",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "isMember",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint32",
+ "name": "executionDelay",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "hashOperation",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "initialAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "isTargetClosed",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "string",
+ "name": "label",
+ "type": "string"
+ }
+ ],
+ "name": "labelRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "minSetback",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes[]",
+ "name": "data",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "multicall",
+ "outputs": [
+ {
+ "internalType": "bytes[]",
+ "name": "results",
+ "type": "bytes[]"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "callerConfirmation",
+ "type": "address"
+ }
+ ],
+ "name": "renounceRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "revokeRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint48",
+ "name": "when",
+ "type": "uint48"
+ }
+ ],
+ "name": "schedule",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint32",
+ "name": "nonce",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint32",
+ "name": "newDelay",
+ "type": "uint32"
+ }
+ ],
+ "name": "setGrantDelay",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "admin",
+ "type": "uint64"
+ }
+ ],
+ "name": "setRoleAdmin",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "guardian",
+ "type": "uint64"
+ }
+ ],
+ "name": "setRoleGuardian",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "newDelay",
+ "type": "uint32"
+ }
+ ],
+ "name": "setTargetAdminDelay",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "closed",
+ "type": "bool"
+ }
+ ],
+ "name": "setTargetClosed",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes4[]",
+ "name": "selectors",
+ "type": "bytes4[]"
+ },
+ {
+ "internalType": "uint64",
+ "name": "roleId",
+ "type": "uint64"
+ }
+ ],
+ "name": "setTargetFunctionRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "newAuthority",
+ "type": "address"
+ }
+ ],
+ "name": "updateAuthority",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50612b678061001c5f395ff3fe6080604052600436106101e6575f3560e01c80636d5115bd11610108578063b70096131161009d578063d1f856ee1161006d578063d1f856ee146105e9578063d22b598914610608578063d6bb62c614610627578063f801a69814610646578063fe0776f51461067f575f5ffd5b8063b70096131461055b578063b7d2b16214610596578063c4d66de8146105b5578063cc1b6c81146105d4575f5ffd5b8063a166aa89116100d8578063a166aa89146104b4578063a64d95ce146104e3578063abd9bd2a14610502578063ac9650d81461052f575f5ffd5b80636d5115bd1461044457806375b238fc14610463578063853551b81461047657806394c7d7ee14610495575f5ffd5b806330cae1871161017e5780634665096d1161014e5780634665096d146103d25780634c1da1e2146103e75780635296295214610406578063530dd45614610425575f5ffd5b806330cae187146103445780633adc277a146103635780633ca7c02a146103995780634136a33c146103b3575f5ffd5b806318ff183c116101b957806318ff183c1461029a5780631cff79cd146102b957806325c471a0146102cc5780633078f114146102eb575f5ffd5b806308d6122d146101ea5780630b0a93ba1461020b57806312be872714610247578063167bd3951461027b575b5f5ffd5b3480156101f5575f5ffd5b50610209610204366004612455565b61069e565b005b348015610216575f5ffd5b5061022a6102253660046124b7565b6106f0565b6040516001600160401b0390911681526020015b60405180910390f35b348015610252575f5ffd5b506102666102613660046124b7565b610727565b60405163ffffffff909116815260200161023e565b348015610286575f5ffd5b506102096102953660046124d0565b610771565b3480156102a5575f5ffd5b506102096102b436600461250b565b610787565b6102666102c7366004612574565b6107e9565b3480156102d7575f5ffd5b506102096102e63660046125d7565b61092a565b3480156102f6575f5ffd5b5061030a610305366004612619565b61094c565b60405161023e949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561034f575f5ffd5b5061020961035e366004612633565b6109bf565b34801561036e575f5ffd5b5061038261037d366004612664565b6109d1565b60405165ffffffffffff909116815260200161023e565b3480156103a4575f5ffd5b5061022a6001600160401b0381565b3480156103be575f5ffd5b506102666103cd366004612664565b610a13565b3480156103dd575f5ffd5b5062093a80610266565b3480156103f2575f5ffd5b5061026661040136600461267b565b610a3e565b348015610411575f5ffd5b50610209610420366004612633565b610a78565b348015610430575f5ffd5b5061022a61043f3660046124b7565b610a8a565b34801561044f575f5ffd5b5061022a61045e3660046126ab565b610aba565b34801561046e575f5ffd5b5061022a5f81565b348015610481575f5ffd5b506102096104903660046126d7565b610b01565b3480156104a0575f5ffd5b506102096104af366004612574565b610b98565b3480156104bf575f5ffd5b506104d36104ce36600461267b565b610c42565b604051901515815260200161023e565b3480156104ee575f5ffd5b506102096104fd3660046126f2565b610c79565b34801561050d575f5ffd5b5061052161051c36600461271a565b610c8b565b60405190815260200161023e565b34801561053a575f5ffd5b5061054e61054936600461277a565b610cc3565b60405161023e91906127b8565b348015610566575f5ffd5b5061057a61057536600461283c565b610da8565b60408051921515835263ffffffff90911660208301520161023e565b3480156105a1575f5ffd5b506102096105b0366004612619565b610e29565b3480156105c0575f5ffd5b506102096105cf36600461267b565b610e40565b3480156105df575f5ffd5b5062069780610266565b3480156105f4575f5ffd5b5061057a610603366004612619565b610f36565b348015610613575f5ffd5b50610209610622366004612884565b610faf565b348015610632575f5ffd5b5061026661064136600461271a565b610fc1565b348015610651575f5ffd5b506106656106603660046128a0565b611124565b6040805192835263ffffffff90911660208301520161023e565b34801561068a575f5ffd5b50610209610699366004612619565b6112c0565b6106a66112e9565b5f5b828110156106e9576106e1858585848181106106c6576106c661290d565b90506020020160208101906106db9190612921565b84611360565b6001016106a8565b5050505050565b5f5f6106fa6113ec565b6001600160401b039384165f9081526001918201602052604090200154600160401b900490921692915050565b5f5f6107316113ec565b6001600160401b0384165f90815260018281016020526040909120015490915061076a90600160801b90046001600160701b0316611410565b9392505050565b6107796112e9565b610783828261142e565b5050565b61078f6112e9565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b906024015f604051808303815f87803b1580156107cf575f5ffd5b505af11580156107e1573d5f5f3e3d5ffd5b505050505050565b5f5f6107f36113ec565b9050335f80610804838989896114a0565b915091508115801561081a575063ffffffff8116155b1561086d57828861082b89896114f1565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b5f61087a848a8a8a610c8b565b90505f63ffffffff83161515806108a05750610895826109d1565b65ffffffffffff1615155b156108b1576108ae82611508565b90505b60038601546108c98b6108c48c8c6114f1565b611619565b87600301819055506109128b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525034925061163e915050565b50600390960195909555509293505050509392505050565b6109326112e9565b610946838361094086610727565b8461170a565b50505050565b5f5f5f5f5f6109596113ec565b6001600160401b0388165f90815260018201602090815260408083206001600160a01b038b1684529091529020805465ffffffffffff81169750919250906109b090600160301b90046001600160701b0316611964565b979a9199509750945050505050565b6109c76112e9565b6107838282611985565b5f5f6109db6113ec565b5f84815260028201602052604090205490915065ffffffffffff166109ff81611a35565b610a095780610a0b565b5f5b949350505050565b5f5f610a1d6113ec565b5f93845260020160205250506040902054600160301b900463ffffffff1690565b5f5f610a486113ec565b6001600160a01b0384165f9081526020829052604090206001015490915061076a906001600160701b0316611410565b610a806112e9565b6107838282611a63565b5f5f610a946113ec565b6001600160401b039384165f908152600191820160205260409020015490921692915050565b5f5f610ac46113ec565b6001600160a01b0385165f908152602091825260408082206001600160e01b03198716835290925220546001600160401b03169150505b92915050565b610b096112e9565b6001600160401b0383161580610b2757506001600160401b03838116145b15610b505760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610b8b929190612964565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610bd7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfb9190612977565b6001600160e01b03191614610c2e57604051630641fee960e31b81526001600160a01b0382166004820152602401610864565b6106e9610c3d85838686610c8b565b611508565b5f5f610c4c6113ec565b6001600160a01b039093165f9081526020939093525050604090206001015460ff600160701b9091041690565b610c816112e9565b6107838282611b21565b5f84848484604051602001610ca39493929190612992565b604051602081830303815290604052805190602001209050949350505050565b604080515f815260208101909152606090826001600160401b03811115610cec57610cec612a03565b604051908082528060200260200182016040528015610d1f57816020015b6060815260200190600190039081610d0a5790505b5091505f5b83811015610da057610d7b30868684818110610d4257610d4261290d565b9050602002810190610d549190612a17565b85604051602001610d6793929190612a59565b604051602081830303815290604052611c4b565b838281518110610d8d57610d8d61290d565b6020908102919091010152600101610d24565b505092915050565b5f5f610db384610c42565b15610dc257505f905080610e21565b306001600160a01b03861603610de657610ddc8484611ccd565b5f91509150610e21565b5f610df18585610aba565b90505f5f610dff8389610f36565b9150915081610e0f575f5f610e19565b63ffffffff811615815b945094505050505b935093915050565b610e316112e9565b610e3b8282611cf1565b505050565b5f610e49611dec565b805490915060ff600160401b82041615906001600160401b03165f81158015610e6f5750825b90505f826001600160401b03166001148015610e8a5750303b155b905081158015610e98575080155b15610eb65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ee057845460ff60401b1916600160401b1785555b610ee986611e14565b83156107e157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b5f8067fffffffffffffffe196001600160401b03851601610f5c5750600190505f610fa8565b5f5f610f68868661094c565b5050915091508165ffffffffffff165f14158015610f9d5750610f89611e28565b65ffffffffffff168265ffffffffffff1611155b93509150610fa89050565b9250929050565b610fb76112e9565b6107838282611e37565b5f5f610fcb6113ec565b9050335f610fd986866114f1565b90505f610fe889898989610c8b565b5f81815260028601602052604081205491925065ffffffffffff90911690036110275760405163060a299b60e41b815260048101829052602401610864565b826001600160a01b0316896001600160a01b0316146110c0575f61104b5f85610f36565b5090505f61106561105f6102258c87610aba565b86610f36565b50905081158015611074575080155b156110bd57604051630ff89d4760e21b81526001600160a01b038087166004830152808d1660248301528b1660448201526001600160e01b031985166064820152608401610864565b50505b5f818152600285016020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a39998505050505050505050565b5f5f5f61112f6113ec565b9050335f61113f828a8a8a6114a0565b9150505f8163ffffffff16611152611e28565b61115c9190612a7c565b905063ffffffff8216158061119257505f8765ffffffffffff1611801561119257508065ffffffffffff168765ffffffffffff16105b156111a357828a61082b8b8b6114f1565b6111bd8765ffffffffffff168265ffffffffffff16611eff565b96506111cb838b8b8b610c8b565b95506111d686611f0e565b836002015f8781526020019081526020015f205f0160069054906101000a900463ffffffff16600101945086846002015f8881526020019081526020015f205f015f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555084846002015f8881526020019081526020015f205f0160066101000a81548163ffffffff021916908363ffffffff1602179055508463ffffffff16867f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b489868e8e8e6040516112ab959493929190612a9a565b60405180910390a35050505094509492505050565b6001600160a01b0381163314610e3157604051635f159e6360e01b815260040160405180910390fd5b335f806112f7838236611f68565b9150915081610e3b578063ffffffff165f03611351575f611318813661202b565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b03821660248201529092506044019050610864565b610946610c3d84305f36610c8b565b5f6113696113ec565b6001600160a01b0385165f818152602083815260408083206001600160e01b0319891680855290835292819020805467ffffffffffffffff19166001600160401b03891690811790915590519283529394507f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a350505050565b7f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0090565b5f5f611424836001600160701b0316611964565b5090949350505050565b5f6114376113ec565b6001600160a01b0384165f81815260208390526040908190206001018054861515600160701b0260ff60701b1990911617905551919250907f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb13890610b8b90851515815260200190565b5f80306001600160a01b038616036114c6576114bd868585611f68565b915091506114e8565b600483106114e2576114dd868661057587876114f1565b6114bd565b505f9050805b94509492505050565b5f6114ff60048284866129dc565b61076a91612adf565b5f5f6115126113ec565b5f84815260028201602052604081205491925065ffffffffffff821691600160301b900463ffffffff16908290036115605760405163060a299b60e41b815260048101869052602401610864565b611568611e28565b65ffffffffffff168265ffffffffffff16111561159b57604051630c65b5bd60e11b815260048101869052602401610864565b6115a482611a35565b156115c557604051631e2975b960e21b815260048101869052602401610864565b5f858152600284016020526040808220805465ffffffffffff191690555163ffffffff83169187917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a3949350505050565b6001600160a01b0382165f9081526001600160e01b031982166020526040812061076a565b60608147101561166a5760405163cf47918160e01b815247600482015260248101839052604401610864565b5f6116768584866121f5565b905080801561169757505f3d118061169757505f856001600160a01b03163b115b156116ac576116a461220a565b91505061076a565b80156116d657604051639996b31560e01b81526001600160a01b0386166004820152602401610864565b3d156116e9576116e4612223565b611702565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b5f5f6117146113ec565b905067fffffffffffffffe196001600160401b038716016117535760405163061c6a4360e21b81526001600160401b0387166004820152602401610864565b6001600160401b0386165f90815260018201602090815260408083206001600160a01b038916845290915281205465ffffffffffff1615908115611847578563ffffffff166117a0611e28565b6117aa9190612a7c565b905060405180604001604052808265ffffffffffff1681526020016117d88763ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b038a165f90815260018601602090815260408083206001600160a01b038d1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff909116179190911790556118f5565b6001600160401b0388165f90815260018401602090815260408083206001600160a01b038b16845290915281205461189291600160301b9091046001600160701b031690879061222e565b6001600160401b038a165f90815260018601602090815260408083206001600160a01b038d168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8716815265ffffffffffff831660208201528315158183015290516001600160a01b038916916001600160401b038b16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a3509695505050505050565b5f5f5f61197884611973611e28565b6122d4565b9250925092509193909250565b5f61198e6113ec565b90506001600160401b03831615806119ae57506001600160401b03838116145b156119d75760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b038381165f81815260018481016020526040808320909101805467ffffffffffffffff19169487169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a3505050565b5f611a3e611e28565b65ffffffffffff16611a5362093a8084612a7c565b65ffffffffffff16111592915050565b5f611a6c6113ec565b90506001600160401b0383161580611a8c57506001600160401b03838116145b15611ab55760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b038381165f8181526001848101602052604080832090910180546fffffffffffffffff00000000000000001916600160401b958816958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a3505050565b5f611b2a6113ec565b905067fffffffffffffffe196001600160401b03841601611b695760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b0383165f9081526001828101602052604082200154611ba390600160801b90046001600160701b0316846206978061222e565b6001600160401b0386165f81815260018087016020526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890611c3d908690859063ffffffff92909216825265ffffffffffff16602082015260400190565b60405180910390a250505050565b60605f611c588484612320565b9050808015611c7957505f3d1180611c7957505f846001600160a01b03163b115b15611c8e57611c8661220a565b915050610afb565b8015611cb857604051639996b31560e01b81526001600160a01b0385166004820152602401610864565b3d156116e957611cc6612223565b5092915050565b5f5f611cd76113ec565b9050611ce38484611619565b600390910154149392505050565b5f5f611cfb6113ec565b905067fffffffffffffffe196001600160401b03851601611d3a5760405163061c6a4360e21b81526001600160401b0385166004820152602401610864565b6001600160401b0384165f90815260018201602090815260408083206001600160a01b038716845290915281205465ffffffffffff169003611d7f575f915050610afb565b6001600160401b0384165f81815260018301602090815260408083206001600160a01b038816808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a35060019392505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610afb565b611e1c612333565b611e258161235a565b50565b5f611e3242612397565b905090565b5f611e406113ec565b90505f611e7683620697806001600160a01b0387165f908152602086905260409020600101546001600160701b0316919061222e565b6001600160a01b0386165f818152602086815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8816815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101611c3d565b5f82821882841102821861076a565b5f611f176113ec565b5f83815260028201602052604090205490915065ffffffffffff168015801590611f475750611f4581611a35565b155b15610e3b5760405163813e945960e01b815260048101849052602401610864565b5f806004831015611f7d57505f905080610e21565b306001600160a01b03861603611fa057610ddc30611f9b86866114f1565b611ccd565b5f5f5f611fad878761202b565b92509250925082158015611fc55750611fc530610c42565b15611fd8575f5f94509450505050610e21565b5f5f611fe4848b610f36565b9150915081611ffd575f5f965096505050505050610e21565b6120138363ffffffff168263ffffffff16611eff565b63ffffffff8116159b909a5098505050505050505050565b5f8080600484101561204457505f9150819050806121ee565b5f61204f86866114f1565b90506001600160e01b031981166310a6aa3760e31b148061208057506001600160e01b031981166330cae18760e01b145b8061209b57506001600160e01b0319811663294b14a960e11b145b806120b657506001600160e01b03198116635326cae760e11b145b806120d157506001600160e01b0319811663d22b598960e01b145b156120e65760015f5f935093509350506121ee565b6001600160e01b0319811663063fc60f60e21b148061211557506001600160e01b0319811663167bd39560e01b145b8061213057506001600160e01b031981166308d6122d60e01b145b1561216f575f61214460246004888a6129dc565b810190612151919061267b565b90505f61215d82610a3e565b600196505f955093506121ee92505050565b6001600160e01b0319811663012e238d60e51b148061219e57506001600160e01b03198116635be958b160e11b145b156121da575f6121b260246004888a6129dc565b8101906121bf91906124b7565b905060016121cc82610a8a565b5f94509450945050506121ee565b5f6121e53083610aba565b5f935093509350505b9250925092565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f612243866001600160701b0316611410565b90505f61227e8563ffffffff168763ffffffff168463ffffffff1611612269575f612273565b6122738885612b15565b63ffffffff16611eff565b90508063ffffffff1661228f611e28565b6122999190612a7c565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561230f57828282612313565b815f5f5b9250925092509250925092565b5f5f5f835160208501865af49392505050565b61233b6123cd565b61235857604051631afcd79f60e31b815260040160405180910390fd5b565b612362612333565b6001600160a01b03811661238b57604051630409d6d160e11b81525f6004820152602401610864565b6107835f825f5f61170a565b5f65ffffffffffff8211156123c9576040516306dfcc6560e41b81526030600482015260248101839052604401610864565b5090565b5f6123d6611dec565b54600160401b900460ff16919050565b6001600160a01b0381168114611e25575f5ffd5b5f5f83601f84011261240a575f5ffd5b5081356001600160401b03811115612420575f5ffd5b6020830191508360208260051b8501011115610fa8575f5ffd5b80356001600160401b0381168114612450575f5ffd5b919050565b5f5f5f5f60608587031215612468575f5ffd5b8435612473816123e6565b935060208501356001600160401b0381111561248d575f5ffd5b612499878288016123fa565b90945092506124ac90506040860161243a565b905092959194509250565b5f602082840312156124c7575f5ffd5b61076a8261243a565b5f5f604083850312156124e1575f5ffd5b82356124ec816123e6565b915060208301358015158114612500575f5ffd5b809150509250929050565b5f5f6040838503121561251c575f5ffd5b8235612527816123e6565b91506020830135612500816123e6565b5f5f83601f840112612547575f5ffd5b5081356001600160401b0381111561255d575f5ffd5b602083019150836020828501011115610fa8575f5ffd5b5f5f5f60408486031215612586575f5ffd5b8335612591816123e6565b925060208401356001600160401b038111156125ab575f5ffd5b6125b786828701612537565b9497909650939450505050565b803563ffffffff81168114612450575f5ffd5b5f5f5f606084860312156125e9575f5ffd5b6125f28461243a565b92506020840135612602816123e6565b9150612610604085016125c4565b90509250925092565b5f5f6040838503121561262a575f5ffd5b6125278361243a565b5f5f60408385031215612644575f5ffd5b61264d8361243a565b915061265b6020840161243a565b90509250929050565b5f60208284031215612674575f5ffd5b5035919050565b5f6020828403121561268b575f5ffd5b813561076a816123e6565b6001600160e01b031981168114611e25575f5ffd5b5f5f604083850312156126bc575f5ffd5b82356126c7816123e6565b9150602083013561250081612696565b5f5f5f604084860312156126e9575f5ffd5b6125918461243a565b5f5f60408385031215612703575f5ffd5b61270c8361243a565b915061265b602084016125c4565b5f5f5f5f6060858703121561272d575f5ffd5b8435612738816123e6565b93506020850135612748816123e6565b925060408501356001600160401b03811115612762575f5ffd5b61276e87828801612537565b95989497509550505050565b5f5f6020838503121561278b575f5ffd5b82356001600160401b038111156127a0575f5ffd5b6127ac858286016123fa565b90969095509350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561283057603f19878603018452815180518087528060208301602089015e5f602082890101526020601f19601f830116880101965050506020820191506020840193506001810190506127de565b50929695505050505050565b5f5f5f6060848603121561284e575f5ffd5b8335612859816123e6565b92506020840135612869816123e6565b9150604084013561287981612696565b809150509250925092565b5f5f60408385031215612895575f5ffd5b823561270c816123e6565b5f5f5f5f606085870312156128b3575f5ffd5b84356128be816123e6565b935060208501356001600160401b038111156128d8575f5ffd5b6128e487828801612537565b909450925050604085013565ffffffffffff81168114612902575f5ffd5b939692955090935050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612931575f5ffd5b813561076a81612696565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610a0b60208301848661293c565b5f60208284031215612987575f5ffd5b815161076a81612696565b6001600160a01b038581168252841660208201526060604082018190525f906129be908301848661293c565b9695505050505050565b634e487b7160e01b5f52601160045260245ffd5b5f5f858511156129ea575f5ffd5b838611156129f6575f5ffd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f5f8335601e19843603018112612a2c575f5ffd5b8301803591506001600160401b03821115612a45575f5ffd5b602001915036819003821315610fa8575f5ffd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b65ffffffffffff8181168382160190811115610afb57610afb6129c8565b65ffffffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90612ad4908301848661293c565b979650505050505050565b80356001600160e01b03198116906004841015611cc6576001600160e01b031960049490940360031b84901b1690921692915050565b63ffffffff8281168282160390811115610afb57610afb6129c856fea2646970667358221220fde1ebeea8ce6b578e82debb1ffb00e13086a10f0cf61739f7931b7e4d52c92864736f6c634300081f0033",
+ "deployedBytecode": "0x6080604052600436106101e6575f3560e01c80636d5115bd11610108578063b70096131161009d578063d1f856ee1161006d578063d1f856ee146105e9578063d22b598914610608578063d6bb62c614610627578063f801a69814610646578063fe0776f51461067f575f5ffd5b8063b70096131461055b578063b7d2b16214610596578063c4d66de8146105b5578063cc1b6c81146105d4575f5ffd5b8063a166aa89116100d8578063a166aa89146104b4578063a64d95ce146104e3578063abd9bd2a14610502578063ac9650d81461052f575f5ffd5b80636d5115bd1461044457806375b238fc14610463578063853551b81461047657806394c7d7ee14610495575f5ffd5b806330cae1871161017e5780634665096d1161014e5780634665096d146103d25780634c1da1e2146103e75780635296295214610406578063530dd45614610425575f5ffd5b806330cae187146103445780633adc277a146103635780633ca7c02a146103995780634136a33c146103b3575f5ffd5b806318ff183c116101b957806318ff183c1461029a5780631cff79cd146102b957806325c471a0146102cc5780633078f114146102eb575f5ffd5b806308d6122d146101ea5780630b0a93ba1461020b57806312be872714610247578063167bd3951461027b575b5f5ffd5b3480156101f5575f5ffd5b50610209610204366004612455565b61069e565b005b348015610216575f5ffd5b5061022a6102253660046124b7565b6106f0565b6040516001600160401b0390911681526020015b60405180910390f35b348015610252575f5ffd5b506102666102613660046124b7565b610727565b60405163ffffffff909116815260200161023e565b348015610286575f5ffd5b506102096102953660046124d0565b610771565b3480156102a5575f5ffd5b506102096102b436600461250b565b610787565b6102666102c7366004612574565b6107e9565b3480156102d7575f5ffd5b506102096102e63660046125d7565b61092a565b3480156102f6575f5ffd5b5061030a610305366004612619565b61094c565b60405161023e949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561034f575f5ffd5b5061020961035e366004612633565b6109bf565b34801561036e575f5ffd5b5061038261037d366004612664565b6109d1565b60405165ffffffffffff909116815260200161023e565b3480156103a4575f5ffd5b5061022a6001600160401b0381565b3480156103be575f5ffd5b506102666103cd366004612664565b610a13565b3480156103dd575f5ffd5b5062093a80610266565b3480156103f2575f5ffd5b5061026661040136600461267b565b610a3e565b348015610411575f5ffd5b50610209610420366004612633565b610a78565b348015610430575f5ffd5b5061022a61043f3660046124b7565b610a8a565b34801561044f575f5ffd5b5061022a61045e3660046126ab565b610aba565b34801561046e575f5ffd5b5061022a5f81565b348015610481575f5ffd5b506102096104903660046126d7565b610b01565b3480156104a0575f5ffd5b506102096104af366004612574565b610b98565b3480156104bf575f5ffd5b506104d36104ce36600461267b565b610c42565b604051901515815260200161023e565b3480156104ee575f5ffd5b506102096104fd3660046126f2565b610c79565b34801561050d575f5ffd5b5061052161051c36600461271a565b610c8b565b60405190815260200161023e565b34801561053a575f5ffd5b5061054e61054936600461277a565b610cc3565b60405161023e91906127b8565b348015610566575f5ffd5b5061057a61057536600461283c565b610da8565b60408051921515835263ffffffff90911660208301520161023e565b3480156105a1575f5ffd5b506102096105b0366004612619565b610e29565b3480156105c0575f5ffd5b506102096105cf36600461267b565b610e40565b3480156105df575f5ffd5b5062069780610266565b3480156105f4575f5ffd5b5061057a610603366004612619565b610f36565b348015610613575f5ffd5b50610209610622366004612884565b610faf565b348015610632575f5ffd5b5061026661064136600461271a565b610fc1565b348015610651575f5ffd5b506106656106603660046128a0565b611124565b6040805192835263ffffffff90911660208301520161023e565b34801561068a575f5ffd5b50610209610699366004612619565b6112c0565b6106a66112e9565b5f5b828110156106e9576106e1858585848181106106c6576106c661290d565b90506020020160208101906106db9190612921565b84611360565b6001016106a8565b5050505050565b5f5f6106fa6113ec565b6001600160401b039384165f9081526001918201602052604090200154600160401b900490921692915050565b5f5f6107316113ec565b6001600160401b0384165f90815260018281016020526040909120015490915061076a90600160801b90046001600160701b0316611410565b9392505050565b6107796112e9565b610783828261142e565b5050565b61078f6112e9565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b906024015f604051808303815f87803b1580156107cf575f5ffd5b505af11580156107e1573d5f5f3e3d5ffd5b505050505050565b5f5f6107f36113ec565b9050335f80610804838989896114a0565b915091508115801561081a575063ffffffff8116155b1561086d57828861082b89896114f1565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b5f61087a848a8a8a610c8b565b90505f63ffffffff83161515806108a05750610895826109d1565b65ffffffffffff1615155b156108b1576108ae82611508565b90505b60038601546108c98b6108c48c8c6114f1565b611619565b87600301819055506109128b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525034925061163e915050565b50600390960195909555509293505050509392505050565b6109326112e9565b610946838361094086610727565b8461170a565b50505050565b5f5f5f5f5f6109596113ec565b6001600160401b0388165f90815260018201602090815260408083206001600160a01b038b1684529091529020805465ffffffffffff81169750919250906109b090600160301b90046001600160701b0316611964565b979a9199509750945050505050565b6109c76112e9565b6107838282611985565b5f5f6109db6113ec565b5f84815260028201602052604090205490915065ffffffffffff166109ff81611a35565b610a095780610a0b565b5f5b949350505050565b5f5f610a1d6113ec565b5f93845260020160205250506040902054600160301b900463ffffffff1690565b5f5f610a486113ec565b6001600160a01b0384165f9081526020829052604090206001015490915061076a906001600160701b0316611410565b610a806112e9565b6107838282611a63565b5f5f610a946113ec565b6001600160401b039384165f908152600191820160205260409020015490921692915050565b5f5f610ac46113ec565b6001600160a01b0385165f908152602091825260408082206001600160e01b03198716835290925220546001600160401b03169150505b92915050565b610b096112e9565b6001600160401b0383161580610b2757506001600160401b03838116145b15610b505760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610b8b929190612964565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610bd7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfb9190612977565b6001600160e01b03191614610c2e57604051630641fee960e31b81526001600160a01b0382166004820152602401610864565b6106e9610c3d85838686610c8b565b611508565b5f5f610c4c6113ec565b6001600160a01b039093165f9081526020939093525050604090206001015460ff600160701b9091041690565b610c816112e9565b6107838282611b21565b5f84848484604051602001610ca39493929190612992565b604051602081830303815290604052805190602001209050949350505050565b604080515f815260208101909152606090826001600160401b03811115610cec57610cec612a03565b604051908082528060200260200182016040528015610d1f57816020015b6060815260200190600190039081610d0a5790505b5091505f5b83811015610da057610d7b30868684818110610d4257610d4261290d565b9050602002810190610d549190612a17565b85604051602001610d6793929190612a59565b604051602081830303815290604052611c4b565b838281518110610d8d57610d8d61290d565b6020908102919091010152600101610d24565b505092915050565b5f5f610db384610c42565b15610dc257505f905080610e21565b306001600160a01b03861603610de657610ddc8484611ccd565b5f91509150610e21565b5f610df18585610aba565b90505f5f610dff8389610f36565b9150915081610e0f575f5f610e19565b63ffffffff811615815b945094505050505b935093915050565b610e316112e9565b610e3b8282611cf1565b505050565b5f610e49611dec565b805490915060ff600160401b82041615906001600160401b03165f81158015610e6f5750825b90505f826001600160401b03166001148015610e8a5750303b155b905081158015610e98575080155b15610eb65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ee057845460ff60401b1916600160401b1785555b610ee986611e14565b83156107e157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b5f8067fffffffffffffffe196001600160401b03851601610f5c5750600190505f610fa8565b5f5f610f68868661094c565b5050915091508165ffffffffffff165f14158015610f9d5750610f89611e28565b65ffffffffffff168265ffffffffffff1611155b93509150610fa89050565b9250929050565b610fb76112e9565b6107838282611e37565b5f5f610fcb6113ec565b9050335f610fd986866114f1565b90505f610fe889898989610c8b565b5f81815260028601602052604081205491925065ffffffffffff90911690036110275760405163060a299b60e41b815260048101829052602401610864565b826001600160a01b0316896001600160a01b0316146110c0575f61104b5f85610f36565b5090505f61106561105f6102258c87610aba565b86610f36565b50905081158015611074575080155b156110bd57604051630ff89d4760e21b81526001600160a01b038087166004830152808d1660248301528b1660448201526001600160e01b031985166064820152608401610864565b50505b5f818152600285016020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a39998505050505050505050565b5f5f5f61112f6113ec565b9050335f61113f828a8a8a6114a0565b9150505f8163ffffffff16611152611e28565b61115c9190612a7c565b905063ffffffff8216158061119257505f8765ffffffffffff1611801561119257508065ffffffffffff168765ffffffffffff16105b156111a357828a61082b8b8b6114f1565b6111bd8765ffffffffffff168265ffffffffffff16611eff565b96506111cb838b8b8b610c8b565b95506111d686611f0e565b836002015f8781526020019081526020015f205f0160069054906101000a900463ffffffff16600101945086846002015f8881526020019081526020015f205f015f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555084846002015f8881526020019081526020015f205f0160066101000a81548163ffffffff021916908363ffffffff1602179055508463ffffffff16867f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b489868e8e8e6040516112ab959493929190612a9a565b60405180910390a35050505094509492505050565b6001600160a01b0381163314610e3157604051635f159e6360e01b815260040160405180910390fd5b335f806112f7838236611f68565b9150915081610e3b578063ffffffff165f03611351575f611318813661202b565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b03821660248201529092506044019050610864565b610946610c3d84305f36610c8b565b5f6113696113ec565b6001600160a01b0385165f818152602083815260408083206001600160e01b0319891680855290835292819020805467ffffffffffffffff19166001600160401b03891690811790915590519283529394507f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a350505050565b7f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0090565b5f5f611424836001600160701b0316611964565b5090949350505050565b5f6114376113ec565b6001600160a01b0384165f81815260208390526040908190206001018054861515600160701b0260ff60701b1990911617905551919250907f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb13890610b8b90851515815260200190565b5f80306001600160a01b038616036114c6576114bd868585611f68565b915091506114e8565b600483106114e2576114dd868661057587876114f1565b6114bd565b505f9050805b94509492505050565b5f6114ff60048284866129dc565b61076a91612adf565b5f5f6115126113ec565b5f84815260028201602052604081205491925065ffffffffffff821691600160301b900463ffffffff16908290036115605760405163060a299b60e41b815260048101869052602401610864565b611568611e28565b65ffffffffffff168265ffffffffffff16111561159b57604051630c65b5bd60e11b815260048101869052602401610864565b6115a482611a35565b156115c557604051631e2975b960e21b815260048101869052602401610864565b5f858152600284016020526040808220805465ffffffffffff191690555163ffffffff83169187917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a3949350505050565b6001600160a01b0382165f9081526001600160e01b031982166020526040812061076a565b60608147101561166a5760405163cf47918160e01b815247600482015260248101839052604401610864565b5f6116768584866121f5565b905080801561169757505f3d118061169757505f856001600160a01b03163b115b156116ac576116a461220a565b91505061076a565b80156116d657604051639996b31560e01b81526001600160a01b0386166004820152602401610864565b3d156116e9576116e4612223565b611702565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b5f5f6117146113ec565b905067fffffffffffffffe196001600160401b038716016117535760405163061c6a4360e21b81526001600160401b0387166004820152602401610864565b6001600160401b0386165f90815260018201602090815260408083206001600160a01b038916845290915281205465ffffffffffff1615908115611847578563ffffffff166117a0611e28565b6117aa9190612a7c565b905060405180604001604052808265ffffffffffff1681526020016117d88763ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b038a165f90815260018601602090815260408083206001600160a01b038d1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff909116179190911790556118f5565b6001600160401b0388165f90815260018401602090815260408083206001600160a01b038b16845290915281205461189291600160301b9091046001600160701b031690879061222e565b6001600160401b038a165f90815260018601602090815260408083206001600160a01b038d168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8716815265ffffffffffff831660208201528315158183015290516001600160a01b038916916001600160401b038b16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a3509695505050505050565b5f5f5f61197884611973611e28565b6122d4565b9250925092509193909250565b5f61198e6113ec565b90506001600160401b03831615806119ae57506001600160401b03838116145b156119d75760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b038381165f81815260018481016020526040808320909101805467ffffffffffffffff19169487169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a3505050565b5f611a3e611e28565b65ffffffffffff16611a5362093a8084612a7c565b65ffffffffffff16111592915050565b5f611a6c6113ec565b90506001600160401b0383161580611a8c57506001600160401b03838116145b15611ab55760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b038381165f8181526001848101602052604080832090910180546fffffffffffffffff00000000000000001916600160401b958816958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a3505050565b5f611b2a6113ec565b905067fffffffffffffffe196001600160401b03841601611b695760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b0383165f9081526001828101602052604082200154611ba390600160801b90046001600160701b0316846206978061222e565b6001600160401b0386165f81815260018087016020526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890611c3d908690859063ffffffff92909216825265ffffffffffff16602082015260400190565b60405180910390a250505050565b60605f611c588484612320565b9050808015611c7957505f3d1180611c7957505f846001600160a01b03163b115b15611c8e57611c8661220a565b915050610afb565b8015611cb857604051639996b31560e01b81526001600160a01b0385166004820152602401610864565b3d156116e957611cc6612223565b5092915050565b5f5f611cd76113ec565b9050611ce38484611619565b600390910154149392505050565b5f5f611cfb6113ec565b905067fffffffffffffffe196001600160401b03851601611d3a5760405163061c6a4360e21b81526001600160401b0385166004820152602401610864565b6001600160401b0384165f90815260018201602090815260408083206001600160a01b038716845290915281205465ffffffffffff169003611d7f575f915050610afb565b6001600160401b0384165f81815260018301602090815260408083206001600160a01b038816808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a35060019392505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610afb565b611e1c612333565b611e258161235a565b50565b5f611e3242612397565b905090565b5f611e406113ec565b90505f611e7683620697806001600160a01b0387165f908152602086905260409020600101546001600160701b0316919061222e565b6001600160a01b0386165f818152602086815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8816815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101611c3d565b5f82821882841102821861076a565b5f611f176113ec565b5f83815260028201602052604090205490915065ffffffffffff168015801590611f475750611f4581611a35565b155b15610e3b5760405163813e945960e01b815260048101849052602401610864565b5f806004831015611f7d57505f905080610e21565b306001600160a01b03861603611fa057610ddc30611f9b86866114f1565b611ccd565b5f5f5f611fad878761202b565b92509250925082158015611fc55750611fc530610c42565b15611fd8575f5f94509450505050610e21565b5f5f611fe4848b610f36565b9150915081611ffd575f5f965096505050505050610e21565b6120138363ffffffff168263ffffffff16611eff565b63ffffffff8116159b909a5098505050505050505050565b5f8080600484101561204457505f9150819050806121ee565b5f61204f86866114f1565b90506001600160e01b031981166310a6aa3760e31b148061208057506001600160e01b031981166330cae18760e01b145b8061209b57506001600160e01b0319811663294b14a960e11b145b806120b657506001600160e01b03198116635326cae760e11b145b806120d157506001600160e01b0319811663d22b598960e01b145b156120e65760015f5f935093509350506121ee565b6001600160e01b0319811663063fc60f60e21b148061211557506001600160e01b0319811663167bd39560e01b145b8061213057506001600160e01b031981166308d6122d60e01b145b1561216f575f61214460246004888a6129dc565b810190612151919061267b565b90505f61215d82610a3e565b600196505f955093506121ee92505050565b6001600160e01b0319811663012e238d60e51b148061219e57506001600160e01b03198116635be958b160e11b145b156121da575f6121b260246004888a6129dc565b8101906121bf91906124b7565b905060016121cc82610a8a565b5f94509450945050506121ee565b5f6121e53083610aba565b5f935093509350505b9250925092565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f612243866001600160701b0316611410565b90505f61227e8563ffffffff168763ffffffff168463ffffffff1611612269575f612273565b6122738885612b15565b63ffffffff16611eff565b90508063ffffffff1661228f611e28565b6122999190612a7c565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561230f57828282612313565b815f5f5b9250925092509250925092565b5f5f5f835160208501865af49392505050565b61233b6123cd565b61235857604051631afcd79f60e31b815260040160405180910390fd5b565b612362612333565b6001600160a01b03811661238b57604051630409d6d160e11b81525f6004820152602401610864565b6107835f825f5f61170a565b5f65ffffffffffff8211156123c9576040516306dfcc6560e41b81526030600482015260248101839052604401610864565b5090565b5f6123d6611dec565b54600160401b900460ff16919050565b6001600160a01b0381168114611e25575f5ffd5b5f5f83601f84011261240a575f5ffd5b5081356001600160401b03811115612420575f5ffd5b6020830191508360208260051b8501011115610fa8575f5ffd5b80356001600160401b0381168114612450575f5ffd5b919050565b5f5f5f5f60608587031215612468575f5ffd5b8435612473816123e6565b935060208501356001600160401b0381111561248d575f5ffd5b612499878288016123fa565b90945092506124ac90506040860161243a565b905092959194509250565b5f602082840312156124c7575f5ffd5b61076a8261243a565b5f5f604083850312156124e1575f5ffd5b82356124ec816123e6565b915060208301358015158114612500575f5ffd5b809150509250929050565b5f5f6040838503121561251c575f5ffd5b8235612527816123e6565b91506020830135612500816123e6565b5f5f83601f840112612547575f5ffd5b5081356001600160401b0381111561255d575f5ffd5b602083019150836020828501011115610fa8575f5ffd5b5f5f5f60408486031215612586575f5ffd5b8335612591816123e6565b925060208401356001600160401b038111156125ab575f5ffd5b6125b786828701612537565b9497909650939450505050565b803563ffffffff81168114612450575f5ffd5b5f5f5f606084860312156125e9575f5ffd5b6125f28461243a565b92506020840135612602816123e6565b9150612610604085016125c4565b90509250925092565b5f5f6040838503121561262a575f5ffd5b6125278361243a565b5f5f60408385031215612644575f5ffd5b61264d8361243a565b915061265b6020840161243a565b90509250929050565b5f60208284031215612674575f5ffd5b5035919050565b5f6020828403121561268b575f5ffd5b813561076a816123e6565b6001600160e01b031981168114611e25575f5ffd5b5f5f604083850312156126bc575f5ffd5b82356126c7816123e6565b9150602083013561250081612696565b5f5f5f604084860312156126e9575f5ffd5b6125918461243a565b5f5f60408385031215612703575f5ffd5b61270c8361243a565b915061265b602084016125c4565b5f5f5f5f6060858703121561272d575f5ffd5b8435612738816123e6565b93506020850135612748816123e6565b925060408501356001600160401b03811115612762575f5ffd5b61276e87828801612537565b95989497509550505050565b5f5f6020838503121561278b575f5ffd5b82356001600160401b038111156127a0575f5ffd5b6127ac858286016123fa565b90969095509350505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561283057603f19878603018452815180518087528060208301602089015e5f602082890101526020601f19601f830116880101965050506020820191506020840193506001810190506127de565b50929695505050505050565b5f5f5f6060848603121561284e575f5ffd5b8335612859816123e6565b92506020840135612869816123e6565b9150604084013561287981612696565b809150509250925092565b5f5f60408385031215612895575f5ffd5b823561270c816123e6565b5f5f5f5f606085870312156128b3575f5ffd5b84356128be816123e6565b935060208501356001600160401b038111156128d8575f5ffd5b6128e487828801612537565b909450925050604085013565ffffffffffff81168114612902575f5ffd5b939692955090935050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612931575f5ffd5b813561076a81612696565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610a0b60208301848661293c565b5f60208284031215612987575f5ffd5b815161076a81612696565b6001600160a01b038581168252841660208201526060604082018190525f906129be908301848661293c565b9695505050505050565b634e487b7160e01b5f52601160045260245ffd5b5f5f858511156129ea575f5ffd5b838611156129f6575f5ffd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f5f8335601e19843603018112612a2c575f5ffd5b8301803591506001600160401b03821115612a45575f5ffd5b602001915036819003821315610fa8575f5ffd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b65ffffffffffff8181168382160190811115610afb57610afb6129c8565b65ffffffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90612ad4908301848661293c565b979650505050505050565b80356001600160e01b03198116906004841015611cc6576001600160e01b031960049490940360031b84901b1690921692915050565b63ffffffff8281168282160390811115610afb57610afb6129c856fea2646970667358221220fde1ebeea8ce6b578e82debb1ffb00e13086a10f0cf61739f7931b7e4d52c92864736f6c634300081f0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/AccountERC7579HookedUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccountERC7579HookedUpgradeable.json
new file mode 100644
index 0000000..0e9cf39
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccountERC7579HookedUpgradeable.json
@@ -0,0 +1,559 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "AccountERC7579HookedUpgradeable",
+ "sourceName": "contracts/account/extensions/draft-AccountERC7579HookedUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "AccountUnauthorized",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ERC7579AlreadyInstalledModule",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC7579CannotDecodeFallbackData",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC7579DecodingError",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "hook",
+ "type": "address"
+ }
+ ],
+ "name": "ERC7579HookModuleAlreadyPresent",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ERC7579MismatchedModuleTypeId",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ }
+ ],
+ "name": "ERC7579MissingFallbackHandler",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ERC7579UninstalledModule",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "CallType",
+ "name": "callType",
+ "type": "bytes1"
+ }
+ ],
+ "name": "ERC7579UnsupportedCallType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "ExecType",
+ "name": "execType",
+ "type": "bytes1"
+ }
+ ],
+ "name": "ERC7579UnsupportedExecType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC7579UnsupportedModuleType",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OutOfRangeAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "batchExecutionIndex",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "returndata",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7579TryExecuteFail",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ModuleInstalled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ModuleUninstalled",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "inputs": [],
+ "name": "accountId",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "entryPoint",
+ "outputs": [
+ {
+ "internalType": "contract IEntryPoint",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "mode",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "executionCalldata",
+ "type": "bytes"
+ }
+ ],
+ "name": "execute",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "mode",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "executionCalldata",
+ "type": "bytes"
+ }
+ ],
+ "name": "executeFromExecutor",
+ "outputs": [
+ {
+ "internalType": "bytes[]",
+ "name": "returnData",
+ "type": "bytes[]"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "hook",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initData",
+ "type": "bytes"
+ }
+ ],
+ "name": "installModule",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "isModuleInstalled",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "encodedMode",
+ "type": "bytes32"
+ }
+ ],
+ "name": "supportsExecutionMode",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ }
+ ],
+ "name": "supportsModule",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "deInitData",
+ "type": "bytes"
+ }
+ ],
+ "name": "uninstallModule",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "accountGasLimits",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "gasFees",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct PackedUserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "missingAccountFunds",
+ "type": "uint256"
+ }
+ ],
+ "name": "validateUserOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/AccountERC7579Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccountERC7579Upgradeable.json
new file mode 100644
index 0000000..683f93b
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/AccountERC7579Upgradeable.json
@@ -0,0 +1,535 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "AccountERC7579Upgradeable",
+ "sourceName": "contracts/account/extensions/draft-AccountERC7579Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "AccountUnauthorized",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ERC7579AlreadyInstalledModule",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC7579CannotDecodeFallbackData",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC7579DecodingError",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ERC7579MismatchedModuleTypeId",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ }
+ ],
+ "name": "ERC7579MissingFallbackHandler",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ERC7579UninstalledModule",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "CallType",
+ "name": "callType",
+ "type": "bytes1"
+ }
+ ],
+ "name": "ERC7579UnsupportedCallType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "ExecType",
+ "name": "execType",
+ "type": "bytes1"
+ }
+ ],
+ "name": "ERC7579UnsupportedExecType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC7579UnsupportedModuleType",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OutOfRangeAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "batchExecutionIndex",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "returndata",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7579TryExecuteFail",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ModuleInstalled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ }
+ ],
+ "name": "ModuleUninstalled",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "inputs": [],
+ "name": "accountId",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "entryPoint",
+ "outputs": [
+ {
+ "internalType": "contract IEntryPoint",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "mode",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "executionCalldata",
+ "type": "bytes"
+ }
+ ],
+ "name": "execute",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "mode",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "executionCalldata",
+ "type": "bytes"
+ }
+ ],
+ "name": "executeFromExecutor",
+ "outputs": [
+ {
+ "internalType": "bytes[]",
+ "name": "returnData",
+ "type": "bytes[]"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initData",
+ "type": "bytes"
+ }
+ ],
+ "name": "installModule",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "additionalContext",
+ "type": "bytes"
+ }
+ ],
+ "name": "isModuleInstalled",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "encodedMode",
+ "type": "bytes32"
+ }
+ ],
+ "name": "supportsExecutionMode",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ }
+ ],
+ "name": "supportsModule",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "moduleTypeId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "module",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "deInitData",
+ "type": "bytes"
+ }
+ ],
+ "name": "uninstallModule",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "accountGasLimits",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "gasFees",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct PackedUserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "missingAccountFunds",
+ "type": "uint256"
+ }
+ ],
+ "name": "validateUserOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeERC20Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeERC20Upgradeable.json
new file mode 100644
index 0000000..13608fa
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeERC20Upgradeable.json
@@ -0,0 +1,275 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "BridgeERC20Upgradeable",
+ "sourceName": "contracts/crosschain/bridges/BridgeERC20Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7786RecipientUnauthorizedGateway",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InteroperableAddressEmptyReferenceAndAddress",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "InteroperableAddressParsingError",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkAlreadyRegistered",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "from",
+ "type": "bytes"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "CrosschainFungibleTransferReceived",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "sendId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "CrosschainFungibleTransferSent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkRegistered",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "crosschainTransfer",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "getLink",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "payload",
+ "type": "bytes"
+ }
+ ],
+ "name": "receiveMessage",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "token",
+ "outputs": [
+ {
+ "internalType": "contract IERC20",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeERC7802Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeERC7802Upgradeable.json
new file mode 100644
index 0000000..fbc89a6
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeERC7802Upgradeable.json
@@ -0,0 +1,264 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "BridgeERC7802Upgradeable",
+ "sourceName": "contracts/crosschain/bridges/BridgeERC7802Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7786RecipientUnauthorizedGateway",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InteroperableAddressEmptyReferenceAndAddress",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "InteroperableAddressParsingError",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkAlreadyRegistered",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "from",
+ "type": "bytes"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "CrosschainFungibleTransferReceived",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "sendId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "CrosschainFungibleTransferSent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkRegistered",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "crosschainTransfer",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "getLink",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "payload",
+ "type": "bytes"
+ }
+ ],
+ "name": "receiveMessage",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "token",
+ "outputs": [
+ {
+ "internalType": "contract IERC7802",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeFungibleUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeFungibleUpgradeable.json
new file mode 100644
index 0000000..e25af39
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/BridgeFungibleUpgradeable.json
@@ -0,0 +1,251 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "BridgeFungibleUpgradeable",
+ "sourceName": "contracts/crosschain/bridges/abstract/BridgeFungibleUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7786RecipientUnauthorizedGateway",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InteroperableAddressEmptyReferenceAndAddress",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "InteroperableAddressParsingError",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkAlreadyRegistered",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "from",
+ "type": "bytes"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "CrosschainFungibleTransferReceived",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "sendId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "CrosschainFungibleTransferSent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkRegistered",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "crosschainTransfer",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "getLink",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "payload",
+ "type": "bytes"
+ }
+ ],
+ "name": "receiveMessage",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ContextUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ContextUpgradeable.json
new file mode 100644
index 0000000..5ece81a
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ContextUpgradeable.json
@@ -0,0 +1,34 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ContextUpgradeable",
+ "sourceName": "contracts/utils/ContextUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/CrosschainLinkedUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/CrosschainLinkedUpgradeable.json
new file mode 100644
index 0000000..d2b164d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/CrosschainLinkedUpgradeable.json
@@ -0,0 +1,165 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "CrosschainLinkedUpgradeable",
+ "sourceName": "contracts/crosschain/CrosschainLinkedUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7786RecipientUnauthorizedGateway",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InteroperableAddressEmptyReferenceAndAddress",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "InteroperableAddressParsingError",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkAlreadyRegistered",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkRegistered",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "getLink",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "payload",
+ "type": "bytes"
+ }
+ ],
+ "name": "receiveMessage",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/EIP712Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/EIP712Upgradeable.json
new file mode 100644
index 0000000..a55bc70
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/EIP712Upgradeable.json
@@ -0,0 +1,83 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "EIP712Upgradeable",
+ "sourceName": "contracts/utils/cryptography/EIP712Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155BurnableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155BurnableUpgradeable.json
new file mode 100644
index 0000000..97a860f
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155BurnableUpgradeable.json
@@ -0,0 +1,494 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC1155BurnableUpgradeable",
+ "sourceName": "contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "idsLength",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "valuesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InvalidArrayLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155MissingApprovalForAll",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "TransferBatch",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "TransferSingle",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "value",
+ "type": "string"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "URI",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "accounts",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "balanceOfBatch",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "burn",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "burnBatch",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeBatchTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "uri",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155PausableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155PausableUpgradeable.json
new file mode 100644
index 0000000..f35f295
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155PausableUpgradeable.json
@@ -0,0 +1,497 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC1155PausableUpgradeable",
+ "sourceName": "contracts/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "idsLength",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "valuesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InvalidArrayLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155MissingApprovalForAll",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EnforcedPause",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ExpectedPause",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Paused",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "TransferBatch",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "TransferSingle",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "value",
+ "type": "string"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "URI",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Unpaused",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "accounts",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "balanceOfBatch",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "paused",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeBatchTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "uri",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155SupplyUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155SupplyUpgradeable.json
new file mode 100644
index 0000000..092002b
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155SupplyUpgradeable.json
@@ -0,0 +1,499 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC1155SupplyUpgradeable",
+ "sourceName": "contracts/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "idsLength",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "valuesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InvalidArrayLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155MissingApprovalForAll",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "TransferBatch",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "TransferSingle",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "value",
+ "type": "string"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "URI",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "accounts",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "balanceOfBatch",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "exists",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeBatchTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "uri",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155URIStorageUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155URIStorageUpgradeable.json
new file mode 100644
index 0000000..fd7ec17
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155URIStorageUpgradeable.json
@@ -0,0 +1,448 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC1155URIStorageUpgradeable",
+ "sourceName": "contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "idsLength",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "valuesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InvalidArrayLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155MissingApprovalForAll",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "TransferBatch",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "TransferSingle",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "value",
+ "type": "string"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "URI",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "accounts",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "balanceOfBatch",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeBatchTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "uri",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155Upgradeable.json
new file mode 100644
index 0000000..aa58e05
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1155Upgradeable.json
@@ -0,0 +1,448 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC1155Upgradeable",
+ "sourceName": "contracts/token/ERC1155/ERC1155Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "idsLength",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "valuesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1155InvalidArrayLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1155MissingApprovalForAll",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "TransferBatch",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "TransferSingle",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "value",
+ "type": "string"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "URI",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "accounts",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "balanceOfBatch",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeBatchTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "uri",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1363Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1363Upgradeable.json
new file mode 100644
index 0000000..41d9bf2
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC1363Upgradeable.json
@@ -0,0 +1,605 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC1363Upgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC1363Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1363ApproveFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1363InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1363InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1363TransferFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC1363TransferFromFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approveAndCall",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "approveAndCall",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferAndCall",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "transferAndCall",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "transferFromAndCall",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFromAndCall",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC165Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC165Upgradeable.json
new file mode 100644
index 0000000..3586108
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC165Upgradeable.json
@@ -0,0 +1,53 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC165Upgradeable",
+ "sourceName": "contracts/utils/introspection/ERC165Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20BridgeableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20BridgeableUpgradeable.json
new file mode 100644
index 0000000..bdcfe54
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20BridgeableUpgradeable.json
@@ -0,0 +1,447 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20BridgeableUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/draft-ERC20BridgeableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "CrosschainBurn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "CrosschainMint",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "crosschainBurn",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "crosschainMint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20BurnableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20BurnableUpgradeable.json
new file mode 100644
index 0000000..50dbcd7
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20BurnableUpgradeable.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20BurnableUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC20BurnableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "burn",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "burnFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20CappedUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20CappedUpgradeable.json
new file mode 100644
index 0000000..3563c3c
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20CappedUpgradeable.json
@@ -0,0 +1,382 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20CappedUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC20CappedUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "increasedSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "cap",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20ExceededCap",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "cap",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InvalidCap",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "cap",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20CrosschainUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20CrosschainUpgradeable.json
new file mode 100644
index 0000000..c835223
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20CrosschainUpgradeable.json
@@ -0,0 +1,588 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20CrosschainUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC20CrosschainUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7786RecipientUnauthorizedGateway",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InteroperableAddressEmptyReferenceAndAddress",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "InteroperableAddressParsingError",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkAlreadyRegistered",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "from",
+ "type": "bytes"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "CrosschainFungibleTransferReceived",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "sendId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "CrosschainFungibleTransferSent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "name": "LinkRegistered",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "crosschainTransfer",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "to",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "crosschainTransferFrom",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "chain",
+ "type": "bytes"
+ }
+ ],
+ "name": "getLink",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "gateway",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "counterpart",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "receiveId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "sender",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "payload",
+ "type": "bytes"
+ }
+ ],
+ "name": "receiveMessage",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20FlashMintUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20FlashMintUpgradeable.json
new file mode 100644
index 0000000..0d5bdb0
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20FlashMintUpgradeable.json
@@ -0,0 +1,452 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20FlashMintUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "maxLoan",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC3156ExceededMaxLoan",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC3156InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "ERC3156UnsupportedToken",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "flashFee",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "contract IERC3156FlashBorrower",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "flashLoan",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "maxFlashLoan",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20PausableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20PausableUpgradeable.json
new file mode 100644
index 0000000..1d3c1a0
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20PausableUpgradeable.json
@@ -0,0 +1,391 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20PausableUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC20PausableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EnforcedPause",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ExpectedPause",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Paused",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Unpaused",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "paused",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20PermitUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20PermitUpgradeable.json
new file mode 100644
index 0000000..ffde74e
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20PermitUpgradeable.json
@@ -0,0 +1,536 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20PermitUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC20PermitUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "ECDSAInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "length",
+ "type": "uint256"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureS",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC2612ExpiredSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "signer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC2612InvalidSigner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "DOMAIN_SEPARATOR",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "v",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "r",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "permit",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20TemporaryApprovalUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20TemporaryApprovalUpgradeable.json
new file mode 100644
index 0000000..b309b48
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20TemporaryApprovalUpgradeable.json
@@ -0,0 +1,366 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20TemporaryApprovalUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/draft-ERC20TemporaryApprovalUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "temporaryApprove",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20Upgradeable.json
new file mode 100644
index 0000000..cef448d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20Upgradeable.json
@@ -0,0 +1,342 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20Upgradeable",
+ "sourceName": "contracts/token/ERC20/ERC20Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20VotesUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20VotesUpgradeable.json
new file mode 100644
index 0000000..68d4819
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20VotesUpgradeable.json
@@ -0,0 +1,785 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20VotesUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "CheckpointUnorderedInsertion",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ECDSAInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "length",
+ "type": "uint256"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureS",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "increasedSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "cap",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20ExceededSafeSupply",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "clock",
+ "type": "uint48"
+ }
+ ],
+ "name": "ERC5805FutureLookup",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC6372InconsistentClock",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "expiry",
+ "type": "uint256"
+ }
+ ],
+ "name": "VotesExpiredSignature",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "fromDelegate",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "toDelegate",
+ "type": "address"
+ }
+ ],
+ "name": "DelegateChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegate",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "previousVotes",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newVotes",
+ "type": "uint256"
+ }
+ ],
+ "name": "DelegateVotesChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "pos",
+ "type": "uint32"
+ }
+ ],
+ "name": "checkpoints",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint48",
+ "name": "_key",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint208",
+ "name": "_value",
+ "type": "uint208"
+ }
+ ],
+ "internalType": "struct Checkpoints.Checkpoint208",
+ "name": "",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "delegatee",
+ "type": "address"
+ }
+ ],
+ "name": "delegate",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "delegatee",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "expiry",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "v",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "r",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "delegateBySig",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "delegates",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastTotalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "numCheckpoints",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20WrapperUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20WrapperUpgradeable.json
new file mode 100644
index 0000000..c94c308
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC20WrapperUpgradeable.json
@@ -0,0 +1,425 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC20WrapperUpgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC20WrapperUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidUnderlying",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "depositFor",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "underlying",
+ "outputs": [
+ {
+ "internalType": "contract IERC20",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2771ContextUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2771ContextUpgradeable.json
new file mode 100644
index 0000000..3eacb2d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2771ContextUpgradeable.json
@@ -0,0 +1,66 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC2771ContextUpgradeable",
+ "sourceName": "contracts/metatx/ERC2771ContextUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "forwarder",
+ "type": "address"
+ }
+ ],
+ "name": "isTrustedForwarder",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "trustedForwarder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2771ForwarderUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2771ForwarderUpgradeable.json
new file mode 100644
index 0000000..eba6d81
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2771ForwarderUpgradeable.json
@@ -0,0 +1,397 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC2771ForwarderUpgradeable",
+ "sourceName": "contracts/metatx/ERC2771ForwarderUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint48",
+ "name": "deadline",
+ "type": "uint48"
+ }
+ ],
+ "name": "ERC2771ForwarderExpiredRequest",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "signer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ }
+ ],
+ "name": "ERC2771ForwarderInvalidSigner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "requestedValue",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "msgValue",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC2771ForwarderMismatchedValue",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "forwarder",
+ "type": "address"
+ }
+ ],
+ "name": "ERC2771UntrustfulTarget",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "signer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "name": "ExecutedForwardRequest",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "gas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "deadline",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct ERC2771ForwarderUpgradeable.ForwardRequestData",
+ "name": "request",
+ "type": "tuple"
+ }
+ ],
+ "name": "execute",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "gas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "deadline",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct ERC2771ForwarderUpgradeable.ForwardRequestData[]",
+ "name": "requests",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "refundReceiver",
+ "type": "address"
+ }
+ ],
+ "name": "executeBatch",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "gas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "deadline",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct ERC2771ForwarderUpgradeable.ForwardRequestData",
+ "name": "request",
+ "type": "tuple"
+ }
+ ],
+ "name": "verify",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b5061121e8061001c5f395ff3fe608060405260043610610054575f3560e01c806319d8d38c146100585780637ecebe001461008c57806384b0196e146100ed578063ccf96b4a14610114578063df905caf14610129578063f62d18881461013c575b5f5ffd5b348015610063575f5ffd5b50610077610072366004610d07565b61015b565b60405190151581526020015b60405180910390f35b348015610097575f5ffd5b506100df6100a6366004610d59565b6001600160a01b03165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00602052604090205490565b604051908152602001610083565b3480156100f8575f5ffd5b5061010161018b565b6040516100839796959493929190610da2565b610127610122366004610e38565b6101cd565b005b610127610137366004610d07565b6102d2565b348015610147575f5ffd5b50610127610156366004610ece565b61032d565b5f5f5f5f61016885610425565b509250925092508280156101795750815b80156101825750805b95945050505050565b5f6060805f5f5f606061019c6104a7565b6101a461057a565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6001600160a01b038116155f80805b8581101561028b578686828181106101f6576101f6610f81565b90506020028101906102089190610f95565b610216906040013584610fb3565b92505f61024688888481811061022e5761022e610f81565b90506020028101906102409190610f95565b866105cb565b9050806102825787878381811061025f5761025f610f81565b90506020028101906102719190610f95565b61027f906040013584610fb3565b92505b506001016101dc565b503482146102ba576040516370647f7960e01b8152600481018390523460248201526044015b60405180910390fd5b80156102ca576102ca84826107c5565b505050505050565b8060400135341461030257604080516370647f7960e01b81529082013560048201523460248201526044016102b1565b61030d8160016105cb565b61032a5760405163d6bda27560e01b815260040160405180910390fd5b50565b5f61033661083c565b805490915060ff600160401b820416159067ffffffffffffffff165f8115801561035d5750825b90505f8267ffffffffffffffff1660011480156103795750303b155b905081158015610387575080155b156103a55760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103cf57845460ff60401b1916600160401b1785555b6103d886610866565b83156102ca57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b5f5f5f5f5f5f61043487610891565b909250905061045161044c6040890160208a01610d59565b6109d3565b4261046260a08a0160808b01610fd2565b65ffffffffffff161015838015610496575061048160208a018a610d59565b6001600160a01b0316836001600160a01b0316145b919750955093509150509193509193565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100916104f890610ff7565b80601f016020809104026020016040519081016040528092919081815260200182805461052490610ff7565b801561056f5780601f106105465761010080835404028352916020019161056f565b820191905f5260205f20905b81548152906001019060200180831161055257829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100916104f890610ff7565b5f5f5f5f5f6105d987610425565b9350935093509350851561069f5783610627576105fc6040880160208901610d59565b60405163d2650cd160e01b81526001600160a01b0390911660048201523060248201526044016102b1565b826106605761063c60a0880160808901610fd2565b604051634a777ac560e11b815265ffffffffffff90911660048201526024016102b1565b8161069f57806106736020890189610d59565b604051636422d02b60e11b81526001600160a01b039283166004820152911660248201526044016102b1565b8380156106a95750815b80156106b25750825b156107bb576001600160a01b0381165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb0060205260408120805460018101909155905060608801355f61070e60408b0160208c01610d59565b905060408a01355f61072360a08d018d61102f565b61073060208f018f610d59565b60405160200161074293929190611079565b60405160208183030381529060405290505f5f5f83516020850186888af19a505a905061076f818e610a4c565b604080518781528c151560208201526001600160a01b038916917f842fb24a83793558587a3dab2be7674da4a51d09c5542d6dd354e5d0ea70813c910160405180910390a25050505050505b5050505092915050565b804710156107ef5760405163cf47918160e01b8152476004820152602481018290526044016102b1565b610808828260405180602001604052805f815250610a64565b15610811575050565b3d156108235761081f610a79565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b61086e610a84565b61032a81604051806040016040528060018152602001603160f81b815250610aab565b5f8080806109ae6108a560c087018761102f565b6109a77f7f96328b83274ebc7c1cf4f7a3abda602b51a78b7fa1d86a2ce353d75e587cac6108d660208b018b610d59565b6108e660408c0160208d01610d59565b8b604001358c606001356109058e5f0160208101906100a69190610d59565b8e60800160208101906109189190610fd2565b8f8060a00190610928919061102f565b60405161093692919061109f565b6040805191829003822060208301999099526001600160a01b0397881690820152959094166060860152608085019290925260a084015260c083015265ffffffffffff1660e08201526101008101919091526101200160405160208183030381529060405280519060200120610b14565b9190610b40565b5090925090505f8160038111156109c7576109c76110ae565b14959194509092505050565b6040513060248201525f90819060440160408051601f19818403018152919052602080820180516001600160e01b031663572b6c0560e01b17815282519293505f928392839290918391895afa92503d91505f519050828015610a37575060208210155b8015610a4257505f81115b9695505050505050565b610a5b603f60608301356110c2565b82101561081f57fe5b5f5f5f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b610a8c610b87565b610aa957604051631afcd79f60e31b815260040160405180910390fd5b565b610ab3610a84565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102610aff848261112d565b5060038101610b0e838261112d565b50505050565b5f610860610b20610ba0565b8360405161190160f01b8152600281019290925260228201526042902090565b5f80806041849003610b74578435602086013560408701355f1a610b6689828585610bae565b955095509550505050610b7e565b505f915060029050825b93509350939050565b5f610b9061083c565b54600160401b900460ff16919050565b5f610ba9610c76565b905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610be757505f91506003905082610c6c565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610c38573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610c6357505f925060019150829050610c6c565b92505f91508190505b9450945094915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610ca0610ce9565b610ca8610cfe565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f610cf26104a7565b80519060200120905090565b5f610cf261057a565b5f60208284031215610d17575f5ffd5b813567ffffffffffffffff811115610d2d575f5ffd5b820160e08185031215610d3e575f5ffd5b9392505050565b6001600160a01b038116811461032a575f5ffd5b5f60208284031215610d69575f5ffd5b8135610d3e81610d45565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b60ff60f81b8816815260e060208201525f610dc060e0830189610d74565b8281036040840152610dd28189610d74565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610e27578351835260209384019390920191600101610e09565b50909b9a5050505050505050505050565b5f5f5f60408486031215610e4a575f5ffd5b833567ffffffffffffffff811115610e60575f5ffd5b8401601f81018613610e70575f5ffd5b803567ffffffffffffffff811115610e86575f5ffd5b8660208260051b8401011115610e9a575f5ffd5b602091820194509250840135610eaf81610d45565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610ede575f5ffd5b813567ffffffffffffffff811115610ef4575f5ffd5b8201601f81018413610f04575f5ffd5b803567ffffffffffffffff811115610f1e57610f1e610eba565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610f4d57610f4d610eba565b604052818152828201602001861015610f64575f5ffd5b816020840160208301375f91810160200191909152949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f823560de19833603018112610fa9575f5ffd5b9190910192915050565b8082018082111561086057634e487b7160e01b5f52601160045260245ffd5b5f60208284031215610fe2575f5ffd5b813565ffffffffffff81168114610d3e575f5ffd5b600181811c9082168061100b57607f821691505b60208210810361102957634e487b7160e01b5f52602260045260245ffd5b50919050565b5f5f8335601e19843603018112611044575f5ffd5b83018035915067ffffffffffffffff82111561105e575f5ffd5b602001915036819003821315611072575f5ffd5b9250929050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b818382375f9101908152919050565b634e487b7160e01b5f52602160045260245ffd5b5f826110dc57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561112857805f5260205f20601f840160051c810160208510156111065750805b601f840160051c820191505b81811015611125575f8155600101611112565b50505b505050565b815167ffffffffffffffff81111561114757611147610eba565b61115b816111558454610ff7565b846110e1565b6020601f82116001811461118d575f83156111765750848201515b5f19600385901b1c1916600184901b178455611125565b5f84815260208120601f198516915b828110156111bc578785015182556020948501946001909201910161119c565b50848210156111d957868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220e1b2c7ce0a9d7e438b68454649bf002accd6e259585218dc9edfa5341f78042664736f6c634300081f0033",
+ "deployedBytecode": "0x608060405260043610610054575f3560e01c806319d8d38c146100585780637ecebe001461008c57806384b0196e146100ed578063ccf96b4a14610114578063df905caf14610129578063f62d18881461013c575b5f5ffd5b348015610063575f5ffd5b50610077610072366004610d07565b61015b565b60405190151581526020015b60405180910390f35b348015610097575f5ffd5b506100df6100a6366004610d59565b6001600160a01b03165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00602052604090205490565b604051908152602001610083565b3480156100f8575f5ffd5b5061010161018b565b6040516100839796959493929190610da2565b610127610122366004610e38565b6101cd565b005b610127610137366004610d07565b6102d2565b348015610147575f5ffd5b50610127610156366004610ece565b61032d565b5f5f5f5f61016885610425565b509250925092508280156101795750815b80156101825750805b95945050505050565b5f6060805f5f5f606061019c6104a7565b6101a461057a565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6001600160a01b038116155f80805b8581101561028b578686828181106101f6576101f6610f81565b90506020028101906102089190610f95565b610216906040013584610fb3565b92505f61024688888481811061022e5761022e610f81565b90506020028101906102409190610f95565b866105cb565b9050806102825787878381811061025f5761025f610f81565b90506020028101906102719190610f95565b61027f906040013584610fb3565b92505b506001016101dc565b503482146102ba576040516370647f7960e01b8152600481018390523460248201526044015b60405180910390fd5b80156102ca576102ca84826107c5565b505050505050565b8060400135341461030257604080516370647f7960e01b81529082013560048201523460248201526044016102b1565b61030d8160016105cb565b61032a5760405163d6bda27560e01b815260040160405180910390fd5b50565b5f61033661083c565b805490915060ff600160401b820416159067ffffffffffffffff165f8115801561035d5750825b90505f8267ffffffffffffffff1660011480156103795750303b155b905081158015610387575080155b156103a55760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103cf57845460ff60401b1916600160401b1785555b6103d886610866565b83156102ca57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b5f5f5f5f5f5f61043487610891565b909250905061045161044c6040890160208a01610d59565b6109d3565b4261046260a08a0160808b01610fd2565b65ffffffffffff161015838015610496575061048160208a018a610d59565b6001600160a01b0316836001600160a01b0316145b919750955093509150509193509193565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100916104f890610ff7565b80601f016020809104026020016040519081016040528092919081815260200182805461052490610ff7565b801561056f5780601f106105465761010080835404028352916020019161056f565b820191905f5260205f20905b81548152906001019060200180831161055257829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100916104f890610ff7565b5f5f5f5f5f6105d987610425565b9350935093509350851561069f5783610627576105fc6040880160208901610d59565b60405163d2650cd160e01b81526001600160a01b0390911660048201523060248201526044016102b1565b826106605761063c60a0880160808901610fd2565b604051634a777ac560e11b815265ffffffffffff90911660048201526024016102b1565b8161069f57806106736020890189610d59565b604051636422d02b60e11b81526001600160a01b039283166004820152911660248201526044016102b1565b8380156106a95750815b80156106b25750825b156107bb576001600160a01b0381165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb0060205260408120805460018101909155905060608801355f61070e60408b0160208c01610d59565b905060408a01355f61072360a08d018d61102f565b61073060208f018f610d59565b60405160200161074293929190611079565b60405160208183030381529060405290505f5f5f83516020850186888af19a505a905061076f818e610a4c565b604080518781528c151560208201526001600160a01b038916917f842fb24a83793558587a3dab2be7674da4a51d09c5542d6dd354e5d0ea70813c910160405180910390a25050505050505b5050505092915050565b804710156107ef5760405163cf47918160e01b8152476004820152602481018290526044016102b1565b610808828260405180602001604052805f815250610a64565b15610811575050565b3d156108235761081f610a79565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b61086e610a84565b61032a81604051806040016040528060018152602001603160f81b815250610aab565b5f8080806109ae6108a560c087018761102f565b6109a77f7f96328b83274ebc7c1cf4f7a3abda602b51a78b7fa1d86a2ce353d75e587cac6108d660208b018b610d59565b6108e660408c0160208d01610d59565b8b604001358c606001356109058e5f0160208101906100a69190610d59565b8e60800160208101906109189190610fd2565b8f8060a00190610928919061102f565b60405161093692919061109f565b6040805191829003822060208301999099526001600160a01b0397881690820152959094166060860152608085019290925260a084015260c083015265ffffffffffff1660e08201526101008101919091526101200160405160208183030381529060405280519060200120610b14565b9190610b40565b5090925090505f8160038111156109c7576109c76110ae565b14959194509092505050565b6040513060248201525f90819060440160408051601f19818403018152919052602080820180516001600160e01b031663572b6c0560e01b17815282519293505f928392839290918391895afa92503d91505f519050828015610a37575060208210155b8015610a4257505f81115b9695505050505050565b610a5b603f60608301356110c2565b82101561081f57fe5b5f5f5f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b610a8c610b87565b610aa957604051631afcd79f60e31b815260040160405180910390fd5b565b610ab3610a84565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102610aff848261112d565b5060038101610b0e838261112d565b50505050565b5f610860610b20610ba0565b8360405161190160f01b8152600281019290925260228201526042902090565b5f80806041849003610b74578435602086013560408701355f1a610b6689828585610bae565b955095509550505050610b7e565b505f915060029050825b93509350939050565b5f610b9061083c565b54600160401b900460ff16919050565b5f610ba9610c76565b905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610be757505f91506003905082610c6c565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610c38573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610c6357505f925060019150829050610c6c565b92505f91508190505b9450945094915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610ca0610ce9565b610ca8610cfe565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f610cf26104a7565b80519060200120905090565b5f610cf261057a565b5f60208284031215610d17575f5ffd5b813567ffffffffffffffff811115610d2d575f5ffd5b820160e08185031215610d3e575f5ffd5b9392505050565b6001600160a01b038116811461032a575f5ffd5b5f60208284031215610d69575f5ffd5b8135610d3e81610d45565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b60ff60f81b8816815260e060208201525f610dc060e0830189610d74565b8281036040840152610dd28189610d74565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610e27578351835260209384019390920191600101610e09565b50909b9a5050505050505050505050565b5f5f5f60408486031215610e4a575f5ffd5b833567ffffffffffffffff811115610e60575f5ffd5b8401601f81018613610e70575f5ffd5b803567ffffffffffffffff811115610e86575f5ffd5b8660208260051b8401011115610e9a575f5ffd5b602091820194509250840135610eaf81610d45565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610ede575f5ffd5b813567ffffffffffffffff811115610ef4575f5ffd5b8201601f81018413610f04575f5ffd5b803567ffffffffffffffff811115610f1e57610f1e610eba565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610f4d57610f4d610eba565b604052818152828201602001861015610f64575f5ffd5b816020840160208301375f91810160200191909152949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f823560de19833603018112610fa9575f5ffd5b9190910192915050565b8082018082111561086057634e487b7160e01b5f52601160045260245ffd5b5f60208284031215610fe2575f5ffd5b813565ffffffffffff81168114610d3e575f5ffd5b600181811c9082168061100b57607f821691505b60208210810361102957634e487b7160e01b5f52602260045260245ffd5b50919050565b5f5f8335601e19843603018112611044575f5ffd5b83018035915067ffffffffffffffff82111561105e575f5ffd5b602001915036819003821315611072575f5ffd5b9250929050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b818382375f9101908152919050565b634e487b7160e01b5f52602160045260245ffd5b5f826110dc57634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561112857805f5260205f20601f840160051c810160208510156111065750805b601f840160051c820191505b81811015611125575f8155600101611112565b50505b505050565b815167ffffffffffffffff81111561114757611147610eba565b61115b816111558454610ff7565b846110e1565b6020601f82116001811461118d575f83156111765750848201515b5f19600385901b1c1916600184901b178455611125565b5f84815260208120601f198516915b828110156111bc578785015182556020948501946001909201910161119c565b50848210156111d957868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220e1b2c7ce0a9d7e438b68454649bf002accd6e259585218dc9edfa5341f78042664736f6c634300081f0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2981Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2981Upgradeable.json
new file mode 100644
index 0000000..0c0001b
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC2981Upgradeable.json
@@ -0,0 +1,146 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC2981Upgradeable",
+ "sourceName": "contracts/token/common/ERC2981Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "numerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "denominator",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC2981InvalidDefaultRoyalty",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC2981InvalidDefaultRoyaltyReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "numerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "denominator",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC2981InvalidTokenRoyalty",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC2981InvalidTokenRoyaltyReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "salePrice",
+ "type": "uint256"
+ }
+ ],
+ "name": "royaltyInfo",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC4626Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC4626Upgradeable.json
new file mode 100644
index 0000000..1798d45
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC4626Upgradeable.json
@@ -0,0 +1,827 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC4626Upgradeable",
+ "sourceName": "contracts/token/ERC20/extensions/ERC4626Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "max",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC4626ExceededMaxDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "max",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC4626ExceededMaxMint",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "max",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC4626ExceededMaxRedeem",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "max",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC4626ExceededMaxWithdraw",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdraw",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "asset",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ }
+ ],
+ "name": "convertToAssets",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ }
+ ],
+ "name": "convertToShares",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "deposit",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "maxDeposit",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "maxMint",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "maxRedeem",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "maxWithdraw",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "mint",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ }
+ ],
+ "name": "previewDeposit",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ }
+ ],
+ "name": "previewMint",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ }
+ ],
+ "name": "previewRedeem",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ }
+ ],
+ "name": "previewWithdraw",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "shares",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "redeem",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalAssets",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "assets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "withdraw",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909ContentURIUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909ContentURIUpgradeable.json
new file mode 100644
index 0000000..15fb063
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909ContentURIUpgradeable.json
@@ -0,0 +1,492 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC6909ContentURIUpgradeable",
+ "sourceName": "contracts/token/ERC6909/extensions/ERC6909ContentURIUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "ContractURIUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "OperatorSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "value",
+ "type": "string"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "URI",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "contractURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "isOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610b2b8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061009a575f3560e01c8063598af9e711610063578063598af9e714610120578063b6363cf214610133578063c87b56dd14610146578063e8a3d48514610166578063fe99049a1461016e575f5ffd5b8062fdd58e1461009e57806301ffc9a7146100c4578063095bcdb6146100e7578063426a8493146100fa578063558a72971461010d575b5f5ffd5b6100b16100ac3660046108c9565b610181565b6040519081526020015b60405180910390f35b6100d76100d23660046108f1565b6101b7565b60405190151581526020016100bb565b6100d76100f536600461091f565b6101db565b6100d761010836600461091f565b6101f2565b6100d761011b36600461094f565b6101ff565b6100b161012e366004610988565b610214565b6100d76101413660046109c2565b610264565b6101596101543660046109f3565b6102b0565b6040516100bb9190610a0a565b610159610390565b6100d761017c366004610a3f565b610444565b6001600160a01b0382165f9081525f516020610ad65f395f51905f52602090815260408083208484529091529020545b92915050565b5f6001600160e01b0319821663041b104b60e31b14806101b157506101b18261048f565b5f6101e8338585856104c3565b5060019392505050565b5f6101e83385858561052c565b5f61020b3384846105fc565b50600192915050565b6001600160a01b039283165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf902602090815260408083209490951682529283528381209181529152205490565b6001600160a01b039182165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf9016020908152604080832093909416825291909152205460ff1690565b5f8181527f2ada2772a8c4d40c4be8741992e423a9f97d5f4ef76852e5c17a40aa7fb9e5016020526040902080546060917f2ada2772a8c4d40c4be8741992e423a9f97d5f4ef76852e5c17a40aa7fb9e5009161030c90610a7e565b80601f016020809104026020016040519081016040528092919081815260200182805461033890610a7e565b80156103835780601f1061035a57610100808354040283529160200191610383565b820191905f5260205f20905b81548152906001019060200180831161036657829003601f168201915b5050505050915050919050565b7f2ada2772a8c4d40c4be8741992e423a9f97d5f4ef76852e5c17a40aa7fb9e50080546060919081906103c290610a7e565b80601f01602080910402602001604051908101604052809291908181526020018280546103ee90610a7e565b80156104395780601f1061041057610100808354040283529160200191610439565b820191905f5260205f20905b81548152906001019060200180831161041c57829003601f168201915b505050505091505090565b5f336001600160a01b038616811480159061046657506104648682610264565b155b1561047757610477868286866106cb565b610483868686866104c3565b50600195945050505050565b5f6001600160e01b03198216630f632fb360e01b14806101b157506301ffc9a760e01b6001600160e01b03198316146101b1565b6001600160a01b0384166104f1576040516301486a4160e71b81525f60048201526024015b60405180910390fd5b6001600160a01b03831661051a57604051630b8bbd6160e41b81525f60048201526024016104e8565b6105268484848461076d565b50505050565b5f516020610ad65f395f51905f526001600160a01b0385166105635760405163198ecd5360e31b81525f60048201526024016104e8565b6001600160a01b03841661058c57604051636f65f46560e01b81525f60048201526024016104e8565b6001600160a01b038581165f81815260028401602090815260408083209489168084529482528083208884528252918290208690559051858152869392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a45050505050565b5f516020610ad65f395f51905f526001600160a01b0384166106335760405163198ecd5360e31b81525f60048201526024016104e8565b6001600160a01b03831661065c57604051636f65f46560e01b81525f60048201526024016104e8565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350505050565b5f516020610ad65f395f51905f525f6106e5868686610214565b90505f19811015610765578281101561073157604051632c51fead60e11b81526001600160a01b03861660048201526024810182905260448101849052606481018590526084016104e8565b6001600160a01b038087165f9081526002840160209081526040808320938916835292815282822087835290522083820390555b505050505050565b5f516020610ad65f395f51905f52336001600160a01b03861615610814576001600160a01b0386165f90815260208381526040808320878452909152902054838110156107ed576040516302c6d3fb60e61b81526001600160a01b03881660048201526024810182905260448101859052606481018690526084016104e8565b6001600160a01b0387165f9081526020848152604080832088845290915290209084900390555b6001600160a01b03851615610859576001600160a01b0385165f9081526020838152604080832087845290915281208054859290610853908490610ab6565b90915550505b604080516001600160a01b03838116825260208201869052869281891692918a16917f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859910160405180910390a4505050505050565b80356001600160a01b03811681146108c4575f5ffd5b919050565b5f5f604083850312156108da575f5ffd5b6108e3836108ae565b946020939093013593505050565b5f60208284031215610901575f5ffd5b81356001600160e01b031981168114610918575f5ffd5b9392505050565b5f5f5f60608486031215610931575f5ffd5b61093a846108ae565b95602085013595506040909401359392505050565b5f5f60408385031215610960575f5ffd5b610969836108ae565b91506020830135801515811461097d575f5ffd5b809150509250929050565b5f5f5f6060848603121561099a575f5ffd5b6109a3846108ae565b92506109b1602085016108ae565b929592945050506040919091013590565b5f5f604083850312156109d3575f5ffd5b6109dc836108ae565b91506109ea602084016108ae565b90509250929050565b5f60208284031215610a03575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60808587031215610a52575f5ffd5b610a5b856108ae565b9350610a69602086016108ae565b93969395505050506040820135916060013590565b600181811c90821680610a9257607f821691505b602082108103610ab057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156101b157634e487b7160e01b5f52601160045260245ffdfe9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900a2646970667358221220e6fa60d0b74a65cdcdd030a7a455557074781207021925bf6c50a14a5f37efd764736f6c634300081f0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061009a575f3560e01c8063598af9e711610063578063598af9e714610120578063b6363cf214610133578063c87b56dd14610146578063e8a3d48514610166578063fe99049a1461016e575f5ffd5b8062fdd58e1461009e57806301ffc9a7146100c4578063095bcdb6146100e7578063426a8493146100fa578063558a72971461010d575b5f5ffd5b6100b16100ac3660046108c9565b610181565b6040519081526020015b60405180910390f35b6100d76100d23660046108f1565b6101b7565b60405190151581526020016100bb565b6100d76100f536600461091f565b6101db565b6100d761010836600461091f565b6101f2565b6100d761011b36600461094f565b6101ff565b6100b161012e366004610988565b610214565b6100d76101413660046109c2565b610264565b6101596101543660046109f3565b6102b0565b6040516100bb9190610a0a565b610159610390565b6100d761017c366004610a3f565b610444565b6001600160a01b0382165f9081525f516020610ad65f395f51905f52602090815260408083208484529091529020545b92915050565b5f6001600160e01b0319821663041b104b60e31b14806101b157506101b18261048f565b5f6101e8338585856104c3565b5060019392505050565b5f6101e83385858561052c565b5f61020b3384846105fc565b50600192915050565b6001600160a01b039283165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf902602090815260408083209490951682529283528381209181529152205490565b6001600160a01b039182165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf9016020908152604080832093909416825291909152205460ff1690565b5f8181527f2ada2772a8c4d40c4be8741992e423a9f97d5f4ef76852e5c17a40aa7fb9e5016020526040902080546060917f2ada2772a8c4d40c4be8741992e423a9f97d5f4ef76852e5c17a40aa7fb9e5009161030c90610a7e565b80601f016020809104026020016040519081016040528092919081815260200182805461033890610a7e565b80156103835780601f1061035a57610100808354040283529160200191610383565b820191905f5260205f20905b81548152906001019060200180831161036657829003601f168201915b5050505050915050919050565b7f2ada2772a8c4d40c4be8741992e423a9f97d5f4ef76852e5c17a40aa7fb9e50080546060919081906103c290610a7e565b80601f01602080910402602001604051908101604052809291908181526020018280546103ee90610a7e565b80156104395780601f1061041057610100808354040283529160200191610439565b820191905f5260205f20905b81548152906001019060200180831161041c57829003601f168201915b505050505091505090565b5f336001600160a01b038616811480159061046657506104648682610264565b155b1561047757610477868286866106cb565b610483868686866104c3565b50600195945050505050565b5f6001600160e01b03198216630f632fb360e01b14806101b157506301ffc9a760e01b6001600160e01b03198316146101b1565b6001600160a01b0384166104f1576040516301486a4160e71b81525f60048201526024015b60405180910390fd5b6001600160a01b03831661051a57604051630b8bbd6160e41b81525f60048201526024016104e8565b6105268484848461076d565b50505050565b5f516020610ad65f395f51905f526001600160a01b0385166105635760405163198ecd5360e31b81525f60048201526024016104e8565b6001600160a01b03841661058c57604051636f65f46560e01b81525f60048201526024016104e8565b6001600160a01b038581165f81815260028401602090815260408083209489168084529482528083208884528252918290208690559051858152869392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a45050505050565b5f516020610ad65f395f51905f526001600160a01b0384166106335760405163198ecd5360e31b81525f60048201526024016104e8565b6001600160a01b03831661065c57604051636f65f46560e01b81525f60048201526024016104e8565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350505050565b5f516020610ad65f395f51905f525f6106e5868686610214565b90505f19811015610765578281101561073157604051632c51fead60e11b81526001600160a01b03861660048201526024810182905260448101849052606481018590526084016104e8565b6001600160a01b038087165f9081526002840160209081526040808320938916835292815282822087835290522083820390555b505050505050565b5f516020610ad65f395f51905f52336001600160a01b03861615610814576001600160a01b0386165f90815260208381526040808320878452909152902054838110156107ed576040516302c6d3fb60e61b81526001600160a01b03881660048201526024810182905260448101859052606481018690526084016104e8565b6001600160a01b0387165f9081526020848152604080832088845290915290209084900390555b6001600160a01b03851615610859576001600160a01b0385165f9081526020838152604080832087845290915281208054859290610853908490610ab6565b90915550505b604080516001600160a01b03838116825260208201869052869281891692918a16917f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859910160405180910390a4505050505050565b80356001600160a01b03811681146108c4575f5ffd5b919050565b5f5f604083850312156108da575f5ffd5b6108e3836108ae565b946020939093013593505050565b5f60208284031215610901575f5ffd5b81356001600160e01b031981168114610918575f5ffd5b9392505050565b5f5f5f60608486031215610931575f5ffd5b61093a846108ae565b95602085013595506040909401359392505050565b5f5f60408385031215610960575f5ffd5b610969836108ae565b91506020830135801515811461097d575f5ffd5b809150509250929050565b5f5f5f6060848603121561099a575f5ffd5b6109a3846108ae565b92506109b1602085016108ae565b929592945050506040919091013590565b5f5f604083850312156109d3575f5ffd5b6109dc836108ae565b91506109ea602084016108ae565b90509250929050565b5f60208284031215610a03575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60808587031215610a52575f5ffd5b610a5b856108ae565b9350610a69602086016108ae565b93969395505050506040820135916060013590565b600181811c90821680610a9257607f821691505b602082108103610ab057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156101b157634e487b7160e01b5f52601160045260245ffdfe9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900a2646970667358221220e6fa60d0b74a65cdcdd030a7a455557074781207021925bf6c50a14a5f37efd764736f6c634300081f0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909MetadataUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909MetadataUpgradeable.json
new file mode 100644
index 0000000..90b1e0f
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909MetadataUpgradeable.json
@@ -0,0 +1,549 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC6909MetadataUpgradeable",
+ "sourceName": "contracts/token/ERC6909/extensions/ERC6909MetadataUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "newDecimals",
+ "type": "uint8"
+ }
+ ],
+ "name": "ERC6909DecimalsUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "newName",
+ "type": "string"
+ }
+ ],
+ "name": "ERC6909NameUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "newSymbol",
+ "type": "string"
+ }
+ ],
+ "name": "ERC6909SymbolUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "OperatorSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "isOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610b0b8061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106100a4575f3560e01c8063426a84931161006e578063426a84931461017e5780634e41a1fb14610191578063558a7297146101a4578063598af9e7146101b7578063b6363cf2146101ca578063fe99049a146101dd575f5ffd5b8062ad800c146100a8578062fdd58e146100d157806301ffc9a7146100f2578063095bcdb6146101155780633f47e66214610128575b5f5ffd5b6100bb6100b636600461088e565b6101f0565b6040516100c891906108a5565b60405180910390f35b6100e46100df3660046108f5565b6102b3565b6040519081526020016100c8565b61010561010036600461091d565b6102e9565b60405190151581526020016100c8565b61010561012336600461094b565b61030d565b61016c61013636600461088e565b5f9081527fa0651e3d105d335a33d7d04897e080112be09c416f44637d6543e5b47885f800602052604090206002015460ff1690565b60405160ff90911681526020016100c8565b61010561018c36600461094b565b610324565b6100bb61019f36600461088e565b610331565b6101056101b236600461097b565b610373565b6100e46101c53660046109b4565b610388565b6101056101d83660046109ee565b6103d8565b6101056101eb366004610a1f565b610424565b5f8181527fa0651e3d105d335a33d7d04897e080112be09c416f44637d6543e5b47885f800602081905260409091208054606092919061022f90610a5e565b80601f016020809104026020016040519081016040528092919081815260200182805461025b90610a5e565b80156102a65780601f1061027d576101008083540402835291602001916102a6565b820191905f5260205f20905b81548152906001019060200180831161028957829003601f168201915b5050505050915050919050565b6001600160a01b0382165f9081525f516020610ab65f395f51905f52602090815260408083208484529091529020545b92915050565b5f6001600160e01b031982166371abc79560e01b14806102e357506102e38261046f565b5f61031a338585856104a3565b5060019392505050565b5f61031a3385858561050c565b5f8181527fa0651e3d105d335a33d7d04897e080112be09c416f44637d6543e5b47885f800602081905260409091206001018054606092919061022f90610a5e565b5f61037f3384846105dc565b50600192915050565b6001600160a01b039283165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf902602090815260408083209490951682529283528381209181529152205490565b6001600160a01b039182165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf9016020908152604080832093909416825291909152205460ff1690565b5f336001600160a01b0386168114801590610446575061044486826103d8565b155b1561045757610457868286866106ab565b610463868686866104a3565b50600195945050505050565b5f6001600160e01b03198216630f632fb360e01b14806102e357506301ffc9a760e01b6001600160e01b03198316146102e3565b6001600160a01b0384166104d1576040516301486a4160e71b81525f60048201526024015b60405180910390fd5b6001600160a01b0383166104fa57604051630b8bbd6160e41b81525f60048201526024016104c8565b6105068484848461074d565b50505050565b5f516020610ab65f395f51905f526001600160a01b0385166105435760405163198ecd5360e31b81525f60048201526024016104c8565b6001600160a01b03841661056c57604051636f65f46560e01b81525f60048201526024016104c8565b6001600160a01b038581165f81815260028401602090815260408083209489168084529482528083208884528252918290208690559051858152869392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a45050505050565b5f516020610ab65f395f51905f526001600160a01b0384166106135760405163198ecd5360e31b81525f60048201526024016104c8565b6001600160a01b03831661063c57604051636f65f46560e01b81525f60048201526024016104c8565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350505050565b5f516020610ab65f395f51905f525f6106c5868686610388565b90505f19811015610745578281101561071157604051632c51fead60e11b81526001600160a01b03861660048201526024810182905260448101849052606481018590526084016104c8565b6001600160a01b038087165f9081526002840160209081526040808320938916835292815282822087835290522083820390555b505050505050565b5f516020610ab65f395f51905f52336001600160a01b038616156107f4576001600160a01b0386165f90815260208381526040808320878452909152902054838110156107cd576040516302c6d3fb60e61b81526001600160a01b03881660048201526024810182905260448101859052606481018690526084016104c8565b6001600160a01b0387165f9081526020848152604080832088845290915290209084900390555b6001600160a01b03851615610839576001600160a01b0385165f9081526020838152604080832087845290915281208054859290610833908490610a96565b90915550505b604080516001600160a01b03838116825260208201869052869281891692918a16917f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859910160405180910390a4505050505050565b5f6020828403121561089e575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146108f0575f5ffd5b919050565b5f5f60408385031215610906575f5ffd5b61090f836108da565b946020939093013593505050565b5f6020828403121561092d575f5ffd5b81356001600160e01b031981168114610944575f5ffd5b9392505050565b5f5f5f6060848603121561095d575f5ffd5b610966846108da565b95602085013595506040909401359392505050565b5f5f6040838503121561098c575f5ffd5b610995836108da565b9150602083013580151581146109a9575f5ffd5b809150509250929050565b5f5f5f606084860312156109c6575f5ffd5b6109cf846108da565b92506109dd602085016108da565b929592945050506040919091013590565b5f5f604083850312156109ff575f5ffd5b610a08836108da565b9150610a16602084016108da565b90509250929050565b5f5f5f5f60808587031215610a32575f5ffd5b610a3b856108da565b9350610a49602086016108da565b93969395505050506040820135916060013590565b600181811c90821680610a7257607f821691505b602082108103610a9057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102e357634e487b7160e01b5f52601160045260245ffdfe9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900a26469706673582212200607f8db706b390a57c53d0e83253d3fae59645d89702ddcceeaec5c8059481364736f6c634300081f0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106100a4575f3560e01c8063426a84931161006e578063426a84931461017e5780634e41a1fb14610191578063558a7297146101a4578063598af9e7146101b7578063b6363cf2146101ca578063fe99049a146101dd575f5ffd5b8062ad800c146100a8578062fdd58e146100d157806301ffc9a7146100f2578063095bcdb6146101155780633f47e66214610128575b5f5ffd5b6100bb6100b636600461088e565b6101f0565b6040516100c891906108a5565b60405180910390f35b6100e46100df3660046108f5565b6102b3565b6040519081526020016100c8565b61010561010036600461091d565b6102e9565b60405190151581526020016100c8565b61010561012336600461094b565b61030d565b61016c61013636600461088e565b5f9081527fa0651e3d105d335a33d7d04897e080112be09c416f44637d6543e5b47885f800602052604090206002015460ff1690565b60405160ff90911681526020016100c8565b61010561018c36600461094b565b610324565b6100bb61019f36600461088e565b610331565b6101056101b236600461097b565b610373565b6100e46101c53660046109b4565b610388565b6101056101d83660046109ee565b6103d8565b6101056101eb366004610a1f565b610424565b5f8181527fa0651e3d105d335a33d7d04897e080112be09c416f44637d6543e5b47885f800602081905260409091208054606092919061022f90610a5e565b80601f016020809104026020016040519081016040528092919081815260200182805461025b90610a5e565b80156102a65780601f1061027d576101008083540402835291602001916102a6565b820191905f5260205f20905b81548152906001019060200180831161028957829003601f168201915b5050505050915050919050565b6001600160a01b0382165f9081525f516020610ab65f395f51905f52602090815260408083208484529091529020545b92915050565b5f6001600160e01b031982166371abc79560e01b14806102e357506102e38261046f565b5f61031a338585856104a3565b5060019392505050565b5f61031a3385858561050c565b5f8181527fa0651e3d105d335a33d7d04897e080112be09c416f44637d6543e5b47885f800602081905260409091206001018054606092919061022f90610a5e565b5f61037f3384846105dc565b50600192915050565b6001600160a01b039283165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf902602090815260408083209490951682529283528381209181529152205490565b6001600160a01b039182165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf9016020908152604080832093909416825291909152205460ff1690565b5f336001600160a01b0386168114801590610446575061044486826103d8565b155b1561045757610457868286866106ab565b610463868686866104a3565b50600195945050505050565b5f6001600160e01b03198216630f632fb360e01b14806102e357506301ffc9a760e01b6001600160e01b03198316146102e3565b6001600160a01b0384166104d1576040516301486a4160e71b81525f60048201526024015b60405180910390fd5b6001600160a01b0383166104fa57604051630b8bbd6160e41b81525f60048201526024016104c8565b6105068484848461074d565b50505050565b5f516020610ab65f395f51905f526001600160a01b0385166105435760405163198ecd5360e31b81525f60048201526024016104c8565b6001600160a01b03841661056c57604051636f65f46560e01b81525f60048201526024016104c8565b6001600160a01b038581165f81815260028401602090815260408083209489168084529482528083208884528252918290208690559051858152869392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a45050505050565b5f516020610ab65f395f51905f526001600160a01b0384166106135760405163198ecd5360e31b81525f60048201526024016104c8565b6001600160a01b03831661063c57604051636f65f46560e01b81525f60048201526024016104c8565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350505050565b5f516020610ab65f395f51905f525f6106c5868686610388565b90505f19811015610745578281101561071157604051632c51fead60e11b81526001600160a01b03861660048201526024810182905260448101849052606481018590526084016104c8565b6001600160a01b038087165f9081526002840160209081526040808320938916835292815282822087835290522083820390555b505050505050565b5f516020610ab65f395f51905f52336001600160a01b038616156107f4576001600160a01b0386165f90815260208381526040808320878452909152902054838110156107cd576040516302c6d3fb60e61b81526001600160a01b03881660048201526024810182905260448101859052606481018690526084016104c8565b6001600160a01b0387165f9081526020848152604080832088845290915290209084900390555b6001600160a01b03851615610839576001600160a01b0385165f9081526020838152604080832087845290915281208054859290610833908490610a96565b90915550505b604080516001600160a01b03838116825260208201869052869281891692918a16917f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859910160405180910390a4505050505050565b5f6020828403121561089e575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146108f0575f5ffd5b919050565b5f5f60408385031215610906575f5ffd5b61090f836108da565b946020939093013593505050565b5f6020828403121561092d575f5ffd5b81356001600160e01b031981168114610944575f5ffd5b9392505050565b5f5f5f6060848603121561095d575f5ffd5b610966846108da565b95602085013595506040909401359392505050565b5f5f6040838503121561098c575f5ffd5b610995836108da565b9150602083013580151581146109a9575f5ffd5b809150509250929050565b5f5f5f606084860312156109c6575f5ffd5b6109cf846108da565b92506109dd602085016108da565b929592945050506040919091013590565b5f5f604083850312156109ff575f5ffd5b610a08836108da565b9150610a16602084016108da565b90509250929050565b5f5f5f5f60808587031215610a32575f5ffd5b610a3b856108da565b9350610a49602086016108da565b93969395505050506040820135916060013590565b600181811c90821680610a7257607f821691505b602082108103610a9057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102e357634e487b7160e01b5f52601160045260245ffdfe9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900a26469706673582212200607f8db706b390a57c53d0e83253d3fae59645d89702ddcceeaec5c8059481364736f6c634300081f0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909TokenSupplyUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909TokenSupplyUpgradeable.json
new file mode 100644
index 0000000..a3f1296
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909TokenSupplyUpgradeable.json
@@ -0,0 +1,454 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC6909TokenSupplyUpgradeable",
+ "sourceName": "contracts/token/ERC6909/extensions/ERC6909TokenSupplyUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "OperatorSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "isOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b506109bd8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061008f575f3560e01c8063558a729711610063578063558a729714610102578063598af9e714610115578063b6363cf214610128578063bd85b0391461013b578063fe99049a14610179575f5ffd5b8062fdd58e1461009357806301ffc9a7146100b9578063095bcdb6146100dc578063426a8493146100ef575b5f5ffd5b6100a66100a13660046107c8565b61018c565b6040519081526020015b60405180910390f35b6100cc6100c73660046107f0565b6101c2565b60405190151581526020016100b0565b6100cc6100ea36600461081e565b6101e6565b6100cc6100fd36600461081e565b6101fd565b6100cc61011036600461084e565b61020a565b6100a6610123366004610887565b61021f565b6100cc6101363660046108c1565b61026f565b6100a66101493660046108f2565b5f9081527f9cc5ac148333cfaf4365d2d67a9c6e8fab8e8f4df7b569f769d68102db719600602052604090205490565b6100cc610187366004610909565b6102bb565b6001600160a01b0382165f9081525f5160206109685f395f51905f52602090815260408083208484529091529020545b92915050565b5f6001600160e01b0319821663bd85b03960e01b14806101bc57506101bc82610306565b5f6101f33385858561033a565b5060019392505050565b5f6101f3338585856103a3565b5f610216338484610473565b50600192915050565b6001600160a01b039283165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf902602090815260408083209490951682529283528381209181529152205490565b6001600160a01b039182165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf9016020908152604080832093909416825291909152205460ff1690565b5f336001600160a01b03861681148015906102dd57506102db868261026f565b155b156102ee576102ee86828686610542565b6102fa8686868661033a565b50600195945050505050565b5f6001600160e01b03198216630f632fb360e01b14806101bc57506301ffc9a760e01b6001600160e01b03198316146101bc565b6001600160a01b038416610368576040516301486a4160e71b81525f60048201526024015b60405180910390fd5b6001600160a01b03831661039157604051630b8bbd6160e41b81525f600482015260240161035f565b61039d848484846105e4565b50505050565b5f5160206109685f395f51905f526001600160a01b0385166103da5760405163198ecd5360e31b81525f600482015260240161035f565b6001600160a01b03841661040357604051636f65f46560e01b81525f600482015260240161035f565b6001600160a01b038581165f81815260028401602090815260408083209489168084529482528083208884528252918290208690559051858152869392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a45050505050565b5f5160206109685f395f51905f526001600160a01b0384166104aa5760405163198ecd5360e31b81525f600482015260240161035f565b6001600160a01b0383166104d357604051636f65f46560e01b81525f600482015260240161035f565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350505050565b5f5160206109685f395f51905f525f61055c86868661021f565b90505f198110156105dc57828110156105a857604051632c51fead60e11b81526001600160a01b038616600482015260248101829052604481018490526064810185905260840161035f565b6001600160a01b038087165f9081526002840160209081526040808320938916835292815282822087835290522083820390555b505050505050565b7f9cc5ac148333cfaf4365d2d67a9c6e8fab8e8f4df7b569f769d68102db7196006106118585858561066c565b6001600160a01b038516610642575f838152602082905260408120805484929061063c908490610948565b90915550505b6001600160a01b038416610665575f838152602082905260409020805483900390555b5050505050565b5f5160206109685f395f51905f52336001600160a01b03861615610713576001600160a01b0386165f90815260208381526040808320878452909152902054838110156106ec576040516302c6d3fb60e61b81526001600160a01b038816600482015260248101829052604481018590526064810186905260840161035f565b6001600160a01b0387165f9081526020848152604080832088845290915290209084900390555b6001600160a01b03851615610758576001600160a01b0385165f9081526020838152604080832087845290915281208054859290610752908490610948565b90915550505b604080516001600160a01b03838116825260208201869052869281891692918a16917f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859910160405180910390a4505050505050565b80356001600160a01b03811681146107c3575f5ffd5b919050565b5f5f604083850312156107d9575f5ffd5b6107e2836107ad565b946020939093013593505050565b5f60208284031215610800575f5ffd5b81356001600160e01b031981168114610817575f5ffd5b9392505050565b5f5f5f60608486031215610830575f5ffd5b610839846107ad565b95602085013595506040909401359392505050565b5f5f6040838503121561085f575f5ffd5b610868836107ad565b91506020830135801515811461087c575f5ffd5b809150509250929050565b5f5f5f60608486031215610899575f5ffd5b6108a2846107ad565b92506108b0602085016107ad565b929592945050506040919091013590565b5f5f604083850312156108d2575f5ffd5b6108db836107ad565b91506108e9602084016107ad565b90509250929050565b5f60208284031215610902575f5ffd5b5035919050565b5f5f5f5f6080858703121561091c575f5ffd5b610925856107ad565b9350610933602086016107ad565b93969395505050506040820135916060013590565b808201808211156101bc57634e487b7160e01b5f52601160045260245ffdfe9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900a2646970667358221220ac658756f88029ac899646c4ef322a01389a89fdfe39f387ddf13464d385795e64736f6c634300081f0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061008f575f3560e01c8063558a729711610063578063558a729714610102578063598af9e714610115578063b6363cf214610128578063bd85b0391461013b578063fe99049a14610179575f5ffd5b8062fdd58e1461009357806301ffc9a7146100b9578063095bcdb6146100dc578063426a8493146100ef575b5f5ffd5b6100a66100a13660046107c8565b61018c565b6040519081526020015b60405180910390f35b6100cc6100c73660046107f0565b6101c2565b60405190151581526020016100b0565b6100cc6100ea36600461081e565b6101e6565b6100cc6100fd36600461081e565b6101fd565b6100cc61011036600461084e565b61020a565b6100a6610123366004610887565b61021f565b6100cc6101363660046108c1565b61026f565b6100a66101493660046108f2565b5f9081527f9cc5ac148333cfaf4365d2d67a9c6e8fab8e8f4df7b569f769d68102db719600602052604090205490565b6100cc610187366004610909565b6102bb565b6001600160a01b0382165f9081525f5160206109685f395f51905f52602090815260408083208484529091529020545b92915050565b5f6001600160e01b0319821663bd85b03960e01b14806101bc57506101bc82610306565b5f6101f33385858561033a565b5060019392505050565b5f6101f3338585856103a3565b5f610216338484610473565b50600192915050565b6001600160a01b039283165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf902602090815260408083209490951682529283528381209181529152205490565b6001600160a01b039182165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf9016020908152604080832093909416825291909152205460ff1690565b5f336001600160a01b03861681148015906102dd57506102db868261026f565b155b156102ee576102ee86828686610542565b6102fa8686868661033a565b50600195945050505050565b5f6001600160e01b03198216630f632fb360e01b14806101bc57506301ffc9a760e01b6001600160e01b03198316146101bc565b6001600160a01b038416610368576040516301486a4160e71b81525f60048201526024015b60405180910390fd5b6001600160a01b03831661039157604051630b8bbd6160e41b81525f600482015260240161035f565b61039d848484846105e4565b50505050565b5f5160206109685f395f51905f526001600160a01b0385166103da5760405163198ecd5360e31b81525f600482015260240161035f565b6001600160a01b03841661040357604051636f65f46560e01b81525f600482015260240161035f565b6001600160a01b038581165f81815260028401602090815260408083209489168084529482528083208884528252918290208690559051858152869392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a45050505050565b5f5160206109685f395f51905f526001600160a01b0384166104aa5760405163198ecd5360e31b81525f600482015260240161035f565b6001600160a01b0383166104d357604051636f65f46560e01b81525f600482015260240161035f565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350505050565b5f5160206109685f395f51905f525f61055c86868661021f565b90505f198110156105dc57828110156105a857604051632c51fead60e11b81526001600160a01b038616600482015260248101829052604481018490526064810185905260840161035f565b6001600160a01b038087165f9081526002840160209081526040808320938916835292815282822087835290522083820390555b505050505050565b7f9cc5ac148333cfaf4365d2d67a9c6e8fab8e8f4df7b569f769d68102db7196006106118585858561066c565b6001600160a01b038516610642575f838152602082905260408120805484929061063c908490610948565b90915550505b6001600160a01b038416610665575f838152602082905260409020805483900390555b5050505050565b5f5160206109685f395f51905f52336001600160a01b03861615610713576001600160a01b0386165f90815260208381526040808320878452909152902054838110156106ec576040516302c6d3fb60e61b81526001600160a01b038816600482015260248101829052604481018590526064810186905260840161035f565b6001600160a01b0387165f9081526020848152604080832088845290915290209084900390555b6001600160a01b03851615610758576001600160a01b0385165f9081526020838152604080832087845290915281208054859290610752908490610948565b90915550505b604080516001600160a01b03838116825260208201869052869281891692918a16917f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859910160405180910390a4505050505050565b80356001600160a01b03811681146107c3575f5ffd5b919050565b5f5f604083850312156107d9575f5ffd5b6107e2836107ad565b946020939093013593505050565b5f60208284031215610800575f5ffd5b81356001600160e01b031981168114610817575f5ffd5b9392505050565b5f5f5f60608486031215610830575f5ffd5b610839846107ad565b95602085013595506040909401359392505050565b5f5f6040838503121561085f575f5ffd5b610868836107ad565b91506020830135801515811461087c575f5ffd5b809150509250929050565b5f5f5f60608486031215610899575f5ffd5b6108a2846107ad565b92506108b0602085016107ad565b929592945050506040919091013590565b5f5f604083850312156108d2575f5ffd5b6108db836107ad565b91506108e9602084016107ad565b90509250929050565b5f60208284031215610902575f5ffd5b5035919050565b5f5f5f5f6080858703121561091c575f5ffd5b610925856107ad565b9350610933602086016107ad565b93969395505050506040820135916060013590565b808201808211156101bc57634e487b7160e01b5f52601160045260245ffdfe9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900a2646970667358221220ac658756f88029ac899646c4ef322a01389a89fdfe39f387ddf13464d385795e64736f6c634300081f0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909Upgradeable.json
new file mode 100644
index 0000000..0c3b3cc
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC6909Upgradeable.json
@@ -0,0 +1,435 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC6909Upgradeable",
+ "sourceName": "contracts/token/ERC6909/ERC6909Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "OperatorSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "isOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b506108b18061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610084575f3560e01c8063558a729711610058578063558a7297146100f7578063598af9e71461010a578063b6363cf21461011d578063fe99049a14610130575f5ffd5b8062fdd58e1461008857806301ffc9a7146100ae578063095bcdb6146100d1578063426a8493146100e4575b5f5ffd5b61009b6100963660046106d3565b610143565b6040519081526020015b60405180910390f35b6100c16100bc3660046106fb565b610179565b60405190151581526020016100a5565b6100c16100df366004610729565b6101ad565b6100c16100f2366004610729565b6101c4565b6100c1610105366004610759565b6101d1565b61009b610118366004610792565b6101e6565b6100c161012b3660046107cc565b610236565b6100c161013e3660046107fd565b610282565b6001600160a01b0382165f9081525f51602061085c5f395f51905f52602090815260408083208484529091529020545b92915050565b5f6001600160e01b03198216630f632fb360e01b148061017357506301ffc9a760e01b6001600160e01b0319831614610173565b5f6101ba338585856102cd565b5060019392505050565b5f6101ba33858585610336565b5f6101dd338484610406565b50600192915050565b6001600160a01b039283165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf902602090815260408083209490951682529283528381209181529152205490565b6001600160a01b039182165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf9016020908152604080832093909416825291909152205460ff1690565b5f336001600160a01b03861681148015906102a457506102a28682610236565b155b156102b5576102b5868286866104d5565b6102c1868686866102cd565b50600195945050505050565b6001600160a01b0384166102fb576040516301486a4160e71b81525f60048201526024015b60405180910390fd5b6001600160a01b03831661032457604051630b8bbd6160e41b81525f60048201526024016102f2565b61033084848484610577565b50505050565b5f51602061085c5f395f51905f526001600160a01b03851661036d5760405163198ecd5360e31b81525f60048201526024016102f2565b6001600160a01b03841661039657604051636f65f46560e01b81525f60048201526024016102f2565b6001600160a01b038581165f81815260028401602090815260408083209489168084529482528083208884528252918290208690559051858152869392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a45050505050565b5f51602061085c5f395f51905f526001600160a01b03841661043d5760405163198ecd5360e31b81525f60048201526024016102f2565b6001600160a01b03831661046657604051636f65f46560e01b81525f60048201526024016102f2565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350505050565b5f51602061085c5f395f51905f525f6104ef8686866101e6565b90505f1981101561056f578281101561053b57604051632c51fead60e11b81526001600160a01b03861660048201526024810182905260448101849052606481018590526084016102f2565b6001600160a01b038087165f9081526002840160209081526040808320938916835292815282822087835290522083820390555b505050505050565b5f51602061085c5f395f51905f52336001600160a01b0386161561061e576001600160a01b0386165f90815260208381526040808320878452909152902054838110156105f7576040516302c6d3fb60e61b81526001600160a01b03881660048201526024810182905260448101859052606481018690526084016102f2565b6001600160a01b0387165f9081526020848152604080832088845290915290209084900390555b6001600160a01b03851615610663576001600160a01b0385165f908152602083815260408083208784529091528120805485929061065d90849061083c565b90915550505b604080516001600160a01b03838116825260208201869052869281891692918a16917f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859910160405180910390a4505050505050565b80356001600160a01b03811681146106ce575f5ffd5b919050565b5f5f604083850312156106e4575f5ffd5b6106ed836106b8565b946020939093013593505050565b5f6020828403121561070b575f5ffd5b81356001600160e01b031981168114610722575f5ffd5b9392505050565b5f5f5f6060848603121561073b575f5ffd5b610744846106b8565b95602085013595506040909401359392505050565b5f5f6040838503121561076a575f5ffd5b610773836106b8565b915060208301358015158114610787575f5ffd5b809150509250929050565b5f5f5f606084860312156107a4575f5ffd5b6107ad846106b8565b92506107bb602085016106b8565b929592945050506040919091013590565b5f5f604083850312156107dd575f5ffd5b6107e6836106b8565b91506107f4602084016106b8565b90509250929050565b5f5f5f5f60808587031215610810575f5ffd5b610819856106b8565b9350610827602086016106b8565b93969395505050506040820135916060013590565b8082018082111561017357634e487b7160e01b5f52601160045260245ffdfe9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900a26469706673582212205859bfafe70af6cca4a6d62b18b4935760f1bf2905c05d030eb539f782e5886c64736f6c634300081f0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610084575f3560e01c8063558a729711610058578063558a7297146100f7578063598af9e71461010a578063b6363cf21461011d578063fe99049a14610130575f5ffd5b8062fdd58e1461008857806301ffc9a7146100ae578063095bcdb6146100d1578063426a8493146100e4575b5f5ffd5b61009b6100963660046106d3565b610143565b6040519081526020015b60405180910390f35b6100c16100bc3660046106fb565b610179565b60405190151581526020016100a5565b6100c16100df366004610729565b6101ad565b6100c16100f2366004610729565b6101c4565b6100c1610105366004610759565b6101d1565b61009b610118366004610792565b6101e6565b6100c161012b3660046107cc565b610236565b6100c161013e3660046107fd565b610282565b6001600160a01b0382165f9081525f51602061085c5f395f51905f52602090815260408083208484529091529020545b92915050565b5f6001600160e01b03198216630f632fb360e01b148061017357506301ffc9a760e01b6001600160e01b0319831614610173565b5f6101ba338585856102cd565b5060019392505050565b5f6101ba33858585610336565b5f6101dd338484610406565b50600192915050565b6001600160a01b039283165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf902602090815260408083209490951682529283528381209181529152205490565b6001600160a01b039182165f9081527f9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf9016020908152604080832093909416825291909152205460ff1690565b5f336001600160a01b03861681148015906102a457506102a28682610236565b155b156102b5576102b5868286866104d5565b6102c1868686866102cd565b50600195945050505050565b6001600160a01b0384166102fb576040516301486a4160e71b81525f60048201526024015b60405180910390fd5b6001600160a01b03831661032457604051630b8bbd6160e41b81525f60048201526024016102f2565b61033084848484610577565b50505050565b5f51602061085c5f395f51905f526001600160a01b03851661036d5760405163198ecd5360e31b81525f60048201526024016102f2565b6001600160a01b03841661039657604051636f65f46560e01b81525f60048201526024016102f2565b6001600160a01b038581165f81815260028401602090815260408083209489168084529482528083208884528252918290208690559051858152869392917fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7910160405180910390a45050505050565b5f51602061085c5f395f51905f526001600160a01b03841661043d5760405163198ecd5360e31b81525f60048201526024016102f2565b6001600160a01b03831661046657604051636f65f46560e01b81525f60048201526024016102f2565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350505050565b5f51602061085c5f395f51905f525f6104ef8686866101e6565b90505f1981101561056f578281101561053b57604051632c51fead60e11b81526001600160a01b03861660048201526024810182905260448101849052606481018590526084016102f2565b6001600160a01b038087165f9081526002840160209081526040808320938916835292815282822087835290522083820390555b505050505050565b5f51602061085c5f395f51905f52336001600160a01b0386161561061e576001600160a01b0386165f90815260208381526040808320878452909152902054838110156105f7576040516302c6d3fb60e61b81526001600160a01b03881660048201526024810182905260448101859052606481018690526084016102f2565b6001600160a01b0387165f9081526020848152604080832088845290915290209084900390555b6001600160a01b03851615610663576001600160a01b0385165f908152602083815260408083208784529091528120805485929061065d90849061083c565b90915550505b604080516001600160a01b03838116825260208201869052869281891692918a16917f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859910160405180910390a4505050505050565b80356001600160a01b03811681146106ce575f5ffd5b919050565b5f5f604083850312156106e4575f5ffd5b6106ed836106b8565b946020939093013593505050565b5f6020828403121561070b575f5ffd5b81356001600160e01b031981168114610722575f5ffd5b9392505050565b5f5f5f6060848603121561073b575f5ffd5b610744846106b8565b95602085013595506040909401359392505050565b5f5f6040838503121561076a575f5ffd5b610773836106b8565b915060208301358015158114610787575f5ffd5b809150509250929050565b5f5f5f606084860312156107a4575f5ffd5b6107ad846106b8565b92506107bb602085016106b8565b929592945050506040919091013590565b5f5f604083850312156107dd575f5ffd5b6107e6836106b8565b91506107f4602084016106b8565b90509250929050565b5f5f5f5f60808587031215610810575f5ffd5b610819856106b8565b9350610827602086016106b8565b93969395505050506040820135916060013590565b8082018082111561017357634e487b7160e01b5f52601160045260245ffdfe9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900a26469706673582212205859bfafe70af6cca4a6d62b18b4935760f1bf2905c05d030eb539f782e5886c64736f6c634300081f0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721BurnableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721BurnableUpgradeable.json
new file mode 100644
index 0000000..a1b1f6b
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721BurnableUpgradeable.json
@@ -0,0 +1,480 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721BurnableUpgradeable",
+ "sourceName": "contracts/token/ERC721/extensions/ERC721BurnableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "burn",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721ConsecutiveUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721ConsecutiveUpgradeable.json
new file mode 100644
index 0000000..6ee2a64
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721ConsecutiveUpgradeable.json
@@ -0,0 +1,529 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721ConsecutiveUpgradeable",
+ "sourceName": "contracts/token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "batchSize",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxBatch",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721ExceededMaxBatchMint",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC721ForbiddenBatchBurn",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC721ForbiddenBatchMint",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC721ForbiddenMint",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "fromTokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "toTokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "fromAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "toAddress",
+ "type": "address"
+ }
+ ],
+ "name": "ConsecutiveTransfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721EnumerableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721EnumerableUpgradeable.json
new file mode 100644
index 0000000..4ecabc9
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721EnumerableUpgradeable.json
@@ -0,0 +1,544 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721EnumerableUpgradeable",
+ "sourceName": "contracts/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "ERC721EnumerableForbiddenBatchMint",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721OutOfBoundsIndex",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenByIndex",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenOfOwnerByIndex",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721PausableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721PausableUpgradeable.json
new file mode 100644
index 0000000..95bdc33
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721PausableUpgradeable.json
@@ -0,0 +1,516 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721PausableUpgradeable",
+ "sourceName": "contracts/token/ERC721/extensions/ERC721PausableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EnforcedPause",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ExpectedPause",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Paused",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Unpaused",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "paused",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721RoyaltyUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721RoyaltyUpgradeable.json
new file mode 100644
index 0000000..cb1d14c
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721RoyaltyUpgradeable.json
@@ -0,0 +1,560 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721RoyaltyUpgradeable",
+ "sourceName": "contracts/token/ERC721/extensions/ERC721RoyaltyUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "numerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "denominator",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC2981InvalidDefaultRoyalty",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC2981InvalidDefaultRoyaltyReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "numerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "denominator",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC2981InvalidTokenRoyalty",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC2981InvalidTokenRoyaltyReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "salePrice",
+ "type": "uint256"
+ }
+ ],
+ "name": "royaltyInfo",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721URIStorageUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721URIStorageUpgradeable.json
new file mode 100644
index 0000000..cdef746
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721URIStorageUpgradeable.json
@@ -0,0 +1,499 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721URIStorageUpgradeable",
+ "sourceName": "contracts/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_fromTokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_toTokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "BatchMetadataUpdate",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "MetadataUpdate",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721Upgradeable.json
new file mode 100644
index 0000000..eb58473
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721Upgradeable.json
@@ -0,0 +1,467 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721Upgradeable",
+ "sourceName": "contracts/token/ERC721/ERC721Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721VotesUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721VotesUpgradeable.json
new file mode 100644
index 0000000..26973f9
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721VotesUpgradeable.json
@@ -0,0 +1,839 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721VotesUpgradeable",
+ "sourceName": "contracts/token/ERC721/extensions/ERC721VotesUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "CheckpointUnorderedInsertion",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ECDSAInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "length",
+ "type": "uint256"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureS",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "clock",
+ "type": "uint48"
+ }
+ ],
+ "name": "ERC5805FutureLookup",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC6372InconsistentClock",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "expiry",
+ "type": "uint256"
+ }
+ ],
+ "name": "VotesExpiredSignature",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "fromDelegate",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "toDelegate",
+ "type": "address"
+ }
+ ],
+ "name": "DelegateChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegate",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "previousVotes",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newVotes",
+ "type": "uint256"
+ }
+ ],
+ "name": "DelegateVotesChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "delegatee",
+ "type": "address"
+ }
+ ],
+ "name": "delegate",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "delegatee",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "expiry",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "v",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "r",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "delegateBySig",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "delegates",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastTotalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721WrapperUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721WrapperUpgradeable.json
new file mode 100644
index 0000000..cf71a10
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC721WrapperUpgradeable.json
@@ -0,0 +1,573 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC721WrapperUpgradeable",
+ "sourceName": "contracts/token/ERC721/extensions/ERC721WrapperUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721IncorrectOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721InsufficientApproval",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOperator",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC721NonexistentToken",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "ERC721UnsupportedToken",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "tokenIds",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "depositFor",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "underlying",
+ "outputs": [
+ {
+ "internalType": "contract IERC721",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "tokenIds",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC7739Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC7739Upgradeable.json
new file mode 100644
index 0000000..8fc141f
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/ERC7739Upgradeable.json
@@ -0,0 +1,107 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "ERC7739Upgradeable",
+ "sourceName": "contracts/utils/cryptography/signers/draft-ERC7739Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "result",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingFractionalUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingFractionalUpgradeable.json
new file mode 100644
index 0000000..6fe4120
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingFractionalUpgradeable.json
@@ -0,0 +1,1453 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorCountingFractionalUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorCountingFractionalUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "usedVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "remainingWeight",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorExceedRemainingWeight",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "againstVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "forVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "abstainVotes",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "usedVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingOverridableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingOverridableUpgradeable.json
new file mode 100644
index 0000000..1a0a3ab
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingOverridableUpgradeable.json
@@ -0,0 +1,1605 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorCountingOverridableUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorCountingOverridableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyOverriddenVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "OverrideVoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegate",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ }
+ ],
+ "name": "VoteReduced",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "OVERRIDE_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castOverrideVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castOverrideVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVotedOverride",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "againstVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "forVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "abstainVotes",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "token",
+ "outputs": [
+ {
+ "internalType": "contract IERC5805",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingSimpleUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingSimpleUpgradeable.json
new file mode 100644
index 0000000..e70b7c5
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorCountingSimpleUpgradeable.json
@@ -0,0 +1,1408 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorCountingSimpleUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorCountingSimpleUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "againstVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "forVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "abstainVotes",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorNoncesKeyedUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorNoncesKeyedUpgradeable.json
new file mode 100644
index 0000000..9930de8
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorNoncesKeyedUpgradeable.json
@@ -0,0 +1,1403 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorNoncesKeyedUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorNoncesKeyedUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorPreventLateQuorumUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorPreventLateQuorumUpgradeable.json
new file mode 100644
index 0000000..07c8acc
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorPreventLateQuorumUpgradeable.json
@@ -0,0 +1,1443 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorPreventLateQuorumUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorPreventLateQuorumUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "oldVoteExtension",
+ "type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "newVoteExtension",
+ "type": "uint64"
+ }
+ ],
+ "name": "LateQuorumVoteExtensionSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "extendedDeadline",
+ "type": "uint64"
+ }
+ ],
+ "name": "ProposalExtended",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "lateQuorumVoteExtension",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint48",
+ "name": "newVoteExtension",
+ "type": "uint48"
+ }
+ ],
+ "name": "setLateQuorumVoteExtension",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorProposalGuardianUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorProposalGuardianUpgradeable.json
new file mode 100644
index 0000000..3232851
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorProposalGuardianUpgradeable.json
@@ -0,0 +1,1424 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorProposalGuardianUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorProposalGuardianUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "oldProposalGuardian",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newProposalGuardian",
+ "type": "address"
+ }
+ ],
+ "name": "ProposalGuardianSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalGuardian",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newProposalGuardian",
+ "type": "address"
+ }
+ ],
+ "name": "setProposalGuardian",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSequentialProposalIdUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSequentialProposalIdUpgradeable.json
new file mode 100644
index 0000000..61ff49d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSequentialProposalIdUpgradeable.json
@@ -0,0 +1,1397 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorSequentialProposalIdUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorSequentialProposalIdUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorAlreadyInitializedLatestProposalId",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "latestProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSettingsUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSettingsUpgradeable.json
new file mode 100644
index 0000000..d16df9b
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSettingsUpgradeable.json
@@ -0,0 +1,1475 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorSettingsUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorSettingsUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "oldProposalThreshold",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newProposalThreshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalThresholdSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "oldVotingDelay",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newVotingDelay",
+ "type": "uint256"
+ }
+ ],
+ "name": "VotingDelaySet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "oldVotingPeriod",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newVotingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "VotingPeriodSet",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newProposalThreshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "setProposalThreshold",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint48",
+ "name": "newVotingDelay",
+ "type": "uint48"
+ }
+ ],
+ "name": "setVotingDelay",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "newVotingPeriod",
+ "type": "uint32"
+ }
+ ],
+ "name": "setVotingPeriod",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorStorageUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorStorageUpgradeable.json
new file mode 100644
index 0000000..9317b03
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorStorageUpgradeable.json
@@ -0,0 +1,1504 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorStorageUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorStorageUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "execute",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalCount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDetails",
+ "outputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDetailsAt",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "queue",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSuperQuorumUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSuperQuorumUpgradeable.json
new file mode 100644
index 0000000..ec51873
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorSuperQuorumUpgradeable.json
@@ -0,0 +1,1427 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorSuperQuorumUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorSuperQuorumUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "againstVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "forVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "abstainVotes",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "superQuorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockAccessUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockAccessUpgradeable.json
new file mode 100644
index 0000000..4024c2d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockAccessUpgradeable.json
@@ -0,0 +1,1580 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorTimelockAccessUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorTimelockAccessUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorLockedIgnore",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "expectedNonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "actualNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorMismatchedNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "neededTimestamp",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorUnmetDelay",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "ignored",
+ "type": "bool"
+ }
+ ],
+ "name": "AccessManagerIgnoredSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "oldBaseDelaySeconds",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "newBaseDelaySeconds",
+ "type": "uint32"
+ }
+ ],
+ "name": "BaseDelaySet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "accessManager",
+ "outputs": [
+ {
+ "internalType": "contract IAccessManager",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "baseDelaySeconds",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ }
+ ],
+ "name": "isAccessManagerIgnored",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalExecutionPlan",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "delay",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bool[]",
+ "name": "indirect",
+ "type": "bool[]"
+ },
+ {
+ "internalType": "bool[]",
+ "name": "withDelay",
+ "type": "bool[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes4[]",
+ "name": "selectors",
+ "type": "bytes4[]"
+ },
+ {
+ "internalType": "bool",
+ "name": "ignored",
+ "type": "bool"
+ }
+ ],
+ "name": "setAccessManagerIgnored",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "newBaseDelay",
+ "type": "uint32"
+ }
+ ],
+ "name": "setBaseDelaySeconds",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockCompoundUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockCompoundUpgradeable.json
new file mode 100644
index 0000000..005f988
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockCompoundUpgradeable.json
@@ -0,0 +1,1447 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorTimelockCompoundUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorTimelockCompoundUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "oldTimelock",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newTimelock",
+ "type": "address"
+ }
+ ],
+ "name": "TimelockChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "__acceptAdmin",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "timelock",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "contract ICompoundTimelock",
+ "name": "newTimelock",
+ "type": "address"
+ }
+ ],
+ "name": "updateTimelock",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockControlUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockControlUpgradeable.json
new file mode 100644
index 0000000..3946aea
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorTimelockControlUpgradeable.json
@@ -0,0 +1,1424 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorTimelockControlUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorTimelockControlUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "oldTimelock",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newTimelock",
+ "type": "address"
+ }
+ ],
+ "name": "TimelockChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "timelock",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "contract TimelockControllerUpgradeable",
+ "name": "newTimelock",
+ "type": "address"
+ }
+ ],
+ "name": "updateTimelock",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorUpgradeable.json
new file mode 100644
index 0000000..7fc7fdb
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorUpgradeable.json
@@ -0,0 +1,1379 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorUpgradeable",
+ "sourceName": "contracts/governance/GovernorUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesQuorumFractionUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesQuorumFractionUpgradeable.json
new file mode 100644
index 0000000..9208ce4
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesQuorumFractionUpgradeable.json
@@ -0,0 +1,1490 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorVotesQuorumFractionUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "CheckpointUnorderedInsertion",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "quorumNumerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "quorumDenominator",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidQuorumFraction",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "oldQuorumNumerator",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newQuorumNumerator",
+ "type": "uint256"
+ }
+ ],
+ "name": "QuorumNumeratorUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "quorumDenominator",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorumNumerator",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "quorumNumerator",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "token",
+ "outputs": [
+ {
+ "internalType": "contract IERC5805",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newQuorumNumerator",
+ "type": "uint256"
+ }
+ ],
+ "name": "updateQuorumNumerator",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesSuperQuorumFractionUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesSuperQuorumFractionUpgradeable.json
new file mode 100644
index 0000000..307b5d7
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesSuperQuorumFractionUpgradeable.json
@@ -0,0 +1,1650 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorVotesSuperQuorumFractionUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorVotesSuperQuorumFractionUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "CheckpointUnorderedInsertion",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "quorumNumerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "quorumDenominator",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidQuorumFraction",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "quorumNumerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "superQuorumNumerator",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidQuorumTooLarge",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "superQuorumNumerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "denominator",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidSuperQuorumFraction",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "superQuorumNumerator",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "quorumNumerator",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidSuperQuorumTooSmall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "oldQuorumNumerator",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newQuorumNumerator",
+ "type": "uint256"
+ }
+ ],
+ "name": "QuorumNumeratorUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "oldSuperQuorumNumerator",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newSuperQuorumNumerator",
+ "type": "uint256"
+ }
+ ],
+ "name": "SuperQuorumNumeratorUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "againstVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "forVotes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "abstainVotes",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "quorumDenominator",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorumNumerator",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "quorumNumerator",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "superQuorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "superQuorumNumerator",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "superQuorumNumerator",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "token",
+ "outputs": [
+ {
+ "internalType": "contract IERC5805",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newQuorumNumerator",
+ "type": "uint256"
+ }
+ ],
+ "name": "updateQuorumNumerator",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newSuperQuorumNumerator",
+ "type": "uint256"
+ }
+ ],
+ "name": "updateSuperQuorumNumerator",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesUpgradeable.json
new file mode 100644
index 0000000..44e1fff
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/GovernorVotesUpgradeable.json
@@ -0,0 +1,1392 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GovernorVotesUpgradeable",
+ "sourceName": "contracts/governance/extensions/GovernorVotesUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorAlreadyCastVote",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorAlreadyQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorDisabledDeposit",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "votes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "threshold",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInsufficientProposerVotes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "calldatas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidProposalLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorInvalidVoteType",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "votingPeriod",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorInvalidVotingPeriod",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNonexistentProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "GovernorNotQueuedProposal",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorOnlyExecutor",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GovernorQueueNotImplemented",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorRestrictedProposer",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "GovernorUnableToCancel",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "current",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "GovernorUnexpectedProposalState",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "proposer",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "signatures",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteStart",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "voteEnd",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "ProposalCreated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "etaSeconds",
+ "type": "uint256"
+ }
+ ],
+ "name": "ProposalQueued",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "VoteCast",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "weight",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "VoteCastWithParams",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "COUNTING_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXTENDED_BALLOT_TYPEHASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ }
+ ],
+ "name": "castVote",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "castVoteWithReason",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "support",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "castVoteWithReasonAndParamsBySig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getProposalId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "params",
+ "type": "bytes"
+ }
+ ],
+ "name": "getVotesWithParams",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasVoted",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashProposal",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalDeadline",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalEta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalNeedsQueuing",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalProposer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "proposalSnapshot",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "proposalThreshold",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "name": "propose",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "calldatas",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "descriptionHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "queue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "quorum",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "relay",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "proposalId",
+ "type": "uint256"
+ }
+ ],
+ "name": "state",
+ "outputs": [
+ {
+ "internalType": "enum IGovernor.ProposalState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "token",
+ "outputs": [
+ {
+ "internalType": "contract IERC5805",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "votingPeriod",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/MultiSignerERC7913Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/MultiSignerERC7913Upgradeable.json
new file mode 100644
index 0000000..8ee984d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/MultiSignerERC7913Upgradeable.json
@@ -0,0 +1,196 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "MultiSignerERC7913Upgradeable",
+ "sourceName": "contracts/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "MultiSignerERC7913AlreadyExists",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "MultiSignerERC7913InvalidSigner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "MultiSignerERC7913NonexistentSigner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "signers",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "threshold",
+ "type": "uint64"
+ }
+ ],
+ "name": "MultiSignerERC7913UnreachableThreshold",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MultiSignerERC7913ZeroThreshold",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes",
+ "name": "signers",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7913SignerAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes",
+ "name": "signers",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7913SignerRemoved",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "threshold",
+ "type": "uint64"
+ }
+ ],
+ "name": "ERC7913ThresholdSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "getSignerCount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "start",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "end",
+ "type": "uint64"
+ }
+ ],
+ "name": "getSigners",
+ "outputs": [
+ {
+ "internalType": "bytes[]",
+ "name": "",
+ "type": "bytes[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "isSigner",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "threshold",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/MultiSignerERC7913WeightedUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/MultiSignerERC7913WeightedUpgradeable.json
new file mode 100644
index 0000000..f0eb1cb
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/MultiSignerERC7913WeightedUpgradeable.json
@@ -0,0 +1,284 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "MultiSignerERC7913WeightedUpgradeable",
+ "sourceName": "contracts/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "MultiSignerERC7913AlreadyExists",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "MultiSignerERC7913InvalidSigner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "MultiSignerERC7913NonexistentSigner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "signers",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "threshold",
+ "type": "uint64"
+ }
+ ],
+ "name": "MultiSignerERC7913UnreachableThreshold",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint64",
+ "name": "weight",
+ "type": "uint64"
+ }
+ ],
+ "name": "MultiSignerERC7913WeightedInvalidWeight",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MultiSignerERC7913WeightedMismatchedLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MultiSignerERC7913ZeroThreshold",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes",
+ "name": "signers",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7913SignerAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes",
+ "name": "signers",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC7913SignerRemoved",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "weight",
+ "type": "uint64"
+ }
+ ],
+ "name": "ERC7913SignerWeightChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "threshold",
+ "type": "uint64"
+ }
+ ],
+ "name": "ERC7913ThresholdSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "getSignerCount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "start",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "end",
+ "type": "uint64"
+ }
+ ],
+ "name": "getSigners",
+ "outputs": [
+ {
+ "internalType": "bytes[]",
+ "name": "",
+ "type": "bytes[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "isSigner",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "signer",
+ "type": "bytes"
+ }
+ ],
+ "name": "signerWeight",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "threshold",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalWeight",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/MulticallUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/MulticallUpgradeable.json
new file mode 100644
index 0000000..30a886f
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/MulticallUpgradeable.json
@@ -0,0 +1,69 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "MulticallUpgradeable",
+ "sourceName": "contracts/utils/MulticallUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes[]",
+ "name": "data",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "multicall",
+ "outputs": [
+ {
+ "internalType": "bytes[]",
+ "name": "results",
+ "type": "bytes[]"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/NoncesKeyedUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/NoncesKeyedUpgradeable.json
new file mode 100644
index 0000000..0472619
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/NoncesKeyedUpgradeable.json
@@ -0,0 +1,93 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "NoncesKeyedUpgradeable",
+ "sourceName": "contracts/utils/NoncesKeyedUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/NoncesUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/NoncesUpgradeable.json
new file mode 100644
index 0000000..ce57d8a
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/NoncesUpgradeable.json
@@ -0,0 +1,69 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "NoncesUpgradeable",
+ "sourceName": "contracts/utils/NoncesUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/Ownable2StepUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/Ownable2StepUpgradeable.json
new file mode 100644
index 0000000..074253e
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/Ownable2StepUpgradeable.json
@@ -0,0 +1,147 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "Ownable2StepUpgradeable",
+ "sourceName": "contracts/access/Ownable2StepUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableInvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferStarted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "acceptOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "pendingOwner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/OwnableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/OwnableUpgradeable.json
new file mode 100644
index 0000000..24a2389
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/OwnableUpgradeable.json
@@ -0,0 +1,108 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "OwnableUpgradeable",
+ "sourceName": "contracts/access/OwnableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableInvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/PausableUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/PausableUpgradeable.json
new file mode 100644
index 0000000..65b19fb
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/PausableUpgradeable.json
@@ -0,0 +1,83 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "PausableUpgradeable",
+ "sourceName": "contracts/utils/PausableUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "EnforcedPause",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ExpectedPause",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Paused",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Unpaused",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "paused",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerECDSAUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerECDSAUpgradeable.json
new file mode 100644
index 0000000..8735913
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerECDSAUpgradeable.json
@@ -0,0 +1,47 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "SignerECDSAUpgradeable",
+ "sourceName": "contracts/utils/cryptography/signers/SignerECDSAUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "signer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerERC7913Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerERC7913Upgradeable.json
new file mode 100644
index 0000000..1dc92fa
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerERC7913Upgradeable.json
@@ -0,0 +1,47 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "SignerERC7913Upgradeable",
+ "sourceName": "contracts/utils/cryptography/signers/SignerERC7913Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "signer",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerP256Upgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerP256Upgradeable.json
new file mode 100644
index 0000000..be16c5e
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerP256Upgradeable.json
@@ -0,0 +1,68 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "SignerP256Upgradeable",
+ "sourceName": "contracts/utils/cryptography/signers/SignerP256Upgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "qx",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "qy",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SignerP256InvalidPublicKey",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "signer",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "qx",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "qy",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerRSAUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerRSAUpgradeable.json
new file mode 100644
index 0000000..052dc77
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerRSAUpgradeable.json
@@ -0,0 +1,52 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "SignerRSAUpgradeable",
+ "sourceName": "contracts/utils/cryptography/signers/SignerRSAUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "signer",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "e",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "n",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerWebAuthnUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerWebAuthnUpgradeable.json
new file mode 100644
index 0000000..5aa066d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/SignerWebAuthnUpgradeable.json
@@ -0,0 +1,68 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "SignerWebAuthnUpgradeable",
+ "sourceName": "contracts/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "qx",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "qy",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SignerP256InvalidPublicKey",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "signer",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "qx",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "qy",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/TimelockControllerUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/TimelockControllerUpgradeable.json
new file mode 100644
index 0000000..6fb6134
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/TimelockControllerUpgradeable.json
@@ -0,0 +1,1032 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "TimelockControllerUpgradeable",
+ "sourceName": "contracts/governance/TimelockControllerUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "AccessControlBadConfirmation",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "neededRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessControlUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "delay",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minDelay",
+ "type": "uint256"
+ }
+ ],
+ "name": "TimelockInsufficientDelay",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "targets",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "payloads",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "values",
+ "type": "uint256"
+ }
+ ],
+ "name": "TimelockInvalidOperationLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "TimelockUnauthorizedCaller",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "predecessorId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "TimelockUnexecutedPredecessor",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "operationId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "expectedStates",
+ "type": "bytes32"
+ }
+ ],
+ "name": "TimelockUnexpectedOperationState",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "CallExecuted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ }
+ ],
+ "name": "CallSalt",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "predecessor",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "delay",
+ "type": "uint256"
+ }
+ ],
+ "name": "CallScheduled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "Cancelled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "oldDuration",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newDuration",
+ "type": "uint256"
+ }
+ ],
+ "name": "MinDelayChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "previousAdminRole",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "newAdminRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RoleAdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleGranted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleRevoked",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "CANCELLER_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "DEFAULT_ADMIN_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "EXECUTOR_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "PROPOSER_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancel",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "payload",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "predecessor",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ }
+ ],
+ "name": "execute",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "payloads",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "predecessor",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ }
+ ],
+ "name": "executeBatch",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getMinDelay",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getOperationState",
+ "outputs": [
+ {
+ "internalType": "enum TimelockControllerUpgradeable.OperationState",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getRoleAdmin",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getTimestamp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "grantRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasRole",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "predecessor",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashOperation",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "payloads",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "predecessor",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ }
+ ],
+ "name": "hashOperationBatch",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "minDelay",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address[]",
+ "name": "proposers",
+ "type": "address[]"
+ },
+ {
+ "internalType": "address[]",
+ "name": "executors",
+ "type": "address[]"
+ },
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isOperation",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isOperationDone",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isOperationPending",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isOperationReady",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155BatchReceived",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC1155Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "callerConfirmation",
+ "type": "address"
+ }
+ ],
+ "name": "renounceRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "revokeRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "predecessor",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "delay",
+ "type": "uint256"
+ }
+ ],
+ "name": "schedule",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "targets",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "values",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "payloads",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "predecessor",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "delay",
+ "type": "uint256"
+ }
+ ],
+ "name": "scheduleBatch",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newDelay",
+ "type": "uint256"
+ }
+ ],
+ "name": "updateDelay",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50611e108061001c5f395ff3fe6080604052600436106101bd575f3560e01c80638065657f116100f2578063bc197c8111610092578063d547741f11610062578063d547741f14610547578063e38335e514610566578063f23a6e6114610579578063f27a0c92146105a4575f5ffd5b8063bc197c81146104a7578063c4c4c7b3146104d2578063c4d252f5146104f1578063d45c443514610510575f5ffd5b806391d14854116100cd57806391d1485414610423578063a217fddf14610442578063b08e51c014610455578063b1c5f42714610488575f5ffd5b80638065657f146103c55780638f2a0bb0146103e45780638f61f4f514610403575f5ffd5b80632ab0f5291161015d57806336568abe1161013857806336568abe1461033c578063584b153e1461035b57806364d623531461037a5780637958004c14610399575f5ffd5b80632ab0f529146102df5780632f2ff15d146102fe57806331d507501461031d575f5ffd5b8063134008d311610198578063134008d31461024b57806313bc9f201461025e578063150b7a021461027d578063248a9ca3146102c0575f5ffd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f5ffd5b366101c457005b5f5ffd5b3480156101d3575f5ffd5b506101e76101e2366004611468565b6105d7565b005b3480156101f4575f5ffd5b506102086102033660046114d6565b610698565b60405190151581526020015b60405180910390f35b348015610228575f5ffd5b5061023d5f516020611dbb5f395f51905f5281565b604051908152602001610214565b6101e76102593660046114fd565b6106a8565b348015610269575f5ffd5b50610208610278366004611563565b610747565b348015610288575f5ffd5b506102a7610297366004611629565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b3480156102cb575f5ffd5b5061023d6102da366004611563565b61076c565b3480156102ea575f5ffd5b506102086102f9366004611563565b61078c565b348015610309575f5ffd5b506101e761031836600461168c565b610794565b348015610328575f5ffd5b50610208610337366004611563565b6107b6565b348015610347575f5ffd5b506101e761035636600461168c565b6107da565b348015610366575f5ffd5b50610208610375366004611563565b610812565b348015610385575f5ffd5b506101e7610394366004611563565b610857565b3480156103a4575f5ffd5b506103b86103b3366004611563565b6108db565b60405161021491906116ca565b3480156103d0575f5ffd5b5061023d6103df3660046114fd565b61092f565b3480156103ef575f5ffd5b506101e76103fe366004611730565b61096d565b34801561040e575f5ffd5b5061023d5f516020611d9b5f395f51905f5281565b34801561042e575f5ffd5b5061020861043d36600461168c565b610ae6565b34801561044d575f5ffd5b5061023d5f81565b348015610460575f5ffd5b5061023d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610493575f5ffd5b5061023d6104a23660046117e2565b610b1c565b3480156104b2575f5ffd5b506102a76104c1366004611918565b63bc197c8160e01b95945050505050565b3480156104dd575f5ffd5b506101e76104ec366004611a26565b610b60565b3480156104fc575f5ffd5b506101e761050b366004611563565b610c5c565b34801561051b575f5ffd5b5061023d61052a366004611563565b5f9081525f516020611d5b5f395f51905f52602052604090205490565b348015610552575f5ffd5b506101e761056136600461168c565b610d15565b6101e76105743660046117e2565b610d31565b348015610584575f5ffd5b506102a7610593366004611aa2565b63f23a6e6160e01b95945050505050565b3480156105af575f5ffd5b507f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015461023d565b5f516020611d9b5f395f51905f526105ee81610e9f565b5f6105fd89898989898961092f565b90506106098184610eac565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161064496959493929190611b1d565b60405180910390a3831561068d57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161068491815260200190565b60405180910390a25b505050505050505050565b5f6106a282610f6b565b92915050565b5f516020611dbb5f395f51905f526106c0815f610ae6565b6106ce576106ce8133610f9f565b5f6106dd88888888888861092f565b90506106e98185610fdc565b6106f58888888861102a565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161072c9493929190611b59565b60405180910390a361073d8161109e565b5050505050505050565b5f60025b610754836108db565b6003811115610765576107656116b6565b1492915050565b5f9081525f516020611d7b5f395f51905f52602052604090206001015490565b5f600361074b565b61079d8261076c565b6107a681610e9f565b6107b083836110d5565b50505050565b5f806107c1836108db565b60038111156107d2576107d26116b6565b141592915050565b6001600160a01b03811633146108035760405163334bd91960e11b815260040160405180910390fd5b61080d8282611176565b505050565b5f5f61081d836108db565b90506001816003811115610833576108336116b6565b14806108505750600281600381111561084e5761084e6116b6565b145b9392505050565b5f516020611d5b5f395f51905f52333081146108965760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b600182015460408051918252602082018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15060010155565b5f8181525f516020611d5b5f395f51905f526020526040812054805f0361090457505f92915050565b600181036109155750600392915050565b428111156109265750600192915050565b50600292915050565b5f86868686868660405160200161094b96959493929190611b1d565b6040516020818303038152906040528051906020012090509695505050505050565b5f516020611d9b5f395f51905f5261098481610e9f565b88871415806109935750888514155b156109c5576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161088d565b5f6109d68b8b8b8b8b8b8b8b610b1c565b90506109e28184610eac565b5f5b8a811015610a975780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a2157610a21611b8a565b9050602002016020810190610a369190611b9e565b8d8d86818110610a4857610a48611b8a565b905060200201358c8c87818110610a6157610a61611b8a565b9050602002810190610a739190611bb7565b8c8b604051610a8796959493929190611b1d565b60405180910390a36001016109e4565b508315610ad957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ad091815260200190565b60405180910390a25b5050505050505050505050565b5f9182525f516020611d7b5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b3c989796959493929190611c8d565b60405160208183030381529060405280519060200120905098975050505050505050565b5f610b696111ef565b805490915060ff600160401b82041615906001600160401b03165f81158015610b8f5750825b90505f826001600160401b03166001148015610baa5750303b155b905081158015610bb8575080155b15610bd65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0057845460ff60401b1916600160401b1785555b610c0c89898989611217565b831561068d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610c8681610e9f565b5f516020611d5b5f395f51905f52610c9d83610812565b610cd95782610cac600261122b565b610cb6600161122b565b604051635ead8eb560e01b8152600481019390935217602482015260440161088d565b5f838152602082905260408082208290555184917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a2505050565b610d1e8261076c565b610d2781610e9f565b6107b08383611176565b5f516020611dbb5f395f51905f52610d49815f610ae6565b610d5757610d578133610f9f565b8786141580610d665750878414155b15610d98576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161088d565b5f610da98a8a8a8a8a8a8a8a610b1c565b9050610db58185610fdc565b5f5b89811015610e89575f8b8b83818110610dd257610dd2611b8a565b9050602002016020810190610de79190611b9e565b90505f8a8a84818110610dfc57610dfc611b8a565b905060200201359050365f8a8a86818110610e1957610e19611b8a565b9050602002810190610e2b9190611bb7565b91509150610e3b8484848461102a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610e729493929190611b59565b60405180910390a350505050806001019050610db7565b50610e938161109e565b50505050505050505050565b610ea98133610f9f565b50565b5f516020611d5b5f395f51905f52610ec3836107b6565b15610ef45782610ed25f61122b565b604051635ead8eb560e01b81526004810192909252602482015260440161088d565b5f610f1d7f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015490565b905080831015610f4a57604051635433660960e01b8152600481018490526024810182905260440161088d565b610f548342611d2c565b5f9485526020929092525060409092209190915550565b5f6001600160e01b03198216630271189760e51b14806106a257506301ffc9a760e01b6001600160e01b03198316146106a2565b610fa98282610ae6565b610fd85760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161088d565b5050565b610fe582610747565b610ff45781610ed2600261122b565b801580159061100957506110078161078c565b155b15610fd85760405163121534c360e31b81526004810182905260240161088d565b5f5f856001600160a01b0316858585604051611047929190611d4b565b5f6040518083038185875af1925050503d805f8114611081576040519150601f19603f3d011682016040523d82523d5f602084013e611086565b606091505b5091509150611095828261124d565b50505050505050565b5f516020611d5b5f395f51905f526110b582610747565b6110c45781610ed2600261122b565b5f9182526020526040902060019055565b5f5f516020611d7b5f395f51905f526110ee8484610ae6565b61116d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556111233390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106a2565b5f9150506106a2565b5f5f516020611d7b5f395f51905f5261118f8484610ae6565b1561116d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106a2565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006106a2565b61121f61128a565b6107b0848484846112b1565b5f81600381111561123e5761123e6116b6565b600160ff919091161b92915050565b6060821561125c5750806106a2565b8151156112715761126c826113e8565b6106a2565b60405163d6bda27560e01b815260040160405180910390fd5b6112926113f0565b6112af57604051631afcd79f60e31b815260040160405180910390fd5b565b6112b961128a565b5f516020611d5b5f395f51905f526112d15f306110d5565b506001600160a01b038216156112ed576112eb5f836110d5565b505b5f5b8451811015611368576113285f516020611d9b5f395f51905f5286838151811061131b5761131b611b8a565b60200260200101516110d5565b5061135f7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78386838151811061131b5761131b611b8a565b506001016112ef565b505f5b83518110156113a0576113975f516020611dbb5f395f51905f5285838151811061131b5761131b611b8a565b5060010161136b565b5060018101859055604080515f8152602081018790527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15050505050565b805160208201fd5b5f6113f96111ef565b54600160401b900460ff16919050565b80356001600160a01b038116811461141f575f5ffd5b919050565b5f5f83601f840112611434575f5ffd5b5081356001600160401b0381111561144a575f5ffd5b602083019150836020828501011115611461575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a03121561147e575f5ffd5b61148788611409565b96506020880135955060408801356001600160401b038111156114a8575f5ffd5b6114b48a828b01611424565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156114e6575f5ffd5b81356001600160e01b031981168114610850575f5ffd5b5f5f5f5f5f5f60a08789031215611512575f5ffd5b61151b87611409565b95506020870135945060408701356001600160401b0381111561153c575f5ffd5b61154889828a01611424565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611573575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115b6576115b661157a565b604052919050565b5f82601f8301126115cd575f5ffd5b81356001600160401b038111156115e6576115e661157a565b6115f9601f8201601f191660200161158e565b81815284602083860101111561160d575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f6080858703121561163c575f5ffd5b61164585611409565b935061165360208601611409565b92506040850135915060608501356001600160401b03811115611674575f5ffd5b611680878288016115be565b91505092959194509250565b5f5f6040838503121561169d575f5ffd5b823591506116ad60208401611409565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106116ea57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f5f83601f840112611700575f5ffd5b5081356001600160401b03811115611716575f5ffd5b6020830191508360208260051b8501011115611461575f5ffd5b5f5f5f5f5f5f5f5f5f60c08a8c031215611748575f5ffd5b89356001600160401b0381111561175d575f5ffd5b6117698c828d016116f0565b909a5098505060208a01356001600160401b03811115611787575f5ffd5b6117938c828d016116f0565b90985096505060408a01356001600160401b038111156117b1575f5ffd5b6117bd8c828d016116f0565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f5f5f5f5f5f5f5f60a0898b0312156117f9575f5ffd5b88356001600160401b0381111561180e575f5ffd5b61181a8b828c016116f0565b90995097505060208901356001600160401b03811115611838575f5ffd5b6118448b828c016116f0565b90975095505060408901356001600160401b03811115611862575f5ffd5b61186e8b828c016116f0565b999c989b509699959896976060870135966080013595509350505050565b5f6001600160401b038211156118a4576118a461157a565b5060051b60200190565b5f82601f8301126118bd575f5ffd5b81356118d06118cb8261188c565b61158e565b8082825260208201915060208360051b8601019250858311156118f1575f5ffd5b602085015b8381101561190e5780358352602092830192016118f6565b5095945050505050565b5f5f5f5f5f60a0868803121561192c575f5ffd5b61193586611409565b945061194360208701611409565b935060408601356001600160401b0381111561195d575f5ffd5b611969888289016118ae565b93505060608601356001600160401b03811115611984575f5ffd5b611990888289016118ae565b92505060808601356001600160401b038111156119ab575f5ffd5b6119b7888289016115be565b9150509295509295909350565b5f82601f8301126119d3575f5ffd5b81356119e16118cb8261188c565b8082825260208201915060208360051b860101925085831115611a02575f5ffd5b602085015b8381101561190e57611a1881611409565b835260209283019201611a07565b5f5f5f5f60808587031215611a39575f5ffd5b8435935060208501356001600160401b03811115611a55575f5ffd5b611a61878288016119c4565b93505060408501356001600160401b03811115611a7c575f5ffd5b611a88878288016119c4565b925050611a9760608601611409565b905092959194509250565b5f5f5f5f5f60a08688031215611ab6575f5ffd5b611abf86611409565b9450611acd60208701611409565b9350604086013592506060860135915060808601356001600160401b038111156119ab575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f611b4460a083018688611af5565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611b80606083018486611af5565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611bae575f5ffd5b61085082611409565b5f5f8335601e19843603018112611bcc575f5ffd5b8301803591506001600160401b03821115611be5575f5ffd5b602001915036819003821315611461575f5ffd5b5f8383855260208501945060208460051b820101835f5b86811015611c8157838303601f19018852813536879003601e19018112611c35575f5ffd5b86016020810190356001600160401b03811115611c50575f5ffd5b803603821315611c5e575f5ffd5b611c69858284611af5565b60209a8b019a90955093909301925050600101611c10565b50909695505050505050565b60a080825281018890525f8960c08301825b8b811015611ccd576001600160a01b03611cb884611409565b16825260209283019290910190600101611c9f565b5083810360208501528881526001600160fb1b03891115611cec575f5ffd5b8860051b9150818a60208301370182810360209081016040850152611d149082018789611bf9565b60608401959095525050608001529695505050505050565b808201808211156106a257634e487b7160e01b5f52601160045260245ffd5b818382375f910190815291905056fe9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb360002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a264697066735822122029338e94b39d2df468baa3981ad2691473593f70d7c2e29f0c57958dd1f8a27564736f6c634300081f0033",
+ "deployedBytecode": "0x6080604052600436106101bd575f3560e01c80638065657f116100f2578063bc197c8111610092578063d547741f11610062578063d547741f14610547578063e38335e514610566578063f23a6e6114610579578063f27a0c92146105a4575f5ffd5b8063bc197c81146104a7578063c4c4c7b3146104d2578063c4d252f5146104f1578063d45c443514610510575f5ffd5b806391d14854116100cd57806391d1485414610423578063a217fddf14610442578063b08e51c014610455578063b1c5f42714610488575f5ffd5b80638065657f146103c55780638f2a0bb0146103e45780638f61f4f514610403575f5ffd5b80632ab0f5291161015d57806336568abe1161013857806336568abe1461033c578063584b153e1461035b57806364d623531461037a5780637958004c14610399575f5ffd5b80632ab0f529146102df5780632f2ff15d146102fe57806331d507501461031d575f5ffd5b8063134008d311610198578063134008d31461024b57806313bc9f201461025e578063150b7a021461027d578063248a9ca3146102c0575f5ffd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f5ffd5b366101c457005b5f5ffd5b3480156101d3575f5ffd5b506101e76101e2366004611468565b6105d7565b005b3480156101f4575f5ffd5b506102086102033660046114d6565b610698565b60405190151581526020015b60405180910390f35b348015610228575f5ffd5b5061023d5f516020611dbb5f395f51905f5281565b604051908152602001610214565b6101e76102593660046114fd565b6106a8565b348015610269575f5ffd5b50610208610278366004611563565b610747565b348015610288575f5ffd5b506102a7610297366004611629565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b3480156102cb575f5ffd5b5061023d6102da366004611563565b61076c565b3480156102ea575f5ffd5b506102086102f9366004611563565b61078c565b348015610309575f5ffd5b506101e761031836600461168c565b610794565b348015610328575f5ffd5b50610208610337366004611563565b6107b6565b348015610347575f5ffd5b506101e761035636600461168c565b6107da565b348015610366575f5ffd5b50610208610375366004611563565b610812565b348015610385575f5ffd5b506101e7610394366004611563565b610857565b3480156103a4575f5ffd5b506103b86103b3366004611563565b6108db565b60405161021491906116ca565b3480156103d0575f5ffd5b5061023d6103df3660046114fd565b61092f565b3480156103ef575f5ffd5b506101e76103fe366004611730565b61096d565b34801561040e575f5ffd5b5061023d5f516020611d9b5f395f51905f5281565b34801561042e575f5ffd5b5061020861043d36600461168c565b610ae6565b34801561044d575f5ffd5b5061023d5f81565b348015610460575f5ffd5b5061023d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610493575f5ffd5b5061023d6104a23660046117e2565b610b1c565b3480156104b2575f5ffd5b506102a76104c1366004611918565b63bc197c8160e01b95945050505050565b3480156104dd575f5ffd5b506101e76104ec366004611a26565b610b60565b3480156104fc575f5ffd5b506101e761050b366004611563565b610c5c565b34801561051b575f5ffd5b5061023d61052a366004611563565b5f9081525f516020611d5b5f395f51905f52602052604090205490565b348015610552575f5ffd5b506101e761056136600461168c565b610d15565b6101e76105743660046117e2565b610d31565b348015610584575f5ffd5b506102a7610593366004611aa2565b63f23a6e6160e01b95945050505050565b3480156105af575f5ffd5b507f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015461023d565b5f516020611d9b5f395f51905f526105ee81610e9f565b5f6105fd89898989898961092f565b90506106098184610eac565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161064496959493929190611b1d565b60405180910390a3831561068d57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161068491815260200190565b60405180910390a25b505050505050505050565b5f6106a282610f6b565b92915050565b5f516020611dbb5f395f51905f526106c0815f610ae6565b6106ce576106ce8133610f9f565b5f6106dd88888888888861092f565b90506106e98185610fdc565b6106f58888888861102a565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161072c9493929190611b59565b60405180910390a361073d8161109e565b5050505050505050565b5f60025b610754836108db565b6003811115610765576107656116b6565b1492915050565b5f9081525f516020611d7b5f395f51905f52602052604090206001015490565b5f600361074b565b61079d8261076c565b6107a681610e9f565b6107b083836110d5565b50505050565b5f806107c1836108db565b60038111156107d2576107d26116b6565b141592915050565b6001600160a01b03811633146108035760405163334bd91960e11b815260040160405180910390fd5b61080d8282611176565b505050565b5f5f61081d836108db565b90506001816003811115610833576108336116b6565b14806108505750600281600381111561084e5761084e6116b6565b145b9392505050565b5f516020611d5b5f395f51905f52333081146108965760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b600182015460408051918252602082018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15060010155565b5f8181525f516020611d5b5f395f51905f526020526040812054805f0361090457505f92915050565b600181036109155750600392915050565b428111156109265750600192915050565b50600292915050565b5f86868686868660405160200161094b96959493929190611b1d565b6040516020818303038152906040528051906020012090509695505050505050565b5f516020611d9b5f395f51905f5261098481610e9f565b88871415806109935750888514155b156109c5576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161088d565b5f6109d68b8b8b8b8b8b8b8b610b1c565b90506109e28184610eac565b5f5b8a811015610a975780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a2157610a21611b8a565b9050602002016020810190610a369190611b9e565b8d8d86818110610a4857610a48611b8a565b905060200201358c8c87818110610a6157610a61611b8a565b9050602002810190610a739190611bb7565b8c8b604051610a8796959493929190611b1d565b60405180910390a36001016109e4565b508315610ad957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ad091815260200190565b60405180910390a25b5050505050505050505050565b5f9182525f516020611d7b5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b3c989796959493929190611c8d565b60405160208183030381529060405280519060200120905098975050505050505050565b5f610b696111ef565b805490915060ff600160401b82041615906001600160401b03165f81158015610b8f5750825b90505f826001600160401b03166001148015610baa5750303b155b905081158015610bb8575080155b15610bd65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0057845460ff60401b1916600160401b1785555b610c0c89898989611217565b831561068d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610c8681610e9f565b5f516020611d5b5f395f51905f52610c9d83610812565b610cd95782610cac600261122b565b610cb6600161122b565b604051635ead8eb560e01b8152600481019390935217602482015260440161088d565b5f838152602082905260408082208290555184917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a2505050565b610d1e8261076c565b610d2781610e9f565b6107b08383611176565b5f516020611dbb5f395f51905f52610d49815f610ae6565b610d5757610d578133610f9f565b8786141580610d665750878414155b15610d98576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161088d565b5f610da98a8a8a8a8a8a8a8a610b1c565b9050610db58185610fdc565b5f5b89811015610e89575f8b8b83818110610dd257610dd2611b8a565b9050602002016020810190610de79190611b9e565b90505f8a8a84818110610dfc57610dfc611b8a565b905060200201359050365f8a8a86818110610e1957610e19611b8a565b9050602002810190610e2b9190611bb7565b91509150610e3b8484848461102a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610e729493929190611b59565b60405180910390a350505050806001019050610db7565b50610e938161109e565b50505050505050505050565b610ea98133610f9f565b50565b5f516020611d5b5f395f51905f52610ec3836107b6565b15610ef45782610ed25f61122b565b604051635ead8eb560e01b81526004810192909252602482015260440161088d565b5f610f1d7f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015490565b905080831015610f4a57604051635433660960e01b8152600481018490526024810182905260440161088d565b610f548342611d2c565b5f9485526020929092525060409092209190915550565b5f6001600160e01b03198216630271189760e51b14806106a257506301ffc9a760e01b6001600160e01b03198316146106a2565b610fa98282610ae6565b610fd85760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161088d565b5050565b610fe582610747565b610ff45781610ed2600261122b565b801580159061100957506110078161078c565b155b15610fd85760405163121534c360e31b81526004810182905260240161088d565b5f5f856001600160a01b0316858585604051611047929190611d4b565b5f6040518083038185875af1925050503d805f8114611081576040519150601f19603f3d011682016040523d82523d5f602084013e611086565b606091505b5091509150611095828261124d565b50505050505050565b5f516020611d5b5f395f51905f526110b582610747565b6110c45781610ed2600261122b565b5f9182526020526040902060019055565b5f5f516020611d7b5f395f51905f526110ee8484610ae6565b61116d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556111233390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106a2565b5f9150506106a2565b5f5f516020611d7b5f395f51905f5261118f8484610ae6565b1561116d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106a2565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006106a2565b61121f61128a565b6107b0848484846112b1565b5f81600381111561123e5761123e6116b6565b600160ff919091161b92915050565b6060821561125c5750806106a2565b8151156112715761126c826113e8565b6106a2565b60405163d6bda27560e01b815260040160405180910390fd5b6112926113f0565b6112af57604051631afcd79f60e31b815260040160405180910390fd5b565b6112b961128a565b5f516020611d5b5f395f51905f526112d15f306110d5565b506001600160a01b038216156112ed576112eb5f836110d5565b505b5f5b8451811015611368576113285f516020611d9b5f395f51905f5286838151811061131b5761131b611b8a565b60200260200101516110d5565b5061135f7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78386838151811061131b5761131b611b8a565b506001016112ef565b505f5b83518110156113a0576113975f516020611dbb5f395f51905f5285838151811061131b5761131b611b8a565b5060010161136b565b5060018101859055604080515f8152602081018790527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15050505050565b805160208201fd5b5f6113f96111ef565b54600160401b900460ff16919050565b80356001600160a01b038116811461141f575f5ffd5b919050565b5f5f83601f840112611434575f5ffd5b5081356001600160401b0381111561144a575f5ffd5b602083019150836020828501011115611461575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a03121561147e575f5ffd5b61148788611409565b96506020880135955060408801356001600160401b038111156114a8575f5ffd5b6114b48a828b01611424565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156114e6575f5ffd5b81356001600160e01b031981168114610850575f5ffd5b5f5f5f5f5f5f60a08789031215611512575f5ffd5b61151b87611409565b95506020870135945060408701356001600160401b0381111561153c575f5ffd5b61154889828a01611424565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611573575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115b6576115b661157a565b604052919050565b5f82601f8301126115cd575f5ffd5b81356001600160401b038111156115e6576115e661157a565b6115f9601f8201601f191660200161158e565b81815284602083860101111561160d575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f6080858703121561163c575f5ffd5b61164585611409565b935061165360208601611409565b92506040850135915060608501356001600160401b03811115611674575f5ffd5b611680878288016115be565b91505092959194509250565b5f5f6040838503121561169d575f5ffd5b823591506116ad60208401611409565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106116ea57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f5f83601f840112611700575f5ffd5b5081356001600160401b03811115611716575f5ffd5b6020830191508360208260051b8501011115611461575f5ffd5b5f5f5f5f5f5f5f5f5f60c08a8c031215611748575f5ffd5b89356001600160401b0381111561175d575f5ffd5b6117698c828d016116f0565b909a5098505060208a01356001600160401b03811115611787575f5ffd5b6117938c828d016116f0565b90985096505060408a01356001600160401b038111156117b1575f5ffd5b6117bd8c828d016116f0565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f5f5f5f5f5f5f5f60a0898b0312156117f9575f5ffd5b88356001600160401b0381111561180e575f5ffd5b61181a8b828c016116f0565b90995097505060208901356001600160401b03811115611838575f5ffd5b6118448b828c016116f0565b90975095505060408901356001600160401b03811115611862575f5ffd5b61186e8b828c016116f0565b999c989b509699959896976060870135966080013595509350505050565b5f6001600160401b038211156118a4576118a461157a565b5060051b60200190565b5f82601f8301126118bd575f5ffd5b81356118d06118cb8261188c565b61158e565b8082825260208201915060208360051b8601019250858311156118f1575f5ffd5b602085015b8381101561190e5780358352602092830192016118f6565b5095945050505050565b5f5f5f5f5f60a0868803121561192c575f5ffd5b61193586611409565b945061194360208701611409565b935060408601356001600160401b0381111561195d575f5ffd5b611969888289016118ae565b93505060608601356001600160401b03811115611984575f5ffd5b611990888289016118ae565b92505060808601356001600160401b038111156119ab575f5ffd5b6119b7888289016115be565b9150509295509295909350565b5f82601f8301126119d3575f5ffd5b81356119e16118cb8261188c565b8082825260208201915060208360051b860101925085831115611a02575f5ffd5b602085015b8381101561190e57611a1881611409565b835260209283019201611a07565b5f5f5f5f60808587031215611a39575f5ffd5b8435935060208501356001600160401b03811115611a55575f5ffd5b611a61878288016119c4565b93505060408501356001600160401b03811115611a7c575f5ffd5b611a88878288016119c4565b925050611a9760608601611409565b905092959194509250565b5f5f5f5f5f60a08688031215611ab6575f5ffd5b611abf86611409565b9450611acd60208701611409565b9350604086013592506060860135915060808601356001600160401b038111156119ab575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f611b4460a083018688611af5565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611b80606083018486611af5565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611bae575f5ffd5b61085082611409565b5f5f8335601e19843603018112611bcc575f5ffd5b8301803591506001600160401b03821115611be5575f5ffd5b602001915036819003821315611461575f5ffd5b5f8383855260208501945060208460051b820101835f5b86811015611c8157838303601f19018852813536879003601e19018112611c35575f5ffd5b86016020810190356001600160401b03811115611c50575f5ffd5b803603821315611c5e575f5ffd5b611c69858284611af5565b60209a8b019a90955093909301925050600101611c10565b50909695505050505050565b60a080825281018890525f8960c08301825b8b811015611ccd576001600160a01b03611cb884611409565b16825260209283019290910190600101611c9f565b5083810360208501528881526001600160fb1b03891115611cec575f5ffd5b8860051b9150818a60208301370182810360209081016040850152611d149082018789611bf9565b60608401959095525050608001529695505050505050565b808201808211156106a257634e487b7160e01b5f52601160045260245ffd5b818382375f910190815291905056fe9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb360002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a264697066735822122029338e94b39d2df468baa3981ad2691473593f70d7c2e29f0c57958dd1f8a27564736f6c634300081f0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/VestingWalletCliffUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/VestingWalletCliffUpgradeable.json
new file mode 100644
index 0000000..47b3409
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/VestingWalletCliffUpgradeable.json
@@ -0,0 +1,394 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "VestingWalletCliffUpgradeable",
+ "sourceName": "contracts/finance/VestingWalletCliffUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "cliffSeconds",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "durationSeconds",
+ "type": "uint64"
+ }
+ ],
+ "name": "InvalidCliffDuration",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableInvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20Released",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "EtherReleased",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "cliff",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "duration",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "end",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "beneficiary",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "startTimestamp",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "durationSeconds",
+ "type": "uint64"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "releasable",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "releasable",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "release",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "release",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "released",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "released",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "start",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "timestamp",
+ "type": "uint64"
+ }
+ ],
+ "name": "vestedAmount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "timestamp",
+ "type": "uint64"
+ }
+ ],
+ "name": "vestedAmount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/VestingWalletUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/VestingWalletUpgradeable.json
new file mode 100644
index 0000000..6d09016
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/VestingWalletUpgradeable.json
@@ -0,0 +1,365 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "VestingWalletUpgradeable",
+ "sourceName": "contracts/finance/VestingWalletUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableInvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC20Released",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "EtherReleased",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "duration",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "end",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "beneficiary",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "startTimestamp",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "durationSeconds",
+ "type": "uint64"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "releasable",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "releasable",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "release",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "release",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "released",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "released",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "start",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "timestamp",
+ "type": "uint64"
+ }
+ ],
+ "name": "vestedAmount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "timestamp",
+ "type": "uint64"
+ }
+ ],
+ "name": "vestedAmount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610bdb8061001c5f395ff3fe6080604052600436106100e7575f3560e01c80639613252111610087578063be9a655511610057578063be9a655514610249578063efbe1c1c1461025d578063f2fde38b14610271578063fbccedae14610290575f5ffd5b806396132521146101cc5780639852595c146101ec578063989a83661461020b578063a3f8eace1461022a575f5ffd5b8063715018a6116100c2578063715018a614610159578063810ec23b1461016d57806386d1a69f1461018c5780638da5cb5b146101a0575f5ffd5b80630a17b06b146100f25780630fb5a6b4146101245780631916558714610138575f5ffd5b366100ee57005b5f5ffd5b3480156100fd575f5ffd5b5061011161010c366004610a45565b6102a4565b6040519081526020015b60405180910390f35b34801561012f575f5ffd5b506101116102d3565b348015610143575f5ffd5b50610157610152366004610a74565b610309565b005b348015610164575f5ffd5b506101576103a9565b348015610178575f5ffd5b50610111610187366004610a8d565b6103bc565b348015610197575f5ffd5b50610157610440565b3480156101ab575f5ffd5b506101b46104b8565b6040516001600160a01b03909116815260200161011b565b3480156101d7575f5ffd5b505f516020610b865f395f51905f5254610111565b3480156101f7575f5ffd5b50610111610206366004610a74565b6104e6565b348015610216575f5ffd5b50610157610225366004610abe565b61051f565b348015610235575f5ffd5b50610111610244366004610a74565b61061c565b348015610254575f5ffd5b5061011161063a565b348015610268575f5ffd5b50610111610669565b34801561027c575f5ffd5b5061015761028b366004610a74565b610689565b34801561029b575f5ffd5b506101116106cb565b5f6102cd6102bd5f516020610b865f395f51905f525490565b6102c79047610b12565b836106f4565b92915050565b7fa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa390254600160401b900467ffffffffffffffff1690565b5f516020610b865f395f51905f525f6103218361061c565b6001600160a01b0384165f90815260018401602052604081208054929350839290919061034f908490610b12565b90915550506040518181526001600160a01b038416907fc0e523490dd523c33b1878c9eb14ff46991e3f5b2cd33710918618f2a39cba1b9060200160405180910390a26103a48361039e6104b8565b83610773565b505050565b6103b16107a8565b6103ba5f6107da565b565b5f6104396103c9846104e6565b6040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa15801561040b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061042f9190610b25565b6102c79190610b12565b9392505050565b5f516020610b865f395f51905f525f6104576106cb565b905080825f015f82825461046b9190610b12565b90915550506040518181527fda9d4e5f101b8b9b1c5b76d0c5a9f7923571acfc02376aa076b75a8c080c956b9060200160405180910390a16104b46104ae6104b8565b8261084a565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081527fa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa3901602052604090205490565b5f6105286108bd565b805490915060ff600160401b820416159067ffffffffffffffff165f8115801561054f5750825b90505f8267ffffffffffffffff16600114801561056b5750303b155b905081158015610579575080155b156105975760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105c157845460ff60401b1916600160401b1785555b6105cc8888886108e5565b831561061257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610626826104e6565b61063083426103bc565b6102cd9190610b3c565b7fa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa39025467ffffffffffffffff1690565b5f6106726102d3565b61067a61063a565b6106849190610b12565b905090565b6106916107a8565b6001600160a01b0381166106bf57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6106c8816107da565b50565b5f6106e15f516020610b865f395f51905f525490565b6106ea426102a4565b6106849190610b3c565b5f6106fd61063a565b8267ffffffffffffffff16101561071557505f6102cd565b61071d610669565b8267ffffffffffffffff16106107345750816102cd565b61073c6102d3565b61074461063a565b6107589067ffffffffffffffff8516610b3c565b6107629085610b4f565b61076c9190610b66565b90506102cd565b6107808383836001610901565b6103a457604051635274afe760e01b81526001600160a01b03841660048201526024016106b6565b336107b16104b8565b6001600160a01b0316146103ba5760405163118cdaa760e01b81523360048201526024016106b6565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b804710156108745760405163cf47918160e01b8152476004820152602481018290526044016106b6565b61088d828260405180602001604052805f815250610963565b15610896575050565b3d156108a4576104b4610978565b60405163d6bda27560e01b815260040160405180910390fd5b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102cd565b6108ed610983565b6108f6836109a8565b6103a48383836109b0565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661095757838315161561094b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f5f5f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b61098b610a10565b6103ba57604051631afcd79f60e31b815260040160405180910390fd5b610691610983565b6109b8610983565b7fa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa3902805467ffffffffffffffff928316600160401b026fffffffffffffffffffffffffffffffff19909116939092169290921717905550565b5f610a196108bd565b54600160401b900460ff16919050565b803567ffffffffffffffff81168114610a40575f5ffd5b919050565b5f60208284031215610a55575f5ffd5b61043982610a29565b80356001600160a01b0381168114610a40575f5ffd5b5f60208284031215610a84575f5ffd5b61043982610a5e565b5f5f60408385031215610a9e575f5ffd5b610aa783610a5e565b9150610ab560208401610a29565b90509250929050565b5f5f5f60608486031215610ad0575f5ffd5b610ad984610a5e565b9250610ae760208501610a29565b9150610af560408501610a29565b90509250925092565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102cd576102cd610afe565b5f60208284031215610b35575f5ffd5b5051919050565b818103818111156102cd576102cd610afe565b80820281158282048414176102cd576102cd610afe565b5f82610b8057634e487b7160e01b5f52601260045260245ffd5b50049056fea1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa3900a26469706673582212207a5d87a31b9cfed557e712c37ae6060652e37b39ada2265b86bc118569de6abe64736f6c634300081f0033",
+ "deployedBytecode": "0x6080604052600436106100e7575f3560e01c80639613252111610087578063be9a655511610057578063be9a655514610249578063efbe1c1c1461025d578063f2fde38b14610271578063fbccedae14610290575f5ffd5b806396132521146101cc5780639852595c146101ec578063989a83661461020b578063a3f8eace1461022a575f5ffd5b8063715018a6116100c2578063715018a614610159578063810ec23b1461016d57806386d1a69f1461018c5780638da5cb5b146101a0575f5ffd5b80630a17b06b146100f25780630fb5a6b4146101245780631916558714610138575f5ffd5b366100ee57005b5f5ffd5b3480156100fd575f5ffd5b5061011161010c366004610a45565b6102a4565b6040519081526020015b60405180910390f35b34801561012f575f5ffd5b506101116102d3565b348015610143575f5ffd5b50610157610152366004610a74565b610309565b005b348015610164575f5ffd5b506101576103a9565b348015610178575f5ffd5b50610111610187366004610a8d565b6103bc565b348015610197575f5ffd5b50610157610440565b3480156101ab575f5ffd5b506101b46104b8565b6040516001600160a01b03909116815260200161011b565b3480156101d7575f5ffd5b505f516020610b865f395f51905f5254610111565b3480156101f7575f5ffd5b50610111610206366004610a74565b6104e6565b348015610216575f5ffd5b50610157610225366004610abe565b61051f565b348015610235575f5ffd5b50610111610244366004610a74565b61061c565b348015610254575f5ffd5b5061011161063a565b348015610268575f5ffd5b50610111610669565b34801561027c575f5ffd5b5061015761028b366004610a74565b610689565b34801561029b575f5ffd5b506101116106cb565b5f6102cd6102bd5f516020610b865f395f51905f525490565b6102c79047610b12565b836106f4565b92915050565b7fa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa390254600160401b900467ffffffffffffffff1690565b5f516020610b865f395f51905f525f6103218361061c565b6001600160a01b0384165f90815260018401602052604081208054929350839290919061034f908490610b12565b90915550506040518181526001600160a01b038416907fc0e523490dd523c33b1878c9eb14ff46991e3f5b2cd33710918618f2a39cba1b9060200160405180910390a26103a48361039e6104b8565b83610773565b505050565b6103b16107a8565b6103ba5f6107da565b565b5f6104396103c9846104e6565b6040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa15801561040b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061042f9190610b25565b6102c79190610b12565b9392505050565b5f516020610b865f395f51905f525f6104576106cb565b905080825f015f82825461046b9190610b12565b90915550506040518181527fda9d4e5f101b8b9b1c5b76d0c5a9f7923571acfc02376aa076b75a8c080c956b9060200160405180910390a16104b46104ae6104b8565b8261084a565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081527fa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa3901602052604090205490565b5f6105286108bd565b805490915060ff600160401b820416159067ffffffffffffffff165f8115801561054f5750825b90505f8267ffffffffffffffff16600114801561056b5750303b155b905081158015610579575080155b156105975760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105c157845460ff60401b1916600160401b1785555b6105cc8888886108e5565b831561061257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610626826104e6565b61063083426103bc565b6102cd9190610b3c565b7fa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa39025467ffffffffffffffff1690565b5f6106726102d3565b61067a61063a565b6106849190610b12565b905090565b6106916107a8565b6001600160a01b0381166106bf57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6106c8816107da565b50565b5f6106e15f516020610b865f395f51905f525490565b6106ea426102a4565b6106849190610b3c565b5f6106fd61063a565b8267ffffffffffffffff16101561071557505f6102cd565b61071d610669565b8267ffffffffffffffff16106107345750816102cd565b61073c6102d3565b61074461063a565b6107589067ffffffffffffffff8516610b3c565b6107629085610b4f565b61076c9190610b66565b90506102cd565b6107808383836001610901565b6103a457604051635274afe760e01b81526001600160a01b03841660048201526024016106b6565b336107b16104b8565b6001600160a01b0316146103ba5760405163118cdaa760e01b81523360048201526024016106b6565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b804710156108745760405163cf47918160e01b8152476004820152602481018290526044016106b6565b61088d828260405180602001604052805f815250610963565b15610896575050565b3d156108a4576104b4610978565b60405163d6bda27560e01b815260040160405180910390fd5b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102cd565b6108ed610983565b6108f6836109a8565b6103a48383836109b0565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661095757838315161561094b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f5f5f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b61098b610a10565b6103ba57604051631afcd79f60e31b815260040160405180910390fd5b610691610983565b6109b8610983565b7fa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa3902805467ffffffffffffffff928316600160401b026fffffffffffffffffffffffffffffffff19909116939092169290921717905550565b5f610a196108bd565b54600160401b900460ff16919050565b803567ffffffffffffffff81168114610a40575f5ffd5b919050565b5f60208284031215610a55575f5ffd5b61043982610a29565b80356001600160a01b0381168114610a40575f5ffd5b5f60208284031215610a84575f5ffd5b61043982610a5e565b5f5f60408385031215610a9e575f5ffd5b610aa783610a5e565b9150610ab560208401610a29565b90509250929050565b5f5f5f60608486031215610ad0575f5ffd5b610ad984610a5e565b9250610ae760208501610a29565b9150610af560408501610a29565b90509250925092565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102cd576102cd610afe565b5f60208284031215610b35575f5ffd5b5051919050565b818103818111156102cd576102cd610afe565b80820281158282048414176102cd576102cd610afe565b5f82610b8057634e487b7160e01b5f52601260045260245ffd5b50049056fea1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa3900a26469706673582212207a5d87a31b9cfed557e712c37ae6060652e37b39ada2265b86bc118569de6abe64736f6c634300081f0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/VotesExtendedUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/VotesExtendedUpgradeable.json
new file mode 100644
index 0000000..7a56d14
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/VotesExtendedUpgradeable.json
@@ -0,0 +1,454 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "VotesExtendedUpgradeable",
+ "sourceName": "contracts/governance/utils/VotesExtendedUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "CheckpointUnorderedInsertion",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ECDSAInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "length",
+ "type": "uint256"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureS",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "clock",
+ "type": "uint48"
+ }
+ ],
+ "name": "ERC5805FutureLookup",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC6372InconsistentClock",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "expiry",
+ "type": "uint256"
+ }
+ ],
+ "name": "VotesExpiredSignature",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "fromDelegate",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "toDelegate",
+ "type": "address"
+ }
+ ],
+ "name": "DelegateChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegate",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "previousVotes",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newVotes",
+ "type": "uint256"
+ }
+ ],
+ "name": "DelegateVotesChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "delegatee",
+ "type": "address"
+ }
+ ],
+ "name": "delegate",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "delegatee",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "expiry",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "v",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "r",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "delegateBySig",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "delegates",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastBalanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastDelegate",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastTotalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/build/contracts/VotesUpgradeable.json b/lib/openzeppelin-contracts-upgradeable/build/contracts/VotesUpgradeable.json
new file mode 100644
index 0000000..76b91b2
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/build/contracts/VotesUpgradeable.json
@@ -0,0 +1,406 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "VotesUpgradeable",
+ "sourceName": "contracts/governance/utils/VotesUpgradeable.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "CheckpointUnorderedInsertion",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ECDSAInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "length",
+ "type": "uint256"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureLength",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "ECDSAInvalidSignatureS",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "clock",
+ "type": "uint48"
+ }
+ ],
+ "name": "ERC5805FutureLookup",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC6372InconsistentClock",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "currentNonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "InvalidAccountNonce",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "expiry",
+ "type": "uint256"
+ }
+ ],
+ "name": "VotesExpiredSignature",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegator",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "fromDelegate",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "toDelegate",
+ "type": "address"
+ }
+ ],
+ "name": "DelegateChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "delegate",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "previousVotes",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "newVotes",
+ "type": "uint256"
+ }
+ ],
+ "name": "DelegateVotesChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EIP712DomainChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "CLOCK_MODE",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clock",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "delegatee",
+ "type": "address"
+ }
+ ],
+ "name": "delegate",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "delegatee",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "expiry",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "v",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "r",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "delegateBySig",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "delegates",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "eip712Domain",
+ "outputs": [
+ {
+ "internalType": "bytes1",
+ "name": "fields",
+ "type": "bytes1"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "verifyingContract",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "extensions",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastTotalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timepoint",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPastVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getVotes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "nonces",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/crosschain/CrosschainLinkedUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/crosschain/CrosschainLinkedUpgradeable.sol
new file mode 100644
index 0000000..725f62d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/crosschain/CrosschainLinkedUpgradeable.sol
@@ -0,0 +1,128 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/CrosschainLinked.sol)
+
+pragma solidity ^0.8.26;
+
+import {IERC7786GatewaySource} from "@openzeppelin/contracts/interfaces/draft-IERC7786.sol";
+import {InteroperableAddress} from "@openzeppelin/contracts/utils/draft-InteroperableAddress.sol";
+import {Bytes} from "@openzeppelin/contracts/utils/Bytes.sol";
+import {ERC7786Recipient} from "@openzeppelin/contracts/crosschain/ERC7786Recipient.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Core bridging mechanism.
+ *
+ * This contract contains the logic to register and send messages to counterparts on remote chains using ERC-7786
+ * gateways. It ensure received messages originate from a counterpart. This is the base of token bridges such as
+ * {BridgeFungible}.
+ *
+ * Contracts that inherit from this contract can use the internal {_sendMessageToCounterpart} to send messages to their
+ * counterpart on a foreign chain. They must override the {_processMessage} function to handle messages that have
+ * been verified.
+ */
+abstract contract CrosschainLinkedUpgradeable is Initializable, ERC7786Recipient {
+ using Bytes for bytes;
+ using InteroperableAddress for bytes;
+
+ struct Link {
+ address gateway;
+ bytes counterpart; // Full InteroperableAddress (chain ref + address)
+ }
+ /// @custom:storage-location erc7201:openzeppelin.storage.CrosschainLinked
+ struct CrosschainLinkedStorage {
+ mapping(bytes chain => Link) _links;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.CrosschainLinked")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant CrosschainLinkedStorageLocation = 0xb1919b8acb826911820798909343454eff798c0ea16342cfea7647f1c8b2df00;
+
+ function _getCrosschainLinkedStorage() private pure returns (CrosschainLinkedStorage storage $) {
+ assembly {
+ $.slot := CrosschainLinkedStorageLocation
+ }
+ }
+
+ /**
+ * @dev Emitted when a new link is registered.
+ *
+ * Note: the `counterpart` argument is a full InteroperableAddress (chain ref + address).
+ */
+ event LinkRegistered(address gateway, bytes counterpart);
+
+ /**
+ * @dev Reverted when trying to register a link for a chain that is already registered.
+ *
+ * Note: the `chain` argument is a "chain-only" InteroperableAddress (empty address).
+ */
+ error LinkAlreadyRegistered(bytes chain);
+
+ function __CrosschainLinked_init(Link[] memory links) internal onlyInitializing {
+ __CrosschainLinked_init_unchained(links);
+ }
+
+ function __CrosschainLinked_init_unchained(Link[] memory links) internal onlyInitializing {
+ for (uint256 i = 0; i < links.length; ++i) {
+ _setLink(links[i].gateway, links[i].counterpart, false);
+ }
+ }
+
+ /**
+ * @dev Returns the ERC-7786 gateway used for sending and receiving cross-chain messages to a given chain.
+ *
+ * Note: The `chain` parameter is a "chain-only" InteroperableAddress (empty address) and the `counterpart` returns
+ * the full InteroperableAddress (chain ref + address) that is on `chain`.
+ */
+ function getLink(bytes memory chain) public view virtual returns (address gateway, bytes memory counterpart) {
+ CrosschainLinkedStorage storage $ = _getCrosschainLinkedStorage();
+ Link storage self = $._links[chain];
+ return (self.gateway, self.counterpart);
+ }
+
+ /**
+ * @dev Internal setter to change the ERC-7786 gateway and counterpart for a given chain. Called at construction.
+ *
+ * Note: The `counterpart` parameter is the full InteroperableAddress (chain ref + address).
+ */
+ function _setLink(address gateway, bytes memory counterpart, bool allowOverride) internal virtual {
+ CrosschainLinkedStorage storage $ = _getCrosschainLinkedStorage();
+ // Sanity check, this should revert if gateway is not an ERC-7786 implementation. Note that since
+ // supportsAttribute returns data, an EOA would fail that test (nothing returned).
+ IERC7786GatewaySource(gateway).supportsAttribute(bytes4(0));
+
+ bytes memory chain = _extractChain(counterpart);
+ if (allowOverride || $._links[chain].gateway == address(0)) {
+ $._links[chain] = Link(gateway, counterpart);
+ emit LinkRegistered(gateway, counterpart);
+ } else {
+ revert LinkAlreadyRegistered(chain);
+ }
+ }
+
+ /**
+ * @dev Internal messaging function
+ *
+ * Note: The `chain` parameter is a "chain-only" InteroperableAddress (empty address).
+ */
+ function _sendMessageToCounterpart(
+ bytes memory chain,
+ bytes memory payload,
+ bytes[] memory attributes
+ ) internal virtual returns (bytes32) {
+ (address gateway, bytes memory counterpart) = getLink(chain);
+ return IERC7786GatewaySource(gateway).sendMessage(counterpart, payload, attributes);
+ }
+
+ /// @inheritdoc ERC7786Recipient
+ function _isAuthorizedGateway(
+ address instance,
+ bytes calldata sender
+ ) internal view virtual override returns (bool) {
+ (address gateway, bytes memory router) = getLink(_extractChain(sender));
+ return instance == gateway && sender.equal(router);
+ }
+
+ function _extractChain(bytes memory self) private pure returns (bytes memory) {
+ (bytes2 chainType, bytes memory chainReference, ) = self.parseV1();
+ return InteroperableAddress.formatV1(chainType, chainReference, hex"");
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/BridgeERC20Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/BridgeERC20Upgradeable.sol
new file mode 100644
index 0000000..62bd7b6
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/BridgeERC20Upgradeable.sol
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/bridges/BridgeERC20.sol)
+
+pragma solidity ^0.8.26;
+
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import {BridgeFungibleUpgradeable} from "./abstract/BridgeFungibleUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev This is a variant of {BridgeFungible} that implements the bridge logic for ERC-20 tokens that do not expose a
+ * crosschain mint and burn mechanism. Instead, it takes custody of bridged assets.
+ */
+// slither-disable-next-line locked-ether
+abstract contract BridgeERC20Upgradeable is Initializable, BridgeFungibleUpgradeable {
+ using SafeERC20 for IERC20;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.BridgeERC20
+ struct BridgeERC20Storage {
+ IERC20 _token;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.BridgeERC20")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant BridgeERC20StorageLocation = 0x244b01c12a07f59148f0f6492b0cb67864481add66b2bb58fc6fb6ea2a07f700;
+
+ function _getBridgeERC20Storage() private pure returns (BridgeERC20Storage storage $) {
+ assembly {
+ $.slot := BridgeERC20StorageLocation
+ }
+ }
+
+ function __BridgeERC20_init(IERC20 token_) internal onlyInitializing {
+ __BridgeERC20_init_unchained(token_);
+ }
+
+ function __BridgeERC20_init_unchained(IERC20 token_) internal onlyInitializing {
+ BridgeERC20Storage storage $ = _getBridgeERC20Storage();
+ $._token = token_;
+ }
+
+ /// @dev Return the address of the ERC20 token this bridge operates on.
+ function token() public view virtual returns (IERC20) {
+ BridgeERC20Storage storage $ = _getBridgeERC20Storage();
+ return $._token;
+ }
+
+ /// @dev "Locking" tokens is done by taking custody
+ function _onSend(address from, uint256 amount) internal virtual override {
+ token().safeTransferFrom(from, address(this), amount);
+ }
+
+ /// @dev "Unlocking" tokens is done by releasing custody
+ function _onReceive(address to, uint256 amount) internal virtual override {
+ token().safeTransfer(to, amount);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/BridgeERC7802Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/BridgeERC7802Upgradeable.sol
new file mode 100644
index 0000000..0678685
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/BridgeERC7802Upgradeable.sol
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/bridges/BridgeERC7802.sol)
+
+pragma solidity ^0.8.26;
+
+import {IERC7802} from "@openzeppelin/contracts/interfaces/draft-IERC7802.sol";
+import {BridgeFungibleUpgradeable} from "./abstract/BridgeFungibleUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev This is a variant of {BridgeFungible} that implements the bridge logic for ERC-7802 compliant tokens.
+ */
+// slither-disable-next-line locked-ether
+abstract contract BridgeERC7802Upgradeable is Initializable, BridgeFungibleUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.BridgeERC7802
+ struct BridgeERC7802Storage {
+ IERC7802 _token;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.BridgeERC7802")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant BridgeERC7802StorageLocation = 0xaa74a536d5c1ef957e103c5cd74a2d097ce13b7e0a555173bee99ce500fd4300;
+
+ function _getBridgeERC7802Storage() private pure returns (BridgeERC7802Storage storage $) {
+ assembly {
+ $.slot := BridgeERC7802StorageLocation
+ }
+ }
+
+ function __BridgeERC7802_init(IERC7802 token_) internal onlyInitializing {
+ __BridgeERC7802_init_unchained(token_);
+ }
+
+ function __BridgeERC7802_init_unchained(IERC7802 token_) internal onlyInitializing {
+ BridgeERC7802Storage storage $ = _getBridgeERC7802Storage();
+ $._token = token_;
+ }
+
+ /// @dev Return the address of the ERC20 token this bridge operates on.
+ function token() public view virtual returns (IERC7802) {
+ BridgeERC7802Storage storage $ = _getBridgeERC7802Storage();
+ return $._token;
+ }
+
+ /// @dev "Locking" tokens using an ERC-7802 crosschain burn
+ function _onSend(address from, uint256 amount) internal virtual override {
+ token().crosschainBurn(from, amount);
+ }
+
+ /// @dev "Unlocking" tokens using an ERC-7802 crosschain mint
+ function _onReceive(address to, uint256 amount) internal virtual override {
+ token().crosschainMint(to, amount);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/abstract/BridgeFungibleUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/abstract/BridgeFungibleUpgradeable.sol
new file mode 100644
index 0000000..25c8f6a
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/crosschain/bridges/abstract/BridgeFungibleUpgradeable.sol
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/bridges/abstract/BridgeFungible.sol)
+
+pragma solidity ^0.8.26;
+
+import {InteroperableAddress} from "@openzeppelin/contracts/utils/draft-InteroperableAddress.sol";
+import {ContextUpgradeable} from "../../../utils/ContextUpgradeable.sol";
+import {ERC7786Recipient} from "@openzeppelin/contracts/crosschain/ERC7786Recipient.sol";
+import {CrosschainLinkedUpgradeable} from "../../CrosschainLinkedUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Base contract for bridging ERC-20 between chains using an ERC-7786 gateway.
+ *
+ * In order to use this contract, two functions must be implemented to link it to the token:
+ * * {_onSend}: called when a crosschain transfer is going out. Must take the sender tokens or revert.
+ * * {_onReceive}: called when a crosschain transfer is coming in. Must give tokens to the receiver.
+ *
+ * This base contract is used by the {BridgeERC20}, which interfaces with legacy ERC-20 tokens, and {BridgeERC7802},
+ * which interface with ERC-7802 to provide an approve-free user experience. It is also used by the {ERC20Crosschain}
+ * extension, which embeds the bridge logic directly in the token contract.
+ */
+abstract contract BridgeFungibleUpgradeable is Initializable, ContextUpgradeable, CrosschainLinkedUpgradeable {
+ using InteroperableAddress for bytes;
+
+ event CrosschainFungibleTransferSent(bytes32 indexed sendId, address indexed from, bytes to, uint256 amount);
+ event CrosschainFungibleTransferReceived(bytes32 indexed receiveId, bytes from, address indexed to, uint256 amount);
+
+ function __BridgeFungible_init() internal onlyInitializing {
+ }
+
+ function __BridgeFungible_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Transfer `amount` tokens to a crosschain receiver.
+ *
+ * Note: The `to` parameter is the full InteroperableAddress (chain ref + address).
+ */
+ function crosschainTransfer(bytes memory to, uint256 amount) public virtual returns (bytes32) {
+ return _crosschainTransfer(_msgSender(), to, amount);
+ }
+
+ /**
+ * @dev Internal crosschain transfer function.
+ *
+ * Note: The `to` parameter is the full InteroperableAddress (chain ref + address).
+ */
+ function _crosschainTransfer(address from, bytes memory to, uint256 amount) internal virtual returns (bytes32) {
+ _onSend(from, amount);
+
+ (bytes2 chainType, bytes memory chainReference, bytes memory addr) = to.parseV1();
+ bytes memory chain = InteroperableAddress.formatV1(chainType, chainReference, hex"");
+
+ bytes32 sendId = _sendMessageToCounterpart(
+ chain,
+ abi.encode(InteroperableAddress.formatEvmV1(block.chainid, from), addr, amount),
+ new bytes[](0)
+ );
+
+ emit CrosschainFungibleTransferSent(sendId, from, to, amount);
+
+ return sendId;
+ }
+
+ /// @inheritdoc ERC7786Recipient
+ function _processMessage(
+ address /*gateway*/,
+ bytes32 receiveId,
+ bytes calldata /*sender*/,
+ bytes calldata payload
+ ) internal virtual override {
+ // split payload
+ (bytes memory from, bytes memory toBinary, uint256 amount) = abi.decode(payload, (bytes, bytes, uint256));
+ address to = address(bytes20(toBinary));
+
+ _onReceive(to, amount);
+
+ emit CrosschainFungibleTransferReceived(receiveId, from, to, amount);
+ }
+
+ /// @dev Virtual function: implementation is required to handle token being burnt or locked on the source chain.
+ function _onSend(address from, uint256 amount) internal virtual;
+
+ /// @dev Virtual function: implementation is required to handle token being minted or unlocked on the destination chain.
+ function _onReceive(address to, uint256 amount) internal virtual;
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/finance/VestingWalletCliffUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/finance/VestingWalletCliffUpgradeable.sol
new file mode 100644
index 0000000..b989619
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/finance/VestingWalletCliffUpgradeable.sol
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.1.0) (finance/VestingWalletCliff.sol)
+
+pragma solidity ^0.8.20;
+
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {VestingWalletUpgradeable} from "./VestingWalletUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {VestingWallet} that adds a cliff to the vesting schedule.
+ *
+ * _Available since v5.1._
+ */
+abstract contract VestingWalletCliffUpgradeable is Initializable, VestingWalletUpgradeable {
+ using SafeCast for *;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.VestingWalletCliff
+ struct VestingWalletCliffStorage {
+ uint64 _cliff;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.VestingWalletCliff")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant VestingWalletCliffStorageLocation = 0x0a0ceb66c7c9aef32c0bfc43d3108868a39e95e96162520745e462557492f100;
+
+ function _getVestingWalletCliffStorage() private pure returns (VestingWalletCliffStorage storage $) {
+ assembly {
+ $.slot := VestingWalletCliffStorageLocation
+ }
+ }
+
+ /// @dev The specified cliff duration is larger than the vesting duration.
+ error InvalidCliffDuration(uint64 cliffSeconds, uint64 durationSeconds);
+
+ /**
+ * @dev Set the duration of the cliff, in seconds. The cliff starts vesting schedule (see {VestingWallet}'s
+ * constructor) and ends `cliffSeconds` later.
+ */
+ function __VestingWalletCliff_init(uint64 cliffSeconds) internal onlyInitializing {
+ __VestingWalletCliff_init_unchained(cliffSeconds);
+ }
+
+ function __VestingWalletCliff_init_unchained(uint64 cliffSeconds) internal onlyInitializing {
+ VestingWalletCliffStorage storage $ = _getVestingWalletCliffStorage();
+ if (cliffSeconds > duration()) {
+ revert InvalidCliffDuration(cliffSeconds, duration().toUint64());
+ }
+ $._cliff = start().toUint64() + cliffSeconds;
+ }
+
+ /**
+ * @dev Getter for the cliff timestamp.
+ */
+ function cliff() public view virtual returns (uint256) {
+ VestingWalletCliffStorage storage $ = _getVestingWalletCliffStorage();
+ return $._cliff;
+ }
+
+ /**
+ * @dev Virtual implementation of the vesting formula. This returns the amount vested, as a function of time, for
+ * an asset given its total historical allocation. Returns 0 if the {cliff} timestamp is not met.
+ *
+ * IMPORTANT: The cliff not only makes the schedule return 0, but it also ignores every possible side
+ * effect from calling the inherited implementation (i.e. `super._vestingSchedule`). Carefully consider
+ * this caveat if the overridden implementation of this function has any (e.g. writing to memory or reverting).
+ */
+ function _vestingSchedule(
+ uint256 totalAllocation,
+ uint64 timestamp
+ ) internal view virtual override returns (uint256) {
+ return timestamp < cliff() ? 0 : super._vestingSchedule(totalAllocation, timestamp);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/finance/VestingWalletUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/finance/VestingWalletUpgradeable.sol
new file mode 100644
index 0000000..6e9ce86
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/finance/VestingWalletUpgradeable.sol
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (finance/VestingWallet.sol)
+
+pragma solidity ^0.8.20;
+
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
+import {OwnableUpgradeable} from "../access/OwnableUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev A vesting wallet is an ownable contract that can receive native currency and ERC-20 tokens, and release these
+ * assets to the wallet owner, also referred to as "beneficiary", according to a vesting schedule.
+ *
+ * Any assets transferred to this contract will follow the vesting schedule as if they were locked from the beginning.
+ * Consequently, if the vesting has already started, any amount of tokens sent to this contract will (at least partly)
+ * be immediately releasable.
+ *
+ * By setting the duration to 0, one can configure this contract to behave like an asset timelock that holds tokens for
+ * a beneficiary until a specified time.
+ *
+ * NOTE: Since the wallet is {Ownable}, and ownership can be transferred, it is possible to sell unvested tokens.
+ * Preventing this in a smart contract is difficult, considering that: 1) a beneficiary address could be a
+ * counterfactually deployed contract, 2) there is likely to be a migration path for EOAs to become contracts in the
+ * near future.
+ *
+ * NOTE: When using this contract with any token whose balance is adjusted automatically (i.e. a rebase token), make
+ * sure to account the supply/balance adjustment in the vesting schedule to ensure the vested amount is as intended.
+ *
+ * NOTE: Chains with support for native ERC20s may allow the vesting wallet to withdraw the underlying asset as both an
+ * ERC20 and as native currency. For example, if chain C supports token A and the wallet gets deposited 100 A, then
+ * at 50% of the vesting period, the beneficiary can withdraw 50 A as ERC20 and 25 A as native currency (totaling 75 A).
+ * Consider disabling one of the withdrawal methods.
+ */
+contract VestingWalletUpgradeable is Initializable, ContextUpgradeable, OwnableUpgradeable {
+ event EtherReleased(uint256 amount);
+ event ERC20Released(address indexed token, uint256 amount);
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.VestingWallet
+ struct VestingWalletStorage {
+ uint256 _released;
+ mapping(address token => uint256) _erc20Released;
+ uint64 _start;
+ uint64 _duration;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.VestingWallet")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant VestingWalletStorageLocation = 0xa1eac494560f7591e4da38ed031587f09556afdfc4399dd2e205b935fdfa3900;
+
+ function _getVestingWalletStorage() private pure returns (VestingWalletStorage storage $) {
+ assembly {
+ $.slot := VestingWalletStorageLocation
+ }
+ }
+
+ function initialize(address beneficiary, uint64 startTimestamp, uint64 durationSeconds) public virtual initializer {
+ __VestingWallet_init(beneficiary, startTimestamp, durationSeconds);
+ }
+ /**
+ * @dev Sets the beneficiary (owner), the start timestamp and the vesting duration (in seconds) of the vesting
+ * wallet.
+ */
+ function __VestingWallet_init(address beneficiary, uint64 startTimestamp, uint64 durationSeconds) internal onlyInitializing {
+ __Ownable_init_unchained(beneficiary);
+ __VestingWallet_init_unchained(beneficiary, startTimestamp, durationSeconds);
+ }
+
+ function __VestingWallet_init_unchained(address, uint64 startTimestamp, uint64 durationSeconds) internal onlyInitializing {
+ VestingWalletStorage storage $ = _getVestingWalletStorage();
+ $._start = startTimestamp;
+ $._duration = durationSeconds;
+ }
+
+ /**
+ * @dev The contract should be able to receive Eth.
+ */
+ receive() external payable virtual {}
+
+ /**
+ * @dev Getter for the start timestamp.
+ */
+ function start() public view virtual returns (uint256) {
+ VestingWalletStorage storage $ = _getVestingWalletStorage();
+ return $._start;
+ }
+
+ /**
+ * @dev Getter for the vesting duration.
+ */
+ function duration() public view virtual returns (uint256) {
+ VestingWalletStorage storage $ = _getVestingWalletStorage();
+ return $._duration;
+ }
+
+ /**
+ * @dev Getter for the end timestamp.
+ */
+ function end() public view virtual returns (uint256) {
+ return start() + duration();
+ }
+
+ /**
+ * @dev Amount of eth already released
+ */
+ function released() public view virtual returns (uint256) {
+ VestingWalletStorage storage $ = _getVestingWalletStorage();
+ return $._released;
+ }
+
+ /**
+ * @dev Amount of token already released
+ */
+ function released(address token) public view virtual returns (uint256) {
+ VestingWalletStorage storage $ = _getVestingWalletStorage();
+ return $._erc20Released[token];
+ }
+
+ /**
+ * @dev Getter for the amount of releasable eth.
+ */
+ function releasable() public view virtual returns (uint256) {
+ return vestedAmount(uint64(block.timestamp)) - released();
+ }
+
+ /**
+ * @dev Getter for the amount of releasable `token` tokens. `token` should be the address of an
+ * {IERC20} contract.
+ */
+ function releasable(address token) public view virtual returns (uint256) {
+ return vestedAmount(token, uint64(block.timestamp)) - released(token);
+ }
+
+ /**
+ * @dev Release the native tokens (ether) that have already vested.
+ *
+ * Emits a {EtherReleased} event.
+ */
+ function release() public virtual {
+ VestingWalletStorage storage $ = _getVestingWalletStorage();
+ uint256 amount = releasable();
+ $._released += amount;
+ emit EtherReleased(amount);
+ Address.sendValue(payable(owner()), amount);
+ }
+
+ /**
+ * @dev Release the tokens that have already vested.
+ *
+ * Emits a {ERC20Released} event.
+ */
+ function release(address token) public virtual {
+ VestingWalletStorage storage $ = _getVestingWalletStorage();
+ uint256 amount = releasable(token);
+ $._erc20Released[token] += amount;
+ emit ERC20Released(token, amount);
+ SafeERC20.safeTransfer(IERC20(token), owner(), amount);
+ }
+
+ /**
+ * @dev Calculates the amount of ether that has already vested. Default implementation is a linear vesting curve.
+ */
+ function vestedAmount(uint64 timestamp) public view virtual returns (uint256) {
+ return _vestingSchedule(address(this).balance + released(), timestamp);
+ }
+
+ /**
+ * @dev Calculates the amount of tokens that has already vested. Default implementation is a linear vesting curve.
+ */
+ function vestedAmount(address token, uint64 timestamp) public view virtual returns (uint256) {
+ return _vestingSchedule(IERC20(token).balanceOf(address(this)) + released(token), timestamp);
+ }
+
+ /**
+ * @dev Virtual implementation of the vesting formula. This returns the amount vested, as a function of time, for
+ * an asset given its total historical allocation.
+ */
+ function _vestingSchedule(uint256 totalAllocation, uint64 timestamp) internal view virtual returns (uint256) {
+ if (timestamp < start()) {
+ return 0;
+ } else if (timestamp >= end()) {
+ return totalAllocation;
+ } else {
+ return (totalAllocation * (timestamp - start())) / duration();
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/GovernorUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/GovernorUpgradeable.sol
new file mode 100644
index 0000000..784068e
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/GovernorUpgradeable.sol
@@ -0,0 +1,851 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (governance/Governor.sol)
+
+pragma solidity ^0.8.24;
+
+import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
+import {IERC1155Receiver} from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
+import {EIP712Upgradeable} from "../utils/cryptography/EIP712Upgradeable.sol";
+import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {ERC165Upgradeable} from "../utils/introspection/ERC165Upgradeable.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {DoubleEndedQueue} from "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
+import {NoncesUpgradeable} from "../utils/NoncesUpgradeable.sol";
+import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {IERC6372} from "@openzeppelin/contracts/interfaces/IERC6372.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Core of the governance system, designed to be extended through various modules.
+ *
+ * This contract is abstract and requires several functions to be implemented in various modules:
+ *
+ * - A counting module must implement {_quorumReached}, {_voteSucceeded} and {_countVote}
+ * - A voting module must implement {_getVotes}
+ * - Additionally, {votingPeriod}, {votingDelay}, and {quorum} must also be implemented
+ */
+abstract contract GovernorUpgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, EIP712Upgradeable, NoncesUpgradeable, IGovernor, IERC721Receiver, IERC1155Receiver {
+ using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;
+
+ bytes32 public constant BALLOT_TYPEHASH =
+ keccak256("Ballot(uint256 proposalId,uint8 support,address voter,uint256 nonce)");
+ bytes32 public constant EXTENDED_BALLOT_TYPEHASH =
+ keccak256(
+ "ExtendedBallot(uint256 proposalId,uint8 support,address voter,uint256 nonce,string reason,bytes params)"
+ );
+
+ struct ProposalCore {
+ address proposer;
+ uint48 voteStart;
+ uint32 voteDuration;
+ bool executed;
+ bool canceled;
+ uint48 etaSeconds;
+ }
+
+ bytes32 private constant ALL_PROPOSAL_STATES_BITMAP = bytes32((2 ** (uint8(type(ProposalState).max) + 1)) - 1);
+ /// @custom:storage-location erc7201:openzeppelin.storage.Governor
+ struct GovernorStorage {
+ string _name;
+
+ mapping(uint256 proposalId => ProposalCore) _proposals;
+
+ // This queue keeps track of the governor operating on itself. Calls to functions protected by the {onlyGovernance}
+ // modifier needs to be whitelisted in this queue. Whitelisting is set in {execute}, consumed by the
+ // {onlyGovernance} modifier and eventually reset after {_executeOperations} completes. This ensures that the
+ // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.
+ DoubleEndedQueue.Bytes32Deque _governanceCall;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Governor")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorStorageLocation = 0x7c712897014dbe49c045ef1299aa2d5f9e67e48eea4403efa21f1e0f3ac0cb00;
+
+ function _getGovernorStorage() private pure returns (GovernorStorage storage $) {
+ assembly {
+ $.slot := GovernorStorageLocation
+ }
+ }
+
+ /**
+ * @dev Restricts a function so it can only be executed through governance proposals. For example, governance
+ * parameter setters in {GovernorSettings} are protected using this modifier.
+ *
+ * The governance executing address may be different from the Governor's own address, for example it could be a
+ * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these
+ * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,
+ * for example, additional timelock proposers are not able to change governance parameters without going through the
+ * governance protocol (since v4.6).
+ */
+ modifier onlyGovernance() {
+ _checkGovernance();
+ _;
+ }
+
+ /**
+ * @dev Sets the value for {name} and {version}
+ */
+ function __Governor_init(string memory name_) internal onlyInitializing {
+ __EIP712_init_unchained(name_, version());
+ __Governor_init_unchained(name_);
+ }
+
+ function __Governor_init_unchained(string memory name_) internal onlyInitializing {
+ GovernorStorage storage $ = _getGovernorStorage();
+ $._name = name_;
+ }
+
+ /**
+ * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)
+ */
+ receive() external payable virtual {
+ if (_executor() != address(this)) {
+ revert GovernorDisabledDeposit();
+ }
+ }
+
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165Upgradeable) returns (bool) {
+ return
+ interfaceId == type(IGovernor).interfaceId ||
+ interfaceId == type(IGovernor).interfaceId ^ IGovernor.getProposalId.selector ||
+ interfaceId == type(IERC1155Receiver).interfaceId ||
+ super.supportsInterface(interfaceId);
+ }
+
+ /// @inheritdoc IGovernor
+ function name() public view virtual returns (string memory) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ return $._name;
+ }
+
+ /// @inheritdoc IGovernor
+ function version() public view virtual returns (string memory) {
+ return "1";
+ }
+
+ /**
+ * @dev See {IGovernor-hashProposal}.
+ *
+ * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array
+ * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id
+ * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in
+ * advance, before the proposal is submitted.
+ *
+ * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the
+ * same proposal (with same operation and same description) will have the same id if submitted on multiple governors
+ * across multiple networks. This also means that in order to execute the same operation twice (on the same
+ * governor) the proposer will have to change the description in order to avoid proposal id conflicts.
+ */
+ function hashProposal(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) public pure virtual returns (uint256) {
+ return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));
+ }
+
+ /// @inheritdoc IGovernor
+ function getProposalId(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) public view virtual returns (uint256) {
+ return hashProposal(targets, values, calldatas, descriptionHash);
+ }
+
+ /// @inheritdoc IGovernor
+ function state(uint256 proposalId) public view virtual returns (ProposalState) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ // We read the struct fields into the stack at once so Solidity emits a single SLOAD
+ ProposalCore storage proposal = $._proposals[proposalId];
+ bool proposalExecuted = proposal.executed;
+ bool proposalCanceled = proposal.canceled;
+
+ if (proposalExecuted) {
+ return ProposalState.Executed;
+ }
+
+ if (proposalCanceled) {
+ return ProposalState.Canceled;
+ }
+
+ uint256 snapshot = proposalSnapshot(proposalId);
+
+ if (snapshot == 0) {
+ revert GovernorNonexistentProposal(proposalId);
+ }
+
+ uint256 currentTimepoint = clock();
+
+ if (snapshot >= currentTimepoint) {
+ return ProposalState.Pending;
+ }
+
+ uint256 deadline = proposalDeadline(proposalId);
+
+ if (deadline >= currentTimepoint) {
+ return ProposalState.Active;
+ } else if (!_quorumReached(proposalId) || !_voteSucceeded(proposalId)) {
+ return ProposalState.Defeated;
+ } else if (proposalEta(proposalId) == 0) {
+ return ProposalState.Succeeded;
+ } else {
+ return ProposalState.Queued;
+ }
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalThreshold() public view virtual returns (uint256) {
+ return 0;
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ return $._proposals[proposalId].voteStart;
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalDeadline(uint256 proposalId) public view virtual returns (uint256) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ return $._proposals[proposalId].voteStart + $._proposals[proposalId].voteDuration;
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalProposer(uint256 proposalId) public view virtual returns (address) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ return $._proposals[proposalId].proposer;
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalEta(uint256 proposalId) public view virtual returns (uint256) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ return $._proposals[proposalId].etaSeconds;
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalNeedsQueuing(uint256) public view virtual returns (bool) {
+ return false;
+ }
+
+ /**
+ * @dev Reverts if the `msg.sender` is not the executor. In case the executor is not this contract
+ * itself, the function reverts if `msg.data` is not whitelisted as a result of an {execute}
+ * operation. See {onlyGovernance}.
+ */
+ function _checkGovernance() internal virtual {
+ GovernorStorage storage $ = _getGovernorStorage();
+ if (_executor() != _msgSender()) {
+ revert GovernorOnlyExecutor(_msgSender());
+ }
+ if (_executor() != address(this)) {
+ bytes32 msgDataHash = keccak256(_msgData());
+ // loop until popping the expected operation - throw if deque is empty (operation not authorized)
+ while ($._governanceCall.popFront() != msgDataHash) {}
+ }
+ }
+
+ /**
+ * @dev Amount of votes already cast passes the threshold limit.
+ */
+ function _quorumReached(uint256 proposalId) internal view virtual returns (bool);
+
+ /**
+ * @dev Is the proposal successful or not.
+ */
+ function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);
+
+ /**
+ * @dev Get the voting weight of `account` at a specific `timepoint`, for a vote as described by `params`.
+ */
+ function _getVotes(address account, uint256 timepoint, bytes memory params) internal view virtual returns (uint256);
+
+ /**
+ * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.
+ *
+ * Note: Support is generic and can represent various things depending on the voting system used.
+ */
+ function _countVote(
+ uint256 proposalId,
+ address account,
+ uint8 support,
+ uint256 totalWeight,
+ bytes memory params
+ ) internal virtual returns (uint256);
+
+ /**
+ * @dev Hook that should be called every time the tally for a proposal is updated.
+ *
+ * Note: This function must run successfully. Reverts will result in the bricking of governance
+ */
+ function _tallyUpdated(uint256 proposalId) internal virtual {}
+
+ /**
+ * @dev Default additional encoded parameters used by castVote methods that don't include them
+ *
+ * Note: Should be overridden by specific implementations to use an appropriate value, the
+ * meaning of the additional params, in the context of that implementation
+ */
+ function _defaultParams() internal view virtual returns (bytes memory) {
+ return "";
+ }
+
+ /**
+ * @dev See {IGovernor-propose}. This function has opt-in frontrunning protection, described in {_isValidDescriptionForProposer}.
+ */
+ function propose(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ string memory description
+ ) public virtual returns (uint256) {
+ address proposer = _msgSender();
+
+ // check description restriction
+ if (!_isValidDescriptionForProposer(proposer, description)) {
+ revert GovernorRestrictedProposer(proposer);
+ }
+
+ // check proposal threshold
+ uint256 votesThreshold = proposalThreshold();
+ if (votesThreshold > 0) {
+ uint256 proposerVotes = getVotes(proposer, clock() - 1);
+ if (proposerVotes < votesThreshold) {
+ revert GovernorInsufficientProposerVotes(proposer, proposerVotes, votesThreshold);
+ }
+ }
+
+ return _propose(targets, values, calldatas, description, proposer);
+ }
+
+ /**
+ * @dev Internal propose mechanism. Can be overridden to add more logic on proposal creation.
+ *
+ * Emits a {IGovernor-ProposalCreated} event.
+ */
+ function _propose(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ string memory description,
+ address proposer
+ ) internal virtual returns (uint256 proposalId) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ proposalId = getProposalId(targets, values, calldatas, keccak256(bytes(description)));
+
+ if (targets.length != values.length || targets.length != calldatas.length || targets.length == 0) {
+ revert GovernorInvalidProposalLength(targets.length, calldatas.length, values.length);
+ }
+ if ($._proposals[proposalId].voteStart != 0) {
+ revert GovernorUnexpectedProposalState(proposalId, state(proposalId), bytes32(0));
+ }
+
+ uint256 snapshot = clock() + votingDelay();
+ uint256 duration = votingPeriod();
+
+ ProposalCore storage proposal = $._proposals[proposalId];
+ proposal.proposer = proposer;
+ proposal.voteStart = SafeCast.toUint48(snapshot);
+ proposal.voteDuration = SafeCast.toUint32(duration);
+
+ emit ProposalCreated(
+ proposalId,
+ proposer,
+ targets,
+ values,
+ new string[](targets.length),
+ calldatas,
+ snapshot,
+ snapshot + duration,
+ description
+ );
+
+ // Using a named return variable to avoid stack too deep errors
+ }
+
+ /// @inheritdoc IGovernor
+ function queue(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) public virtual returns (uint256) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ uint256 proposalId = getProposalId(targets, values, calldatas, descriptionHash);
+
+ _validateStateBitmap(proposalId, _encodeStateBitmap(ProposalState.Succeeded));
+
+ uint48 etaSeconds = _queueOperations(proposalId, targets, values, calldatas, descriptionHash);
+
+ if (etaSeconds != 0) {
+ $._proposals[proposalId].etaSeconds = etaSeconds;
+ emit ProposalQueued(proposalId, etaSeconds);
+ } else {
+ revert GovernorQueueNotImplemented();
+ }
+
+ return proposalId;
+ }
+
+ /**
+ * @dev Internal queuing mechanism. Can be overridden (without a super call) to modify the way queuing is
+ * performed (for example adding a vault/timelock).
+ *
+ * This is empty by default, and must be overridden to implement queuing.
+ *
+ * This function returns a timestamp that describes the expected ETA for execution. If the returned value is 0
+ * (which is the default value), the core will consider queueing did not succeed, and the public {queue} function
+ * will revert.
+ *
+ * NOTE: Calling this function directly will NOT check the current state of the proposal, or emit the
+ * `ProposalQueued` event. Queuing a proposal should be done using {queue}.
+ */
+ function _queueOperations(
+ uint256 /*proposalId*/,
+ address[] memory /*targets*/,
+ uint256[] memory /*values*/,
+ bytes[] memory /*calldatas*/,
+ bytes32 /*descriptionHash*/
+ ) internal virtual returns (uint48) {
+ return 0;
+ }
+
+ /// @inheritdoc IGovernor
+ function execute(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) public payable virtual returns (uint256) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ uint256 proposalId = getProposalId(targets, values, calldatas, descriptionHash);
+
+ _validateStateBitmap(
+ proposalId,
+ _encodeStateBitmap(ProposalState.Succeeded) | _encodeStateBitmap(ProposalState.Queued)
+ );
+
+ // mark as executed before calls to avoid reentrancy
+ $._proposals[proposalId].executed = true;
+
+ // before execute: register governance call in queue.
+ if (_executor() != address(this)) {
+ for (uint256 i = 0; i < targets.length; ++i) {
+ if (targets[i] == address(this)) {
+ $._governanceCall.pushBack(keccak256(calldatas[i]));
+ }
+ }
+ }
+
+ _executeOperations(proposalId, targets, values, calldatas, descriptionHash);
+
+ // after execute: cleanup governance call queue.
+ if (_executor() != address(this) && !$._governanceCall.empty()) {
+ $._governanceCall.clear();
+ }
+
+ emit ProposalExecuted(proposalId);
+
+ return proposalId;
+ }
+
+ /**
+ * @dev Internal execution mechanism. Can be overridden (without a super call) to modify the way execution is
+ * performed (for example adding a vault/timelock).
+ *
+ * NOTE: Calling this function directly will NOT check the current state of the proposal, set the executed flag to
+ * true or emit the `ProposalExecuted` event. Executing a proposal should be done using {execute}.
+ */
+ function _executeOperations(
+ uint256 /* proposalId */,
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 /*descriptionHash*/
+ ) internal virtual {
+ for (uint256 i = 0; i < targets.length; ++i) {
+ (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);
+ Address.verifyCallResult(success, returndata);
+ }
+ }
+
+ /// @inheritdoc IGovernor
+ function cancel(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) public virtual returns (uint256) {
+ // The proposalId will be recomputed in the `_cancel` call further down. However we need the value before we
+ // do the internal call, because we need to check the proposal state BEFORE the internal `_cancel` call
+ // changes it. The `getProposalId` duplication has a cost that is limited, and that we accept.
+ uint256 proposalId = getProposalId(targets, values, calldatas, descriptionHash);
+
+ address caller = _msgSender();
+ if (!_validateCancel(proposalId, caller)) revert GovernorUnableToCancel(proposalId, caller);
+
+ return _cancel(targets, values, calldatas, descriptionHash);
+ }
+
+ /**
+ * @dev Internal cancel mechanism with minimal restrictions. A proposal can be cancelled in any state other than
+ * Canceled, Expired, or Executed. Once cancelled a proposal can't be re-submitted.
+ *
+ * Emits a {IGovernor-ProposalCanceled} event.
+ */
+ function _cancel(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) internal virtual returns (uint256) {
+ GovernorStorage storage $ = _getGovernorStorage();
+ uint256 proposalId = getProposalId(targets, values, calldatas, descriptionHash);
+
+ _validateStateBitmap(
+ proposalId,
+ ALL_PROPOSAL_STATES_BITMAP ^
+ _encodeStateBitmap(ProposalState.Canceled) ^
+ _encodeStateBitmap(ProposalState.Expired) ^
+ _encodeStateBitmap(ProposalState.Executed)
+ );
+
+ $._proposals[proposalId].canceled = true;
+ emit ProposalCanceled(proposalId);
+
+ return proposalId;
+ }
+
+ /// @inheritdoc IGovernor
+ function getVotes(address account, uint256 timepoint) public view virtual returns (uint256) {
+ return _getVotes(account, timepoint, _defaultParams());
+ }
+
+ /// @inheritdoc IGovernor
+ function getVotesWithParams(
+ address account,
+ uint256 timepoint,
+ bytes memory params
+ ) public view virtual returns (uint256) {
+ return _getVotes(account, timepoint, params);
+ }
+
+ /// @inheritdoc IGovernor
+ function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256) {
+ address voter = _msgSender();
+ return _castVote(proposalId, voter, support, "");
+ }
+
+ /// @inheritdoc IGovernor
+ function castVoteWithReason(
+ uint256 proposalId,
+ uint8 support,
+ string calldata reason
+ ) public virtual returns (uint256) {
+ address voter = _msgSender();
+ return _castVote(proposalId, voter, support, reason);
+ }
+
+ /// @inheritdoc IGovernor
+ function castVoteWithReasonAndParams(
+ uint256 proposalId,
+ uint8 support,
+ string calldata reason,
+ bytes memory params
+ ) public virtual returns (uint256) {
+ address voter = _msgSender();
+ return _castVote(proposalId, voter, support, reason, params);
+ }
+
+ /// @inheritdoc IGovernor
+ function castVoteBySig(
+ uint256 proposalId,
+ uint8 support,
+ address voter,
+ bytes memory signature
+ ) public virtual returns (uint256) {
+ if (!_validateVoteSig(proposalId, support, voter, signature)) {
+ revert GovernorInvalidSignature(voter);
+ }
+ return _castVote(proposalId, voter, support, "");
+ }
+
+ /// @inheritdoc IGovernor
+ function castVoteWithReasonAndParamsBySig(
+ uint256 proposalId,
+ uint8 support,
+ address voter,
+ string calldata reason,
+ bytes memory params,
+ bytes memory signature
+ ) public virtual returns (uint256) {
+ if (!_validateExtendedVoteSig(proposalId, support, voter, reason, params, signature)) {
+ revert GovernorInvalidSignature(voter);
+ }
+ return _castVote(proposalId, voter, support, reason, params);
+ }
+
+ /// @dev Validate the `signature` used in {castVoteBySig} function.
+ function _validateVoteSig(
+ uint256 proposalId,
+ uint8 support,
+ address voter,
+ bytes memory signature
+ ) internal virtual returns (bool) {
+ return
+ SignatureChecker.isValidSignatureNow(
+ voter,
+ _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support, voter, _useNonce(voter)))),
+ signature
+ );
+ }
+
+ /// @dev Validate the `signature` used in {castVoteWithReasonAndParamsBySig} function.
+ function _validateExtendedVoteSig(
+ uint256 proposalId,
+ uint8 support,
+ address voter,
+ string memory reason,
+ bytes memory params,
+ bytes memory signature
+ ) internal virtual returns (bool) {
+ return
+ SignatureChecker.isValidSignatureNow(
+ voter,
+ _hashTypedDataV4(
+ keccak256(
+ abi.encode(
+ EXTENDED_BALLOT_TYPEHASH,
+ proposalId,
+ support,
+ voter,
+ _useNonce(voter),
+ keccak256(bytes(reason)),
+ keccak256(params)
+ )
+ )
+ ),
+ signature
+ );
+ }
+
+ /**
+ * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve
+ * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().
+ *
+ * Emits a {IGovernor-VoteCast} event.
+ */
+ function _castVote(
+ uint256 proposalId,
+ address account,
+ uint8 support,
+ string memory reason
+ ) internal virtual returns (uint256) {
+ return _castVote(proposalId, account, support, reason, _defaultParams());
+ }
+
+ /**
+ * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve
+ * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.
+ *
+ * Emits a {IGovernor-VoteCast} event.
+ */
+ function _castVote(
+ uint256 proposalId,
+ address account,
+ uint8 support,
+ string memory reason,
+ bytes memory params
+ ) internal virtual returns (uint256) {
+ _validateStateBitmap(proposalId, _encodeStateBitmap(ProposalState.Active));
+
+ uint256 totalWeight = _getVotes(account, proposalSnapshot(proposalId), params);
+ uint256 votedWeight = _countVote(proposalId, account, support, totalWeight, params);
+
+ if (params.length == 0) {
+ emit VoteCast(account, proposalId, support, votedWeight, reason);
+ } else {
+ emit VoteCastWithParams(account, proposalId, support, votedWeight, reason, params);
+ }
+
+ _tallyUpdated(proposalId);
+
+ return votedWeight;
+ }
+
+ /**
+ * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor
+ * is some contract other than the governor itself, like when using a timelock, this function can be invoked
+ * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.
+ * Note that if the executor is simply the governor itself, use of `relay` is redundant.
+ */
+ function relay(address target, uint256 value, bytes calldata data) public payable virtual onlyGovernance {
+ (bool success, bytes memory returndata) = target.call{value: value}(data);
+ Address.verifyCallResult(success, returndata);
+ }
+
+ /**
+ * @dev Address through which the governor executes action. Will be overloaded by module that executes actions
+ * through another contract such as a timelock.
+ */
+ function _executor() internal view virtual returns (address) {
+ return address(this);
+ }
+
+ /**
+ * @dev See {IERC721Receiver-onERC721Received}.
+ * Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock).
+ */
+ function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) {
+ if (_executor() != address(this)) {
+ revert GovernorDisabledDeposit();
+ }
+ return this.onERC721Received.selector;
+ }
+
+ /**
+ * @dev See {IERC1155Receiver-onERC1155Received}.
+ * Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock).
+ */
+ function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual returns (bytes4) {
+ if (_executor() != address(this)) {
+ revert GovernorDisabledDeposit();
+ }
+ return this.onERC1155Received.selector;
+ }
+
+ /**
+ * @dev See {IERC1155Receiver-onERC1155BatchReceived}.
+ * Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock).
+ */
+ function onERC1155BatchReceived(
+ address,
+ address,
+ uint256[] memory,
+ uint256[] memory,
+ bytes memory
+ ) public virtual returns (bytes4) {
+ if (_executor() != address(this)) {
+ revert GovernorDisabledDeposit();
+ }
+ return this.onERC1155BatchReceived.selector;
+ }
+
+ /**
+ * @dev Encodes a `ProposalState` into a `bytes32` representation where each bit enabled corresponds to
+ * the underlying position in the `ProposalState` enum. For example:
+ *
+ * 0x000...10000
+ * ^^^^^^------ ...
+ * ^----- Succeeded
+ * ^---- Defeated
+ * ^--- Canceled
+ * ^-- Active
+ * ^- Pending
+ */
+ function _encodeStateBitmap(ProposalState proposalState) internal pure returns (bytes32) {
+ return bytes32(1 << uint8(proposalState));
+ }
+
+ /**
+ * @dev Check that the current state of a proposal matches the requirements described by the `allowedStates` bitmap.
+ * This bitmap should be built using `_encodeStateBitmap`.
+ *
+ * If requirements are not met, reverts with a {GovernorUnexpectedProposalState} error.
+ */
+ function _validateStateBitmap(uint256 proposalId, bytes32 allowedStates) internal view returns (ProposalState) {
+ ProposalState currentState = state(proposalId);
+ if (_encodeStateBitmap(currentState) & allowedStates == bytes32(0)) {
+ revert GovernorUnexpectedProposalState(proposalId, currentState, allowedStates);
+ }
+ return currentState;
+ }
+
+ /**
+ * @dev Check if the proposer is authorized to submit a proposal with the given description.
+ *
+ * If the proposal description ends with `#proposer=0x???`, where `0x???` is an address written as a hex string
+ * (case insensitive), then the submission of this proposal will only be authorized to said address.
+ *
+ * This is used for frontrunning protection. By adding this pattern at the end of their proposal, one can ensure
+ * that no other address can submit the same proposal. An attacker would have to either remove or change that part,
+ * which would result in a different proposal id.
+ *
+ * If the description does not match this pattern, it is unrestricted and anyone can submit it. This includes:
+ *
+ * - If the `0x???` part is not a valid hex string.
+ * - If the `0x???` part is a valid hex string, but does not contain exactly 40 hex digits.
+ * - If it ends with the expected suffix followed by newlines or other whitespace.
+ * - If it ends with some other similar suffix, e.g. `#other=abc`.
+ * - If it does not end with any such suffix.
+ */
+ function _isValidDescriptionForProposer(
+ address proposer,
+ string memory description
+ ) internal view virtual returns (bool) {
+ unchecked {
+ uint256 length = bytes(description).length;
+
+ // Length is too short to contain a valid proposer suffix
+ if (length < 52) {
+ return true;
+ }
+
+ // Extract what would be the `#proposer=` marker beginning the suffix
+ bytes10 marker = bytes10(_unsafeReadBytesOffset(bytes(description), length - 52));
+
+ // If the marker is not found, there is no proposer suffix to check
+ if (marker != bytes10("#proposer=")) {
+ return true;
+ }
+
+ // Check that the last 42 characters (after the marker) are a properly formatted address.
+ (bool success, address recovered) = Strings.tryParseAddress(description, length - 42, length);
+ return !success || recovered == proposer;
+ }
+ }
+
+ /**
+ * @dev Check if the `caller` can cancel the proposal with the given `proposalId`.
+ *
+ * The default implementation allows the proposal proposer to cancel the proposal during the pending state.
+ */
+ function _validateCancel(uint256 proposalId, address caller) internal view virtual returns (bool) {
+ return (state(proposalId) == ProposalState.Pending) && caller == proposalProposer(proposalId);
+ }
+
+ /// @inheritdoc IERC6372
+ function clock() public view virtual returns (uint48);
+
+ /// @inheritdoc IERC6372
+ // solhint-disable-next-line func-name-mixedcase
+ function CLOCK_MODE() public view virtual returns (string memory);
+
+ /// @inheritdoc IGovernor
+ function votingDelay() public view virtual returns (uint256);
+
+ /// @inheritdoc IGovernor
+ function votingPeriod() public view virtual returns (uint256);
+
+ /// @inheritdoc IGovernor
+ function quorum(uint256 timepoint) public view virtual returns (uint256);
+
+ /**
+ * @dev Reads a bytes32 from a bytes array without bounds checking.
+ *
+ * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the
+ * assembly block as such would prevent some optimizations.
+ */
+ function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {
+ // This is not memory safe in the general case, but all calls to this private function are within bounds.
+ assembly ("memory-safe") {
+ value := mload(add(add(buffer, 0x20), offset))
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/TimelockControllerUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/TimelockControllerUpgradeable.sol
new file mode 100644
index 0000000..67a15bf
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/TimelockControllerUpgradeable.sol
@@ -0,0 +1,497 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (governance/TimelockController.sol)
+
+pragma solidity ^0.8.20;
+
+import {AccessControlUpgradeable} from "../access/AccessControlUpgradeable.sol";
+import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";
+import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Contract module which acts as a timelocked controller. When set as the
+ * owner of an `Ownable` smart contract, it enforces a timelock on all
+ * `onlyOwner` maintenance operations. This gives time for users of the
+ * controlled contract to exit before a potentially dangerous maintenance
+ * operation is applied.
+ *
+ * By default, this contract is self administered, meaning administration tasks
+ * have to go through the timelock process. The proposer (resp executor) role
+ * is in charge of proposing (resp executing) operations. A common use case is
+ * to position this {TimelockController} as the owner of a smart contract, with
+ * a multisig or a DAO as the sole proposer.
+ */
+contract TimelockControllerUpgradeable is Initializable, AccessControlUpgradeable, ERC721Holder, ERC1155Holder {
+ bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE");
+ bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE");
+ bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE");
+ uint256 internal constant DONE_TIMESTAMP = uint256(1);
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.TimelockController
+ struct TimelockControllerStorage {
+ mapping(bytes32 id => uint256) _timestamps;
+ uint256 _minDelay;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.TimelockController")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant TimelockControllerStorageLocation = 0x9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb3600;
+
+ function _getTimelockControllerStorage() private pure returns (TimelockControllerStorage storage $) {
+ assembly {
+ $.slot := TimelockControllerStorageLocation
+ }
+ }
+
+ enum OperationState {
+ Unset,
+ Waiting,
+ Ready,
+ Done
+ }
+
+ /**
+ * @dev Mismatch between the parameters length for an operation call.
+ */
+ error TimelockInvalidOperationLength(uint256 targets, uint256 payloads, uint256 values);
+
+ /**
+ * @dev The schedule operation doesn't meet the minimum delay.
+ */
+ error TimelockInsufficientDelay(uint256 delay, uint256 minDelay);
+
+ /**
+ * @dev The current state of an operation is not as required.
+ * The `expectedStates` is a bitmap with the bits enabled for each OperationState enum position
+ * counting from right to left.
+ *
+ * See {_encodeStateBitmap}.
+ */
+ error TimelockUnexpectedOperationState(bytes32 operationId, bytes32 expectedStates);
+
+ /**
+ * @dev The predecessor to an operation not yet done.
+ */
+ error TimelockUnexecutedPredecessor(bytes32 predecessorId);
+
+ /**
+ * @dev The caller account is not authorized.
+ */
+ error TimelockUnauthorizedCaller(address caller);
+
+ /**
+ * @dev Emitted when a call is scheduled as part of operation `id`.
+ */
+ event CallScheduled(
+ bytes32 indexed id,
+ uint256 indexed index,
+ address target,
+ uint256 value,
+ bytes data,
+ bytes32 predecessor,
+ uint256 delay
+ );
+
+ /**
+ * @dev Emitted when a call is performed as part of operation `id`.
+ */
+ event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);
+
+ /**
+ * @dev Emitted when new proposal is scheduled with non-zero salt.
+ */
+ event CallSalt(bytes32 indexed id, bytes32 salt);
+
+ /**
+ * @dev Emitted when operation `id` is cancelled.
+ */
+ event Cancelled(bytes32 indexed id);
+
+ /**
+ * @dev Emitted when the minimum delay for future operations is modified.
+ */
+ event MinDelayChange(uint256 oldDuration, uint256 newDuration);
+
+ function initialize(uint256 minDelay, address[] memory proposers, address[] memory executors, address admin) public virtual initializer {
+ __TimelockController_init(minDelay, proposers, executors, admin);
+ }
+ /**
+ * @dev Initializes the contract with the following parameters:
+ *
+ * - `minDelay`: initial minimum delay in seconds for operations
+ * - `proposers`: accounts to be granted proposer and canceller roles
+ * - `executors`: accounts to be granted executor role
+ * - `admin`: optional account to be granted admin role; disable with zero address
+ *
+ * IMPORTANT: The optional admin can aid with initial configuration of roles after deployment
+ * without being subject to delay, but this role should be subsequently renounced in favor of
+ * administration through timelocked proposals. Previous versions of this contract would assign
+ * this admin to the deployer automatically and should be renounced as well.
+ */
+ function __TimelockController_init(uint256 minDelay, address[] memory proposers, address[] memory executors, address admin) internal onlyInitializing {
+ __TimelockController_init_unchained(minDelay, proposers, executors, admin);
+ }
+
+ function __TimelockController_init_unchained(uint256 minDelay, address[] memory proposers, address[] memory executors, address admin) internal onlyInitializing {
+ TimelockControllerStorage storage $ = _getTimelockControllerStorage();
+ // self administration
+ _grantRole(DEFAULT_ADMIN_ROLE, address(this));
+
+ // optional admin
+ if (admin != address(0)) {
+ _grantRole(DEFAULT_ADMIN_ROLE, admin);
+ }
+
+ // register proposers and cancellers
+ for (uint256 i = 0; i < proposers.length; ++i) {
+ _grantRole(PROPOSER_ROLE, proposers[i]);
+ _grantRole(CANCELLER_ROLE, proposers[i]);
+ }
+
+ // register executors
+ for (uint256 i = 0; i < executors.length; ++i) {
+ _grantRole(EXECUTOR_ROLE, executors[i]);
+ }
+
+ $._minDelay = minDelay;
+ emit MinDelayChange(0, minDelay);
+ }
+
+ /**
+ * @dev Modifier to make a function callable only by a certain role. In
+ * addition to checking the sender's role, `address(0)` 's role is also
+ * considered. Granting a role to `address(0)` is equivalent to enabling
+ * this role for everyone.
+ */
+ modifier onlyRoleOrOpenRole(bytes32 role) {
+ if (!hasRole(role, address(0))) {
+ _checkRole(role, _msgSender());
+ }
+ _;
+ }
+
+ /**
+ * @dev Contract might receive/hold ETH as part of the maintenance process.
+ */
+ receive() external payable virtual {}
+
+ /// @inheritdoc AccessControlUpgradeable
+ function supportsInterface(
+ bytes4 interfaceId
+ ) public view virtual override(AccessControlUpgradeable, ERC1155Holder) returns (bool) {
+ return super.supportsInterface(interfaceId);
+ }
+
+ /**
+ * @dev Returns whether an id corresponds to a registered operation. This
+ * includes both Waiting, Ready, and Done operations.
+ */
+ function isOperation(bytes32 id) public view returns (bool) {
+ return getOperationState(id) != OperationState.Unset;
+ }
+
+ /**
+ * @dev Returns whether an operation is pending or not. Note that a "pending" operation may also be "ready".
+ */
+ function isOperationPending(bytes32 id) public view returns (bool) {
+ OperationState state = getOperationState(id);
+ return state == OperationState.Waiting || state == OperationState.Ready;
+ }
+
+ /**
+ * @dev Returns whether an operation is ready for execution. Note that a "ready" operation is also "pending".
+ */
+ function isOperationReady(bytes32 id) public view returns (bool) {
+ return getOperationState(id) == OperationState.Ready;
+ }
+
+ /**
+ * @dev Returns whether an operation is done or not.
+ */
+ function isOperationDone(bytes32 id) public view returns (bool) {
+ return getOperationState(id) == OperationState.Done;
+ }
+
+ /**
+ * @dev Returns the timestamp at which an operation becomes ready (0 for
+ * unset operations, 1 for done operations).
+ */
+ function getTimestamp(bytes32 id) public view virtual returns (uint256) {
+ TimelockControllerStorage storage $ = _getTimelockControllerStorage();
+ return $._timestamps[id];
+ }
+
+ /**
+ * @dev Returns operation state.
+ */
+ function getOperationState(bytes32 id) public view virtual returns (OperationState) {
+ uint256 timestamp = getTimestamp(id);
+ if (timestamp == 0) {
+ return OperationState.Unset;
+ } else if (timestamp == DONE_TIMESTAMP) {
+ return OperationState.Done;
+ } else if (timestamp > block.timestamp) {
+ return OperationState.Waiting;
+ } else {
+ return OperationState.Ready;
+ }
+ }
+
+ /**
+ * @dev Returns the minimum delay in seconds for an operation to become valid.
+ *
+ * This value can be changed by executing an operation that calls `updateDelay`.
+ */
+ function getMinDelay() public view virtual returns (uint256) {
+ TimelockControllerStorage storage $ = _getTimelockControllerStorage();
+ return $._minDelay;
+ }
+
+ /**
+ * @dev Returns the identifier of an operation containing a single
+ * transaction.
+ */
+ function hashOperation(
+ address target,
+ uint256 value,
+ bytes calldata data,
+ bytes32 predecessor,
+ bytes32 salt
+ ) public pure virtual returns (bytes32) {
+ return keccak256(abi.encode(target, value, data, predecessor, salt));
+ }
+
+ /**
+ * @dev Returns the identifier of an operation containing a batch of
+ * transactions.
+ */
+ function hashOperationBatch(
+ address[] calldata targets,
+ uint256[] calldata values,
+ bytes[] calldata payloads,
+ bytes32 predecessor,
+ bytes32 salt
+ ) public pure virtual returns (bytes32) {
+ return keccak256(abi.encode(targets, values, payloads, predecessor, salt));
+ }
+
+ /**
+ * @dev Schedule an operation containing a single transaction.
+ *
+ * Emits {CallSalt} if salt is nonzero, and {CallScheduled}.
+ *
+ * Requirements:
+ *
+ * - the caller must have the 'proposer' role.
+ */
+ function schedule(
+ address target,
+ uint256 value,
+ bytes calldata data,
+ bytes32 predecessor,
+ bytes32 salt,
+ uint256 delay
+ ) public virtual onlyRole(PROPOSER_ROLE) {
+ bytes32 id = hashOperation(target, value, data, predecessor, salt);
+ _schedule(id, delay);
+ emit CallScheduled(id, 0, target, value, data, predecessor, delay);
+ if (salt != bytes32(0)) {
+ emit CallSalt(id, salt);
+ }
+ }
+
+ /**
+ * @dev Schedule an operation containing a batch of transactions.
+ *
+ * Emits {CallSalt} if salt is nonzero, and one {CallScheduled} event per transaction in the batch.
+ *
+ * Requirements:
+ *
+ * - the caller must have the 'proposer' role.
+ */
+ function scheduleBatch(
+ address[] calldata targets,
+ uint256[] calldata values,
+ bytes[] calldata payloads,
+ bytes32 predecessor,
+ bytes32 salt,
+ uint256 delay
+ ) public virtual onlyRole(PROPOSER_ROLE) {
+ if (targets.length != values.length || targets.length != payloads.length) {
+ revert TimelockInvalidOperationLength(targets.length, payloads.length, values.length);
+ }
+
+ bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);
+ _schedule(id, delay);
+ for (uint256 i = 0; i < targets.length; ++i) {
+ emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);
+ }
+ if (salt != bytes32(0)) {
+ emit CallSalt(id, salt);
+ }
+ }
+
+ /**
+ * @dev Schedule an operation that is to become valid after a given delay.
+ */
+ function _schedule(bytes32 id, uint256 delay) private {
+ TimelockControllerStorage storage $ = _getTimelockControllerStorage();
+ if (isOperation(id)) {
+ revert TimelockUnexpectedOperationState(id, _encodeStateBitmap(OperationState.Unset));
+ }
+ uint256 minDelay = getMinDelay();
+ if (delay < minDelay) {
+ revert TimelockInsufficientDelay(delay, minDelay);
+ }
+ $._timestamps[id] = block.timestamp + delay;
+ }
+
+ /**
+ * @dev Cancel an operation.
+ *
+ * Requirements:
+ *
+ * - the caller must have the 'canceller' role.
+ */
+ function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {
+ TimelockControllerStorage storage $ = _getTimelockControllerStorage();
+ if (!isOperationPending(id)) {
+ revert TimelockUnexpectedOperationState(
+ id,
+ _encodeStateBitmap(OperationState.Waiting) | _encodeStateBitmap(OperationState.Ready)
+ );
+ }
+ delete $._timestamps[id];
+
+ emit Cancelled(id);
+ }
+
+ /**
+ * @dev Execute a ready operation containing a single transaction.
+ *
+ * Emits a {CallExecuted} event.
+ *
+ * Requirements:
+ *
+ * - the caller must have the 'executor' role.
+ */
+ // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,
+ // thus any modifications to the operation during reentrancy should be caught.
+ // slither-disable-next-line reentrancy-eth
+ function execute(
+ address target,
+ uint256 value,
+ bytes calldata payload,
+ bytes32 predecessor,
+ bytes32 salt
+ ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {
+ bytes32 id = hashOperation(target, value, payload, predecessor, salt);
+
+ _beforeCall(id, predecessor);
+ _execute(target, value, payload);
+ emit CallExecuted(id, 0, target, value, payload);
+ _afterCall(id);
+ }
+
+ /**
+ * @dev Execute a ready operation containing a batch of transactions.
+ *
+ * Emits one {CallExecuted} event per transaction in the batch.
+ *
+ * Requirements:
+ *
+ * - the caller must have the 'executor' role.
+ */
+ // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,
+ // thus any modifications to the operation during reentrancy should be caught.
+ // slither-disable-next-line reentrancy-eth
+ function executeBatch(
+ address[] calldata targets,
+ uint256[] calldata values,
+ bytes[] calldata payloads,
+ bytes32 predecessor,
+ bytes32 salt
+ ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {
+ if (targets.length != values.length || targets.length != payloads.length) {
+ revert TimelockInvalidOperationLength(targets.length, payloads.length, values.length);
+ }
+
+ bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);
+
+ _beforeCall(id, predecessor);
+ for (uint256 i = 0; i < targets.length; ++i) {
+ address target = targets[i];
+ uint256 value = values[i];
+ bytes calldata payload = payloads[i];
+ _execute(target, value, payload);
+ emit CallExecuted(id, i, target, value, payload);
+ }
+ _afterCall(id);
+ }
+
+ /**
+ * @dev Execute an operation's call.
+ */
+ function _execute(address target, uint256 value, bytes calldata data) internal virtual {
+ (bool success, bytes memory returndata) = target.call{value: value}(data);
+ Address.verifyCallResult(success, returndata);
+ }
+
+ /**
+ * @dev Checks before execution of an operation's calls.
+ */
+ function _beforeCall(bytes32 id, bytes32 predecessor) private view {
+ if (!isOperationReady(id)) {
+ revert TimelockUnexpectedOperationState(id, _encodeStateBitmap(OperationState.Ready));
+ }
+ if (predecessor != bytes32(0) && !isOperationDone(predecessor)) {
+ revert TimelockUnexecutedPredecessor(predecessor);
+ }
+ }
+
+ /**
+ * @dev Checks after execution of an operation's calls.
+ */
+ function _afterCall(bytes32 id) private {
+ TimelockControllerStorage storage $ = _getTimelockControllerStorage();
+ if (!isOperationReady(id)) {
+ revert TimelockUnexpectedOperationState(id, _encodeStateBitmap(OperationState.Ready));
+ }
+ $._timestamps[id] = DONE_TIMESTAMP;
+ }
+
+ /**
+ * @dev Changes the minimum timelock duration for future operations.
+ *
+ * Emits a {MinDelayChange} event.
+ *
+ * Requirements:
+ *
+ * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing
+ * an operation where the timelock is the target and the data is the ABI-encoded call to this function.
+ */
+ function updateDelay(uint256 newDelay) public virtual {
+ TimelockControllerStorage storage $ = _getTimelockControllerStorage();
+ address sender = _msgSender();
+ if (sender != address(this)) {
+ revert TimelockUnauthorizedCaller(sender);
+ }
+ emit MinDelayChange($._minDelay, newDelay);
+ $._minDelay = newDelay;
+ }
+
+ /**
+ * @dev Encodes a `OperationState` into a `bytes32` representation where each bit enabled corresponds to
+ * the underlying position in the `OperationState` enum. For example:
+ *
+ * 0x000...1000
+ * ^^^^^^----- ...
+ * ^---- Done
+ * ^--- Ready
+ * ^-- Waiting
+ * ^- Unset
+ */
+ function _encodeStateBitmap(OperationState operationState) internal pure returns (bytes32) {
+ return bytes32(1 << uint8(operationState));
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingFractionalUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingFractionalUpgradeable.sol
new file mode 100644
index 0000000..03cb528
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingFractionalUpgradeable.sol
@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorCountingFractional.sol)
+
+pragma solidity ^0.8.24;
+
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {GovernorCountingSimpleUpgradeable} from "./GovernorCountingSimpleUpgradeable.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} for fractional voting.
+ *
+ * Similar to {GovernorCountingSimple}, this contract is a votes counting module for {Governor} that supports 3 options:
+ * Against, For, Abstain. Additionally, it includes a fourth option: Fractional, which allows voters to split their voting
+ * power amongst the other 3 options.
+ *
+ * Votes cast with the Fractional support must be accompanied by a `params` argument that is three packed `uint128` values
+ * representing the weight the delegate assigns to Against, For, and Abstain respectively. For those votes cast for the other
+ * 3 options, the `params` argument must be empty.
+ *
+ * This is mostly useful when the delegate is a contract that implements its own rules for voting. These delegate-contracts
+ * can cast fractional votes according to the preferences of multiple entities delegating their voting power.
+ *
+ * Some example use cases include:
+ *
+ * * Voting from tokens that are held by a DeFi pool
+ * * Voting from an L2 with tokens held by a bridge
+ * * Voting privately from a shielded pool using zero knowledge proofs.
+ *
+ * Based on ScopeLift's https://github.com/ScopeLift/flexible-voting/blob/e5de2efd1368387b840931f19f3c184c85842761/src/GovernorCountingFractional.sol[`GovernorCountingFractional`]
+ *
+ * _Available since v5.1._
+ */
+abstract contract GovernorCountingFractionalUpgradeable is Initializable, GovernorUpgradeable {
+ using Math for *;
+
+ uint8 internal constant VOTE_TYPE_FRACTIONAL = 255;
+
+ struct ProposalVote {
+ uint256 againstVotes;
+ uint256 forVotes;
+ uint256 abstainVotes;
+ mapping(address voter => uint256) usedVotes;
+ }
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorCountingFractional
+ struct GovernorCountingFractionalStorage {
+ /**
+ * @dev Mapping from proposal ID to vote tallies for that proposal.
+ */
+ mapping(uint256 proposalId => ProposalVote) _proposalVotes;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorCountingFractional")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorCountingFractionalStorageLocation = 0xd073797d8f9d07d835a3fc13195afeafd2f137da609f97a44f7a3aa434170800;
+
+ function _getGovernorCountingFractionalStorage() private pure returns (GovernorCountingFractionalStorage storage $) {
+ assembly {
+ $.slot := GovernorCountingFractionalStorageLocation
+ }
+ }
+
+ /**
+ * @dev A fractional vote params uses more votes than are available for that user.
+ */
+ error GovernorExceedRemainingWeight(address voter, uint256 usedVotes, uint256 remainingWeight);
+
+ function __GovernorCountingFractional_init() internal onlyInitializing {
+ }
+
+ function __GovernorCountingFractional_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IGovernor
+ // solhint-disable-next-line func-name-mixedcase
+ function COUNTING_MODE() public pure virtual override returns (string memory) {
+ return "support=bravo,fractional&quorum=for,abstain¶ms=fractional";
+ }
+
+ /// @inheritdoc IGovernor
+ function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {
+ return usedVotes(proposalId, account) > 0;
+ }
+
+ /**
+ * @dev Get the number of votes already cast by `account` for a proposal with `proposalId`. Useful for
+ * integrations that allow delegates to cast rolling, partial votes.
+ */
+ function usedVotes(uint256 proposalId, address account) public view virtual returns (uint256) {
+ GovernorCountingFractionalStorage storage $ = _getGovernorCountingFractionalStorage();
+ return $._proposalVotes[proposalId].usedVotes[account];
+ }
+
+ /**
+ * @dev Get current distribution of votes for a given proposal.
+ */
+ function proposalVotes(
+ uint256 proposalId
+ ) public view virtual returns (uint256 againstVotes, uint256 forVotes, uint256 abstainVotes) {
+ GovernorCountingFractionalStorage storage $ = _getGovernorCountingFractionalStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+ return (proposalVote.againstVotes, proposalVote.forVotes, proposalVote.abstainVotes);
+ }
+
+ /// @inheritdoc GovernorUpgradeable
+ function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {
+ GovernorCountingFractionalStorage storage $ = _getGovernorCountingFractionalStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+ return quorum(proposalSnapshot(proposalId)) <= proposalVote.forVotes + proposalVote.abstainVotes;
+ }
+
+ /**
+ * @dev See {Governor-_voteSucceeded}. In this module, forVotes must be > againstVotes.
+ */
+ function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {
+ GovernorCountingFractionalStorage storage $ = _getGovernorCountingFractionalStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+ return proposalVote.forVotes > proposalVote.againstVotes;
+ }
+
+ /**
+ * @dev See {Governor-_countVote}. Function that records the delegate's votes.
+ *
+ * Executing this function consumes (part of) the delegate's weight on the proposal. This weight can be
+ * distributed amongst the 3 options (Against, For, Abstain) by specifying a fractional `support`.
+ *
+ * This counting module supports two vote casting modes: nominal and fractional.
+ *
+ * - Nominal: A nominal vote is cast by setting `support` to one of the 3 bravo options (Against, For, Abstain).
+ * - Fractional: A fractional vote is cast by setting `support` to `type(uint8).max` (255).
+ *
+ * Casting a nominal vote requires `params` to be empty and consumes the delegate's full remaining weight on the
+ * proposal for the specified `support` option. This is similar to the {GovernorCountingSimple} module and follows
+ * the `VoteType` enum from Governor Bravo. As a consequence, no vote weight remains unspent so no further voting
+ * is possible (for this `proposalId` and this `account`).
+ *
+ * Casting a fractional vote consumes a fraction of the delegate's remaining weight on the proposal according to the
+ * weights the delegate assigns to each support option (Against, For, Abstain respectively). The sum total of the
+ * three decoded vote weights _must_ be less than or equal to the delegate's remaining weight on the proposal (i.e.
+ * their checkpointed total weight minus votes already cast on the proposal). This format can be produced using:
+ *
+ * `abi.encodePacked(uint128(againstVotes), uint128(forVotes), uint128(abstainVotes))`
+ *
+ * NOTE: Consider that fractional voting restricts the number of casted votes (in each category) to 128 bits.
+ * Depending on how many decimals the underlying token has, a single voter may require to split their vote into
+ * multiple vote operations. For precision higher than ~30 decimals, large token holders may require a
+ * potentially large number of calls to cast all their votes. The voter has the possibility to cast all the
+ * remaining votes in a single operation using the traditional "bravo" vote.
+ */
+ // slither-disable-next-line cyclomatic-complexity
+ function _countVote(
+ uint256 proposalId,
+ address account,
+ uint8 support,
+ uint256 totalWeight,
+ bytes memory params
+ ) internal virtual override returns (uint256) {
+ GovernorCountingFractionalStorage storage $ = _getGovernorCountingFractionalStorage();
+ // Compute number of remaining votes. Returns 0 on overflow.
+ (, uint256 remainingWeight) = totalWeight.trySub(usedVotes(proposalId, account));
+ if (remainingWeight == 0) {
+ revert GovernorAlreadyCastVote(account);
+ }
+
+ uint256 againstVotes = 0;
+ uint256 forVotes = 0;
+ uint256 abstainVotes = 0;
+ uint256 usedWeight = 0;
+
+ // For clarity of event indexing, fractional voting must be clearly advertised in the "support" field.
+ //
+ // Supported `support` value must be:
+ // - "Full" voting: `support = 0` (Against), `1` (For) or `2` (Abstain), with empty params.
+ // - "Fractional" voting: `support = 255`, with 48 bytes params.
+ if (support == uint8(GovernorCountingSimpleUpgradeable.VoteType.Against)) {
+ if (params.length != 0) revert GovernorInvalidVoteParams();
+ usedWeight = againstVotes = remainingWeight;
+ } else if (support == uint8(GovernorCountingSimpleUpgradeable.VoteType.For)) {
+ if (params.length != 0) revert GovernorInvalidVoteParams();
+ usedWeight = forVotes = remainingWeight;
+ } else if (support == uint8(GovernorCountingSimpleUpgradeable.VoteType.Abstain)) {
+ if (params.length != 0) revert GovernorInvalidVoteParams();
+ usedWeight = abstainVotes = remainingWeight;
+ } else if (support == VOTE_TYPE_FRACTIONAL) {
+ // The `params` argument is expected to be three packed `uint128`:
+ // `abi.encodePacked(uint128(againstVotes), uint128(forVotes), uint128(abstainVotes))`
+ if (params.length != 0x30) revert GovernorInvalidVoteParams();
+
+ assembly ("memory-safe") {
+ againstVotes := shr(128, mload(add(params, 0x20)))
+ forVotes := shr(128, mload(add(params, 0x30)))
+ abstainVotes := shr(128, mload(add(params, 0x40)))
+ usedWeight := add(add(againstVotes, forVotes), abstainVotes) // inputs are uint128: cannot overflow
+ }
+
+ // check parsed arguments are valid
+ if (usedWeight > remainingWeight) {
+ revert GovernorExceedRemainingWeight(account, usedWeight, remainingWeight);
+ }
+ } else {
+ revert GovernorInvalidVoteType();
+ }
+
+ // update votes tracking
+ ProposalVote storage details = $._proposalVotes[proposalId];
+ if (againstVotes > 0) details.againstVotes += againstVotes;
+ if (forVotes > 0) details.forVotes += forVotes;
+ if (abstainVotes > 0) details.abstainVotes += abstainVotes;
+ details.usedVotes[account] += usedWeight;
+
+ return usedWeight;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingOverridableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingOverridableUpgradeable.sol
new file mode 100644
index 0000000..6412351
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingOverridableUpgradeable.sol
@@ -0,0 +1,248 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorCountingOverridable.sol)
+
+pragma solidity ^0.8.24;
+
+import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {VotesExtendedUpgradeable} from "../utils/VotesExtendedUpgradeable.sol";
+import {GovernorVotesUpgradeable} from "./GovernorVotesUpgradeable.sol";
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} which enables delegators to override the vote of their delegates. This module requires a
+ * token that inherits {VotesExtended}.
+ */
+abstract contract GovernorCountingOverridableUpgradeable is Initializable, GovernorVotesUpgradeable {
+ bytes32 public constant OVERRIDE_BALLOT_TYPEHASH =
+ keccak256("OverrideBallot(uint256 proposalId,uint8 support,address voter,uint256 nonce,string reason)");
+
+ /**
+ * @dev Supported vote types. Matches Governor Bravo ordering.
+ */
+ enum VoteType {
+ Against,
+ For,
+ Abstain
+ }
+
+ struct VoteReceipt {
+ uint8 casted; // 0 if vote was not casted. Otherwise: support + 1
+ bool hasOverridden;
+ uint208 overriddenWeight;
+ }
+
+ struct ProposalVote {
+ uint256[3] votes;
+ mapping(address voter => VoteReceipt) voteReceipt;
+ }
+
+ /// @dev The votes casted by `delegate` were reduced by `weight` after an override vote was casted by the original token holder
+ event VoteReduced(address indexed delegate, uint256 proposalId, uint8 support, uint256 weight);
+
+ /// @dev A delegated vote on `proposalId` was overridden by `weight`
+ event OverrideVoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);
+
+ error GovernorAlreadyOverriddenVote(address account);
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorCountingOverridable
+ struct GovernorCountingOverridableStorage {
+ mapping(uint256 proposalId => ProposalVote) _proposalVotes;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorCountingOverridable")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorCountingOverridableStorageLocation = 0xbffde6e7ca736efb3d8171f99b09abc076e81f804bf1703dc71fb0b1f7715100;
+
+ function _getGovernorCountingOverridableStorage() private pure returns (GovernorCountingOverridableStorage storage $) {
+ assembly {
+ $.slot := GovernorCountingOverridableStorageLocation
+ }
+ }
+
+ function __GovernorCountingOverridable_init() internal onlyInitializing {
+ }
+
+ function __GovernorCountingOverridable_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IGovernor
+ // solhint-disable-next-line func-name-mixedcase
+ function COUNTING_MODE() public pure virtual override returns (string memory) {
+ return "support=bravo,override&quorum=for,abstain&overridable=true";
+ }
+
+ /**
+ * @dev See {IGovernor-hasVoted}.
+ *
+ * NOTE: Calling {castVote} (or similar) casts a vote using the voting power that is delegated to the voter.
+ * Conversely, calling {castOverrideVote} (or similar) uses the voting power of the account itself, from its asset
+ * balances. Casting an "override vote" does not count as voting and won't be reflected by this getter. Consider
+ * using {hasVotedOverride} to check if an account has casted an "override vote" for a given proposal id.
+ */
+ function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {
+ GovernorCountingOverridableStorage storage $ = _getGovernorCountingOverridableStorage();
+ return $._proposalVotes[proposalId].voteReceipt[account].casted != 0;
+ }
+
+ /**
+ * @dev Check if an `account` has overridden their delegate for a proposal.
+ */
+ function hasVotedOverride(uint256 proposalId, address account) public view virtual returns (bool) {
+ GovernorCountingOverridableStorage storage $ = _getGovernorCountingOverridableStorage();
+ return $._proposalVotes[proposalId].voteReceipt[account].hasOverridden;
+ }
+
+ /**
+ * @dev Accessor to the internal vote counts.
+ */
+ function proposalVotes(
+ uint256 proposalId
+ ) public view virtual returns (uint256 againstVotes, uint256 forVotes, uint256 abstainVotes) {
+ GovernorCountingOverridableStorage storage $ = _getGovernorCountingOverridableStorage();
+ uint256[3] storage votes = $._proposalVotes[proposalId].votes;
+ return (votes[uint8(VoteType.Against)], votes[uint8(VoteType.For)], votes[uint8(VoteType.Abstain)]);
+ }
+
+ /// @inheritdoc GovernorUpgradeable
+ function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {
+ GovernorCountingOverridableStorage storage $ = _getGovernorCountingOverridableStorage();
+ uint256[3] storage votes = $._proposalVotes[proposalId].votes;
+ return quorum(proposalSnapshot(proposalId)) <= votes[uint8(VoteType.For)] + votes[uint8(VoteType.Abstain)];
+ }
+
+ /**
+ * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.
+ */
+ function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {
+ GovernorCountingOverridableStorage storage $ = _getGovernorCountingOverridableStorage();
+ uint256[3] storage votes = $._proposalVotes[proposalId].votes;
+ return votes[uint8(VoteType.For)] > votes[uint8(VoteType.Against)];
+ }
+
+ /**
+ * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).
+ *
+ * NOTE: called by {Governor-_castVote} which emits the {IGovernor-VoteCast} (or {IGovernor-VoteCastWithParams})
+ * event.
+ */
+ function _countVote(
+ uint256 proposalId,
+ address account,
+ uint8 support,
+ uint256 totalWeight,
+ bytes memory /*params*/
+ ) internal virtual override returns (uint256) {
+ GovernorCountingOverridableStorage storage $ = _getGovernorCountingOverridableStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+
+ if (support > uint8(VoteType.Abstain)) {
+ revert GovernorInvalidVoteType();
+ }
+
+ if (proposalVote.voteReceipt[account].casted != 0) {
+ revert GovernorAlreadyCastVote(account);
+ }
+
+ totalWeight -= proposalVote.voteReceipt[account].overriddenWeight;
+ proposalVote.votes[support] += totalWeight;
+ proposalVote.voteReceipt[account].casted = support + 1;
+
+ return totalWeight;
+ }
+
+ /**
+ * @dev Variant of {Governor-_countVote} that deals with vote overrides.
+ *
+ * NOTE: See {hasVoted} for more details about the difference between {castVote} and {castOverrideVote}.
+ */
+ function _countOverride(uint256 proposalId, address account, uint8 support) internal virtual returns (uint256) {
+ GovernorCountingOverridableStorage storage $ = _getGovernorCountingOverridableStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+
+ if (support > uint8(VoteType.Abstain)) {
+ revert GovernorInvalidVoteType();
+ }
+
+ if (proposalVote.voteReceipt[account].hasOverridden) {
+ revert GovernorAlreadyOverriddenVote(account);
+ }
+
+ uint256 snapshot = proposalSnapshot(proposalId);
+ uint256 overriddenWeight = VotesExtendedUpgradeable(address(token())).getPastBalanceOf(account, snapshot);
+ address delegate = VotesExtendedUpgradeable(address(token())).getPastDelegate(account, snapshot);
+ uint8 delegateCasted = proposalVote.voteReceipt[delegate].casted;
+
+ proposalVote.voteReceipt[account].hasOverridden = true;
+ proposalVote.votes[support] += overriddenWeight;
+ if (delegateCasted == 0) {
+ proposalVote.voteReceipt[delegate].overriddenWeight += SafeCast.toUint208(overriddenWeight);
+ } else {
+ uint8 delegateSupport = delegateCasted - 1;
+ proposalVote.votes[delegateSupport] -= overriddenWeight;
+ emit VoteReduced(delegate, proposalId, delegateSupport, overriddenWeight);
+ }
+
+ return overriddenWeight;
+ }
+
+ /// @dev Variant of {Governor-_castVote} that deals with vote overrides. Returns the overridden weight.
+ function _castOverride(
+ uint256 proposalId,
+ address account,
+ uint8 support,
+ string calldata reason
+ ) internal virtual returns (uint256) {
+ _validateStateBitmap(proposalId, _encodeStateBitmap(ProposalState.Active));
+
+ uint256 overriddenWeight = _countOverride(proposalId, account, support);
+
+ emit OverrideVoteCast(account, proposalId, support, overriddenWeight, reason);
+
+ _tallyUpdated(proposalId);
+
+ return overriddenWeight;
+ }
+
+ /// @dev Public function for casting an override vote. Returns the overridden weight.
+ function castOverrideVote(
+ uint256 proposalId,
+ uint8 support,
+ string calldata reason
+ ) public virtual returns (uint256) {
+ address voter = _msgSender();
+ return _castOverride(proposalId, voter, support, reason);
+ }
+
+ /// @dev Public function for casting an override vote using a voter's signature. Returns the overridden weight.
+ function castOverrideVoteBySig(
+ uint256 proposalId,
+ uint8 support,
+ address voter,
+ string calldata reason,
+ bytes calldata signature
+ ) public virtual returns (uint256) {
+ bool valid = SignatureChecker.isValidSignatureNow(
+ voter,
+ _hashTypedDataV4(
+ keccak256(
+ abi.encode(
+ OVERRIDE_BALLOT_TYPEHASH,
+ proposalId,
+ support,
+ voter,
+ _useNonce(voter),
+ keccak256(bytes(reason))
+ )
+ )
+ ),
+ signature
+ );
+
+ if (!valid) {
+ revert GovernorInvalidSignature(voter);
+ }
+
+ return _castOverride(proposalId, voter, support, reason);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingSimpleUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingSimpleUpgradeable.sol
new file mode 100644
index 0000000..ebf0a77
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorCountingSimpleUpgradeable.sol
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorCountingSimple.sol)
+
+pragma solidity ^0.8.24;
+
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} for simple, 3 options, vote counting.
+ */
+abstract contract GovernorCountingSimpleUpgradeable is Initializable, GovernorUpgradeable {
+ /**
+ * @dev Supported vote types. Matches Governor Bravo ordering.
+ */
+ enum VoteType {
+ Against,
+ For,
+ Abstain
+ }
+
+ struct ProposalVote {
+ uint256 againstVotes;
+ uint256 forVotes;
+ uint256 abstainVotes;
+ mapping(address voter => bool) hasVoted;
+ }
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorCountingSimple
+ struct GovernorCountingSimpleStorage {
+ mapping(uint256 proposalId => ProposalVote) _proposalVotes;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorCountingSimple")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorCountingSimpleStorageLocation = 0xa1cefa0f43667ef127a258e673c94202a79b656e62899531c4376d87a7f39800;
+
+ function _getGovernorCountingSimpleStorage() private pure returns (GovernorCountingSimpleStorage storage $) {
+ assembly {
+ $.slot := GovernorCountingSimpleStorageLocation
+ }
+ }
+
+ function __GovernorCountingSimple_init() internal onlyInitializing {
+ }
+
+ function __GovernorCountingSimple_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IGovernor
+ // solhint-disable-next-line func-name-mixedcase
+ function COUNTING_MODE() public pure virtual override returns (string memory) {
+ return "support=bravo&quorum=for,abstain";
+ }
+
+ /// @inheritdoc IGovernor
+ function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {
+ GovernorCountingSimpleStorage storage $ = _getGovernorCountingSimpleStorage();
+ return $._proposalVotes[proposalId].hasVoted[account];
+ }
+
+ /**
+ * @dev Accessor to the internal vote counts.
+ */
+ function proposalVotes(
+ uint256 proposalId
+ ) public view virtual returns (uint256 againstVotes, uint256 forVotes, uint256 abstainVotes) {
+ GovernorCountingSimpleStorage storage $ = _getGovernorCountingSimpleStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+ return (proposalVote.againstVotes, proposalVote.forVotes, proposalVote.abstainVotes);
+ }
+
+ /// @inheritdoc GovernorUpgradeable
+ function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {
+ GovernorCountingSimpleStorage storage $ = _getGovernorCountingSimpleStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+
+ return quorum(proposalSnapshot(proposalId)) <= proposalVote.forVotes + proposalVote.abstainVotes;
+ }
+
+ /**
+ * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.
+ */
+ function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {
+ GovernorCountingSimpleStorage storage $ = _getGovernorCountingSimpleStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+
+ return proposalVote.forVotes > proposalVote.againstVotes;
+ }
+
+ /**
+ * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).
+ */
+ function _countVote(
+ uint256 proposalId,
+ address account,
+ uint8 support,
+ uint256 totalWeight,
+ bytes memory // params
+ ) internal virtual override returns (uint256) {
+ GovernorCountingSimpleStorage storage $ = _getGovernorCountingSimpleStorage();
+ ProposalVote storage proposalVote = $._proposalVotes[proposalId];
+
+ if (proposalVote.hasVoted[account]) {
+ revert GovernorAlreadyCastVote(account);
+ }
+ proposalVote.hasVoted[account] = true;
+
+ if (support == uint8(VoteType.Against)) {
+ proposalVote.againstVotes += totalWeight;
+ } else if (support == uint8(VoteType.For)) {
+ proposalVote.forVotes += totalWeight;
+ } else if (support == uint8(VoteType.Abstain)) {
+ proposalVote.abstainVotes += totalWeight;
+ } else {
+ revert GovernorInvalidVoteType();
+ }
+
+ return totalWeight;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorNoncesKeyedUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorNoncesKeyedUpgradeable.sol
new file mode 100644
index 0000000..348deb6
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorNoncesKeyedUpgradeable.sol
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorNoncesKeyed.sol)
+
+pragma solidity ^0.8.24;
+
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {NoncesUpgradeable} from "../../utils/NoncesUpgradeable.sol";
+import {NoncesKeyedUpgradeable} from "../../utils/NoncesKeyedUpgradeable.sol";
+import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev An extension of {Governor} that extends existing nonce management to use {NoncesKeyed}, where the key is the low-order 192 bits of the `proposalId`.
+ * This is useful for voting by signature while maintaining separate sequences of nonces for each proposal.
+ *
+ * NOTE: Traditional (un-keyed) nonces are still supported and can continue to be used as if this extension was not present.
+ */
+abstract contract GovernorNoncesKeyedUpgradeable is Initializable, GovernorUpgradeable, NoncesKeyedUpgradeable {
+ function __GovernorNoncesKeyed_init() internal onlyInitializing {
+ }
+
+ function __GovernorNoncesKeyed_init_unchained() internal onlyInitializing {
+ }
+ function _useCheckedNonce(address owner, uint256 nonce) internal virtual override(NoncesUpgradeable, NoncesKeyedUpgradeable) {
+ super._useCheckedNonce(owner, nonce);
+ }
+
+ /**
+ * @dev Check the signature against keyed nonce and falls back to the traditional nonce.
+ *
+ * NOTE: This function won't call `super._validateVoteSig` if the keyed nonce is valid.
+ * Side effects may be skipped depending on the linearization of the function.
+ */
+ function _validateVoteSig(
+ uint256 proposalId,
+ uint8 support,
+ address voter,
+ bytes memory signature
+ ) internal virtual override returns (bool) {
+ if (
+ SignatureChecker.isValidSignatureNow(
+ voter,
+ _hashTypedDataV4(
+ keccak256(
+ abi.encode(BALLOT_TYPEHASH, proposalId, support, voter, nonces(voter, uint192(proposalId)))
+ )
+ ),
+ signature
+ )
+ ) {
+ _useNonce(voter, uint192(proposalId));
+ return true;
+ } else {
+ return super._validateVoteSig(proposalId, support, voter, signature);
+ }
+ }
+
+ /**
+ * @dev Check the signature against keyed nonce and falls back to the traditional nonce.
+ *
+ * NOTE: This function won't call `super._validateExtendedVoteSig` if the keyed nonce is valid.
+ * Side effects may be skipped depending on the linearization of the function.
+ */
+ function _validateExtendedVoteSig(
+ uint256 proposalId,
+ uint8 support,
+ address voter,
+ string memory reason,
+ bytes memory params,
+ bytes memory signature
+ ) internal virtual override returns (bool) {
+ if (
+ SignatureChecker.isValidSignatureNow(
+ voter,
+ _hashTypedDataV4(
+ keccak256(
+ abi.encode(
+ EXTENDED_BALLOT_TYPEHASH,
+ proposalId,
+ support,
+ voter,
+ nonces(voter, uint192(proposalId)),
+ keccak256(bytes(reason)),
+ keccak256(params)
+ )
+ )
+ ),
+ signature
+ )
+ ) {
+ _useNonce(voter, uint192(proposalId));
+ return true;
+ } else {
+ return super._validateExtendedVoteSig(proposalId, support, voter, reason, params, signature);
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorPreventLateQuorumUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorPreventLateQuorumUpgradeable.sol
new file mode 100644
index 0000000..d337d30
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorPreventLateQuorumUpgradeable.sol
@@ -0,0 +1,113 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorPreventLateQuorum.sol)
+
+pragma solidity ^0.8.24;
+
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev A module that ensures there is a minimum voting period after quorum is reached. This prevents a large voter from
+ * swaying a vote and triggering quorum at the last minute, by ensuring there is always time for other voters to react
+ * and try to oppose the decision.
+ *
+ * If a vote causes quorum to be reached, the proposal's voting period may be extended so that it does not end before at
+ * least a specified time has passed (the "vote extension" parameter). This parameter can be set through a governance
+ * proposal.
+ */
+abstract contract GovernorPreventLateQuorumUpgradeable is Initializable, GovernorUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorPreventLateQuorum
+ struct GovernorPreventLateQuorumStorage {
+ uint48 _voteExtension;
+
+ mapping(uint256 proposalId => uint48) _extendedDeadlines;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorPreventLateQuorum")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorPreventLateQuorumStorageLocation = 0x042f525fd47e44d02e065dd7bb464f47b4f926fbd05b5e087891ebd756adf100;
+
+ function _getGovernorPreventLateQuorumStorage() private pure returns (GovernorPreventLateQuorumStorage storage $) {
+ assembly {
+ $.slot := GovernorPreventLateQuorumStorageLocation
+ }
+ }
+
+ /// @dev Emitted when a proposal deadline is pushed back due to reaching quorum late in its voting period.
+ event ProposalExtended(uint256 indexed proposalId, uint64 extendedDeadline);
+
+ /// @dev Emitted when the {lateQuorumVoteExtension} parameter is changed.
+ event LateQuorumVoteExtensionSet(uint64 oldVoteExtension, uint64 newVoteExtension);
+
+ /**
+ * @dev Initializes the vote extension parameter: the time in either number of blocks or seconds (depending on the
+ * governor clock mode) that is required to pass since the moment a proposal reaches quorum until its voting period
+ * ends. If necessary the voting period will be extended beyond the one set during proposal creation.
+ */
+ function __GovernorPreventLateQuorum_init(uint48 initialVoteExtension) internal onlyInitializing {
+ __GovernorPreventLateQuorum_init_unchained(initialVoteExtension);
+ }
+
+ function __GovernorPreventLateQuorum_init_unchained(uint48 initialVoteExtension) internal onlyInitializing {
+ _setLateQuorumVoteExtension(initialVoteExtension);
+ }
+
+ /**
+ * @dev Returns the proposal deadline, which may have been extended beyond that set at proposal creation, if the
+ * proposal reached quorum late in the voting period. See {Governor-proposalDeadline}.
+ */
+ function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {
+ GovernorPreventLateQuorumStorage storage $ = _getGovernorPreventLateQuorumStorage();
+ return Math.max(super.proposalDeadline(proposalId), $._extendedDeadlines[proposalId]);
+ }
+
+ /**
+ * @dev Vote tally updated and detects if it caused quorum to be reached, potentially extending the voting period.
+ *
+ * May emit a {ProposalExtended} event.
+ */
+ function _tallyUpdated(uint256 proposalId) internal virtual override {
+ GovernorPreventLateQuorumStorage storage $ = _getGovernorPreventLateQuorumStorage();
+ super._tallyUpdated(proposalId);
+ if ($._extendedDeadlines[proposalId] == 0 && _quorumReached(proposalId)) {
+ uint48 extendedDeadline = clock() + lateQuorumVoteExtension();
+
+ if (extendedDeadline > proposalDeadline(proposalId)) {
+ emit ProposalExtended(proposalId, extendedDeadline);
+ }
+
+ $._extendedDeadlines[proposalId] = extendedDeadline;
+ }
+ }
+
+ /**
+ * @dev Returns the current value of the vote extension parameter: the number of blocks that are required to pass
+ * from the time a proposal reaches quorum until its voting period ends.
+ */
+ function lateQuorumVoteExtension() public view virtual returns (uint48) {
+ GovernorPreventLateQuorumStorage storage $ = _getGovernorPreventLateQuorumStorage();
+ return $._voteExtension;
+ }
+
+ /**
+ * @dev Changes the {lateQuorumVoteExtension}. This operation can only be performed by the governance executor,
+ * generally through a governance proposal.
+ *
+ * Emits a {LateQuorumVoteExtensionSet} event.
+ */
+ function setLateQuorumVoteExtension(uint48 newVoteExtension) public virtual onlyGovernance {
+ _setLateQuorumVoteExtension(newVoteExtension);
+ }
+
+ /**
+ * @dev Changes the {lateQuorumVoteExtension}. This is an internal function that can be exposed in a public function
+ * like {setLateQuorumVoteExtension} if another access control mechanism is needed.
+ *
+ * Emits a {LateQuorumVoteExtensionSet} event.
+ */
+ function _setLateQuorumVoteExtension(uint48 newVoteExtension) internal virtual {
+ GovernorPreventLateQuorumStorage storage $ = _getGovernorPreventLateQuorumStorage();
+ emit LateQuorumVoteExtensionSet($._voteExtension, newVoteExtension);
+ $._voteExtension = newVoteExtension;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorProposalGuardianUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorProposalGuardianUpgradeable.sol
new file mode 100644
index 0000000..9ac6aba
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorProposalGuardianUpgradeable.sol
@@ -0,0 +1,79 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorProposalGuardian.sol)
+
+pragma solidity ^0.8.24;
+
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} which adds a proposal guardian that can cancel proposals at any stage in the proposal's lifecycle.
+ *
+ * NOTE: if the proposal guardian is not configured, then proposers take this role for their proposals.
+ */
+abstract contract GovernorProposalGuardianUpgradeable is Initializable, GovernorUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorProposalGuardian
+ struct GovernorProposalGuardianStorage {
+ address _proposalGuardian;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorProposalGuardian")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorProposalGuardianStorageLocation = 0x2953e0c334ced07e397f02d0e9b450dbfd92be015e93a9c249855132826e0300;
+
+ function _getGovernorProposalGuardianStorage() private pure returns (GovernorProposalGuardianStorage storage $) {
+ assembly {
+ $.slot := GovernorProposalGuardianStorageLocation
+ }
+ }
+
+ event ProposalGuardianSet(address oldProposalGuardian, address newProposalGuardian);
+
+ function __GovernorProposalGuardian_init() internal onlyInitializing {
+ }
+
+ function __GovernorProposalGuardian_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Getter that returns the address of the proposal guardian.
+ */
+ function proposalGuardian() public view virtual returns (address) {
+ GovernorProposalGuardianStorage storage $ = _getGovernorProposalGuardianStorage();
+ return $._proposalGuardian;
+ }
+
+ /**
+ * @dev Update the proposal guardian's address. This operation can only be performed through a governance proposal.
+ *
+ * Emits a {ProposalGuardianSet} event.
+ */
+ function setProposalGuardian(address newProposalGuardian) public virtual onlyGovernance {
+ _setProposalGuardian(newProposalGuardian);
+ }
+
+ /**
+ * @dev Internal setter for the proposal guardian.
+ *
+ * Emits a {ProposalGuardianSet} event.
+ */
+ function _setProposalGuardian(address newProposalGuardian) internal virtual {
+ GovernorProposalGuardianStorage storage $ = _getGovernorProposalGuardianStorage();
+ emit ProposalGuardianSet($._proposalGuardian, newProposalGuardian);
+ $._proposalGuardian = newProposalGuardian;
+ }
+
+ /**
+ * @dev Override {Governor-_validateCancel} to implement the extended cancellation logic.
+ *
+ * * The {proposalGuardian} can cancel any proposal at any point.
+ * * If no proposal guardian is set, the {IGovernor-proposalProposer} can cancel their proposals at any point.
+ * * In any case, permissions defined in {Governor-_validateCancel} (or another override) remains valid.
+ */
+ function _validateCancel(uint256 proposalId, address caller) internal view virtual override returns (bool) {
+ address guardian = proposalGuardian();
+
+ return
+ guardian == caller ||
+ (guardian == address(0) && caller == proposalProposer(proposalId)) ||
+ super._validateCancel(proposalId, caller);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSequentialProposalIdUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSequentialProposalIdUpgradeable.sol
new file mode 100644
index 0000000..180fab7
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSequentialProposalIdUpgradeable.sol
@@ -0,0 +1,98 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorSequentialProposalId.sol)
+
+pragma solidity ^0.8.24;
+
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} that changes the numbering of proposal ids from the default hash-based approach to
+ * sequential ids.
+ */
+abstract contract GovernorSequentialProposalIdUpgradeable is Initializable, GovernorUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorSequentialProposalId
+ struct GovernorSequentialProposalIdStorage {
+ uint256 _latestProposalId;
+ mapping(uint256 proposalHash => uint256 proposalId) _proposalIds;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorSequentialProposalId")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorSequentialProposalIdStorageLocation = 0x4b8c47b641115bbb755a0530712d89d8042b41728d36570a6119c90ae1b76800;
+
+ function _getGovernorSequentialProposalIdStorage() private pure returns (GovernorSequentialProposalIdStorage storage $) {
+ assembly {
+ $.slot := GovernorSequentialProposalIdStorageLocation
+ }
+ }
+
+ /**
+ * @dev The {latestProposalId} may only be initialized if it hasn't been set yet
+ * (through initialization or the creation of a proposal).
+ */
+ error GovernorAlreadyInitializedLatestProposalId();
+
+ function __GovernorSequentialProposalId_init() internal onlyInitializing {
+ }
+
+ function __GovernorSequentialProposalId_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IGovernor
+ function getProposalId(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) public view virtual override returns (uint256) {
+ GovernorSequentialProposalIdStorage storage $ = _getGovernorSequentialProposalIdStorage();
+ uint256 proposalHash = hashProposal(targets, values, calldatas, descriptionHash);
+ uint256 storedProposalId = $._proposalIds[proposalHash];
+ if (storedProposalId == 0) {
+ revert GovernorNonexistentProposal(0);
+ }
+ return storedProposalId;
+ }
+
+ /**
+ * @dev Returns the latest proposal id. A return value of 0 means no proposals have been created yet.
+ */
+ function latestProposalId() public view virtual returns (uint256) {
+ GovernorSequentialProposalIdStorage storage $ = _getGovernorSequentialProposalIdStorage();
+ return $._latestProposalId;
+ }
+
+ /**
+ * @dev See {IGovernor-_propose}.
+ * Hook into the proposing mechanism to increment proposal count.
+ */
+ function _propose(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ string memory description,
+ address proposer
+ ) internal virtual override returns (uint256) {
+ GovernorSequentialProposalIdStorage storage $ = _getGovernorSequentialProposalIdStorage();
+ uint256 proposalHash = hashProposal(targets, values, calldatas, keccak256(bytes(description)));
+ uint256 storedProposalId = $._proposalIds[proposalHash];
+ if (storedProposalId == 0) {
+ $._proposalIds[proposalHash] = ++$._latestProposalId;
+ }
+ return super._propose(targets, values, calldatas, description, proposer);
+ }
+
+ /**
+ * @dev Internal function to set the {latestProposalId}. This function is helpful when transitioning
+ * from another governance system. The next proposal id will be `newLatestProposalId` + 1.
+ *
+ * May only call this function if the current value of {latestProposalId} is 0.
+ */
+ function _initializeLatestProposalId(uint256 newLatestProposalId) internal virtual {
+ GovernorSequentialProposalIdStorage storage $ = _getGovernorSequentialProposalIdStorage();
+ if ($._latestProposalId != 0) {
+ revert GovernorAlreadyInitializedLatestProposalId();
+ }
+ $._latestProposalId = newLatestProposalId;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSettingsUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSettingsUpgradeable.sol
new file mode 100644
index 0000000..06bfac8
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSettingsUpgradeable.sol
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorSettings.sol)
+
+pragma solidity ^0.8.24;
+
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} for settings updatable through governance.
+ */
+abstract contract GovernorSettingsUpgradeable is Initializable, GovernorUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorSettings
+ struct GovernorSettingsStorage {
+ // amount of token
+ uint256 _proposalThreshold;
+ // timepoint: limited to uint48 in core (same as clock() type)
+ uint48 _votingDelay;
+ // duration: limited to uint32 in core
+ uint32 _votingPeriod;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorSettings")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorSettingsStorageLocation = 0x00d7616c8fe29c6c2fbe1d0c5bc8f2faa4c35b43746e70b24b4d532752affd00;
+
+ function _getGovernorSettingsStorage() private pure returns (GovernorSettingsStorage storage $) {
+ assembly {
+ $.slot := GovernorSettingsStorageLocation
+ }
+ }
+
+ event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);
+ event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);
+ event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);
+
+ /**
+ * @dev Initialize the governance parameters.
+ */
+ function __GovernorSettings_init(uint48 initialVotingDelay, uint32 initialVotingPeriod, uint256 initialProposalThreshold) internal onlyInitializing {
+ __GovernorSettings_init_unchained(initialVotingDelay, initialVotingPeriod, initialProposalThreshold);
+ }
+
+ function __GovernorSettings_init_unchained(uint48 initialVotingDelay, uint32 initialVotingPeriod, uint256 initialProposalThreshold) internal onlyInitializing {
+ _setVotingDelay(initialVotingDelay);
+ _setVotingPeriod(initialVotingPeriod);
+ _setProposalThreshold(initialProposalThreshold);
+ }
+
+ /// @inheritdoc IGovernor
+ function votingDelay() public view virtual override returns (uint256) {
+ GovernorSettingsStorage storage $ = _getGovernorSettingsStorage();
+ return $._votingDelay;
+ }
+
+ /// @inheritdoc IGovernor
+ function votingPeriod() public view virtual override returns (uint256) {
+ GovernorSettingsStorage storage $ = _getGovernorSettingsStorage();
+ return $._votingPeriod;
+ }
+
+ /// @inheritdoc GovernorUpgradeable
+ function proposalThreshold() public view virtual override returns (uint256) {
+ GovernorSettingsStorage storage $ = _getGovernorSettingsStorage();
+ return $._proposalThreshold;
+ }
+
+ /**
+ * @dev Update the voting delay. This operation can only be performed through a governance proposal.
+ *
+ * Emits a {VotingDelaySet} event.
+ */
+ function setVotingDelay(uint48 newVotingDelay) public virtual onlyGovernance {
+ _setVotingDelay(newVotingDelay);
+ }
+
+ /**
+ * @dev Update the voting period. This operation can only be performed through a governance proposal.
+ *
+ * Emits a {VotingPeriodSet} event.
+ */
+ function setVotingPeriod(uint32 newVotingPeriod) public virtual onlyGovernance {
+ _setVotingPeriod(newVotingPeriod);
+ }
+
+ /**
+ * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.
+ *
+ * Emits a {ProposalThresholdSet} event.
+ */
+ function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {
+ _setProposalThreshold(newProposalThreshold);
+ }
+
+ /**
+ * @dev Internal setter for the voting delay.
+ *
+ * Emits a {VotingDelaySet} event.
+ */
+ function _setVotingDelay(uint48 newVotingDelay) internal virtual {
+ GovernorSettingsStorage storage $ = _getGovernorSettingsStorage();
+ emit VotingDelaySet($._votingDelay, newVotingDelay);
+ $._votingDelay = newVotingDelay;
+ }
+
+ /**
+ * @dev Internal setter for the voting period.
+ *
+ * Emits a {VotingPeriodSet} event.
+ */
+ function _setVotingPeriod(uint32 newVotingPeriod) internal virtual {
+ GovernorSettingsStorage storage $ = _getGovernorSettingsStorage();
+ if (newVotingPeriod == 0) {
+ revert GovernorInvalidVotingPeriod(0);
+ }
+ emit VotingPeriodSet($._votingPeriod, newVotingPeriod);
+ $._votingPeriod = newVotingPeriod;
+ }
+
+ /**
+ * @dev Internal setter for the proposal threshold.
+ *
+ * Emits a {ProposalThresholdSet} event.
+ */
+ function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {
+ GovernorSettingsStorage storage $ = _getGovernorSettingsStorage();
+ emit ProposalThresholdSet($._proposalThreshold, newProposalThreshold);
+ $._proposalThreshold = newProposalThreshold;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorStorageUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorStorageUpgradeable.sol
new file mode 100644
index 0000000..79218dc
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorStorageUpgradeable.sol
@@ -0,0 +1,159 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (governance/extensions/GovernorStorage.sol)
+
+pragma solidity ^0.8.24;
+
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} that implements storage of proposal details. This module also provides primitives for
+ * the enumerability of proposals.
+ *
+ * Use cases for this module include:
+ * - UIs that explore the proposal state without relying on event indexing.
+ * - Using only the proposalId as an argument in the {Governor-queue} and {Governor-execute} functions for L2 chains
+ * where storage is cheap compared to calldata.
+ */
+abstract contract GovernorStorageUpgradeable is Initializable, GovernorUpgradeable {
+ struct ProposalDetails {
+ address[] targets;
+ uint256[] values;
+ bytes[] calldatas;
+ bytes32 descriptionHash;
+ }
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorStorage
+ struct GovernorStorageStorage {
+ uint256[] _proposalIds;
+ mapping(uint256 proposalId => ProposalDetails) _proposalDetails;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorStorage")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorStorageStorageLocation = 0x7fd223d3380145bd26132714391e777c488a0df7ac2dd4b66419d8549fb3a600;
+
+ function _getGovernorStorageStorage() private pure returns (GovernorStorageStorage storage $) {
+ assembly {
+ $.slot := GovernorStorageStorageLocation
+ }
+ }
+
+ function __GovernorStorage_init() internal onlyInitializing {
+ }
+
+ function __GovernorStorage_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Hook into the proposing mechanism
+ */
+ function _propose(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ string memory description,
+ address proposer
+ ) internal virtual override returns (uint256) {
+ GovernorStorageStorage storage $ = _getGovernorStorageStorage();
+ uint256 proposalId = super._propose(targets, values, calldatas, description, proposer);
+
+ // store
+ $._proposalIds.push(proposalId);
+ $._proposalDetails[proposalId] = ProposalDetails({
+ targets: targets,
+ values: values,
+ calldatas: calldatas,
+ descriptionHash: keccak256(bytes(description))
+ });
+
+ return proposalId;
+ }
+
+ /**
+ * @dev Version of {IGovernor-queue} with only `proposalId` as an argument.
+ */
+ function queue(uint256 proposalId) public virtual {
+ GovernorStorageStorage storage $ = _getGovernorStorageStorage();
+ // here, using storage is more efficient than memory
+ ProposalDetails storage details = $._proposalDetails[proposalId];
+ if (details.descriptionHash == 0) {
+ revert GovernorNonexistentProposal(proposalId);
+ }
+ queue(details.targets, details.values, details.calldatas, details.descriptionHash);
+ }
+
+ /**
+ * @dev Version of {IGovernor-execute} with only `proposalId` as an argument.
+ */
+ function execute(uint256 proposalId) public payable virtual {
+ GovernorStorageStorage storage $ = _getGovernorStorageStorage();
+ // here, using storage is more efficient than memory
+ ProposalDetails storage details = $._proposalDetails[proposalId];
+ if (details.descriptionHash == 0) {
+ revert GovernorNonexistentProposal(proposalId);
+ }
+ execute(details.targets, details.values, details.calldatas, details.descriptionHash);
+ }
+
+ /**
+ * @dev ProposalId version of {IGovernor-cancel}.
+ */
+ function cancel(uint256 proposalId) public virtual {
+ GovernorStorageStorage storage $ = _getGovernorStorageStorage();
+ // here, using storage is more efficient than memory
+ ProposalDetails storage details = $._proposalDetails[proposalId];
+ if (details.descriptionHash == 0) {
+ revert GovernorNonexistentProposal(proposalId);
+ }
+ cancel(details.targets, details.values, details.calldatas, details.descriptionHash);
+ }
+
+ /**
+ * @dev Returns the number of stored proposals.
+ */
+ function proposalCount() public view virtual returns (uint256) {
+ GovernorStorageStorage storage $ = _getGovernorStorageStorage();
+ return $._proposalIds.length;
+ }
+
+ /**
+ * @dev Returns the details of a proposalId. Reverts if `proposalId` is not a known proposal.
+ */
+ function proposalDetails(
+ uint256 proposalId
+ )
+ public
+ view
+ virtual
+ returns (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)
+ {
+ GovernorStorageStorage storage $ = _getGovernorStorageStorage();
+ // here, using memory is more efficient than storage
+ ProposalDetails memory details = $._proposalDetails[proposalId];
+ if (details.descriptionHash == 0) {
+ revert GovernorNonexistentProposal(proposalId);
+ }
+ return (details.targets, details.values, details.calldatas, details.descriptionHash);
+ }
+
+ /**
+ * @dev Returns the details (including the proposalId) of a proposal given its sequential index.
+ */
+ function proposalDetailsAt(
+ uint256 index
+ )
+ public
+ view
+ virtual
+ returns (
+ uint256 proposalId,
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ )
+ {
+ GovernorStorageStorage storage $ = _getGovernorStorageStorage();
+ proposalId = $._proposalIds[index];
+ (targets, values, calldatas, descriptionHash) = proposalDetails(proposalId);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSuperQuorumUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSuperQuorumUpgradeable.sol
new file mode 100644
index 0000000..15b7ab3
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorSuperQuorumUpgradeable.sol
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorSuperQuorum.sol)
+
+pragma solidity ^0.8.24;
+
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} with a super quorum. Proposals that meet the super quorum (and have a majority of for
+ * votes) advance to the `Succeeded` state before the proposal deadline. Counting modules that want to use this
+ * extension must implement {proposalVotes}.
+ */
+abstract contract GovernorSuperQuorumUpgradeable is Initializable, GovernorUpgradeable {
+ function __GovernorSuperQuorum_init() internal onlyInitializing {
+ }
+
+ function __GovernorSuperQuorum_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Minimum number of cast votes required for a proposal to reach super quorum. Only FOR votes are counted
+ * towards the super quorum. Once the super quorum is reached, an active proposal can proceed to the next state
+ * without waiting for the proposal deadline.
+ *
+ * NOTE: The `timepoint` parameter corresponds to the snapshot used for counting the vote. This enables scaling of the
+ * quorum depending on values such as the `totalSupply` of a token at this timepoint (see {ERC20Votes}).
+ *
+ * NOTE: Make sure the value specified for the super quorum is greater than {quorum}, otherwise, it may be
+ * possible to pass a proposal with less votes than the default quorum.
+ */
+ function superQuorum(uint256 timepoint) public view virtual returns (uint256);
+
+ /**
+ * @dev Accessor to the internal vote counts. This must be implemented by the counting module. Counting modules
+ * that don't implement this function are incompatible with this module
+ */
+ function proposalVotes(
+ uint256 proposalId
+ ) public view virtual returns (uint256 againstVotes, uint256 forVotes, uint256 abstainVotes);
+
+ /**
+ * @dev Overridden version of the {Governor-state} function that checks if the proposal has reached the super
+ * quorum.
+ *
+ * NOTE: If the proposal reaches super quorum but {_voteSucceeded} returns false, eg, assuming the super quorum
+ * has been set low enough that both FOR and AGAINST votes have exceeded it and AGAINST votes exceed FOR votes,
+ * the proposal continues to be active until {_voteSucceeded} returns true or the proposal deadline is reached.
+ * This means that with a low super quorum it is also possible that a vote can succeed prematurely before enough
+ * AGAINST voters have a chance to vote. Hence, it is recommended to set a high enough super quorum to avoid these
+ * types of scenarios.
+ */
+ function state(uint256 proposalId) public view virtual override returns (ProposalState) {
+ ProposalState currentState = super.state(proposalId);
+ if (currentState != ProposalState.Active) return currentState;
+
+ (, uint256 forVotes, ) = proposalVotes(proposalId);
+ if (forVotes < superQuorum(proposalSnapshot(proposalId)) || !_voteSucceeded(proposalId)) {
+ return ProposalState.Active;
+ } else if (proposalEta(proposalId) == 0) {
+ return ProposalState.Succeeded;
+ } else {
+ return ProposalState.Queued;
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockAccessUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockAccessUpgradeable.sol
new file mode 100644
index 0000000..71c5777
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockAccessUpgradeable.sol
@@ -0,0 +1,376 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorTimelockAccess.sol)
+
+pragma solidity ^0.8.24;
+
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {AuthorityUtils} from "@openzeppelin/contracts/access/manager/AuthorityUtils.sol";
+import {IAccessManager} from "@openzeppelin/contracts/access/manager/IAccessManager.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {Time} from "@openzeppelin/contracts/utils/types/Time.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev This module connects a {Governor} instance to an {AccessManager} instance, allowing the governor to make calls
+ * that are delay-restricted by the manager using the normal {queue} workflow. An optional base delay is applied to
+ * operations that are not delayed externally by the manager. Execution of a proposal will be delayed as much as
+ * necessary to meet the required delays of all of its operations.
+ *
+ * This extension allows the governor to hold and use its own assets and permissions, unlike {GovernorTimelockControl}
+ * and {GovernorTimelockCompound}, where the timelock is a separate contract that must be the one to hold assets and
+ * permissions. Operations that are delay-restricted by the manager, however, will be executed through the
+ * {AccessManager-execute} function.
+ *
+ * ==== Security Considerations
+ *
+ * Some operations may be cancelable in the `AccessManager` by the admin or a set of guardians, depending on the
+ * restricted function being invoked. Since proposals are atomic, the cancellation by a guardian of a single operation
+ * in a proposal will cause all of the proposal to become unable to execute. Consider proposing cancellable operations
+ * separately.
+ *
+ * By default, function calls will be routed through the associated `AccessManager` whenever it claims the target
+ * function to be restricted by it. However, admins may configure the manager to make that claim for functions that a
+ * governor would want to call directly (e.g., token transfers) in an attempt to deny it access to those functions. To
+ * mitigate this attack vector, the governor is able to ignore the restrictions claimed by the `AccessManager` using
+ * {setAccessManagerIgnored}. While permanent denial of service is mitigated, temporary DoS may still be technically
+ * possible. All of the governor's own functions (e.g., {setBaseDelaySeconds}) ignore the `AccessManager` by default.
+ *
+ * NOTE: `AccessManager` does not support scheduling more than one operation with the same target and calldata at
+ * the same time. See {AccessManager-schedule} for a workaround.
+ */
+abstract contract GovernorTimelockAccessUpgradeable is Initializable, GovernorUpgradeable {
+ // An execution plan is produced at the moment a proposal is created, in order to fix at that point the exact
+ // execution semantics of the proposal, namely whether a call will go through {AccessManager-execute}.
+ struct ExecutionPlan {
+ uint16 length;
+ uint32 delay;
+ // We use mappings instead of arrays because it allows us to pack values in storage more tightly without
+ // storing the length redundantly.
+ // We pack 8 operations' data in each bucket. Each uint32 value is set to 1 upon proposal creation if it has
+ // to be scheduled and executed through the manager. Upon queuing, the value is set to nonce + 2, where the
+ // nonce is received from the manager when scheduling the operation.
+ mapping(uint256 operationBucket => uint32[8]) managerData;
+ }
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorTimelockAccess
+ struct GovernorTimelockAccessStorage {
+ // The meaning of the "toggle" set to true depends on the target contract.
+ // If target == address(this), the manager is ignored by default, and a true toggle means it won't be ignored.
+ // For all other target contracts, the manager is used by default, and a true toggle means it will be ignored.
+ mapping(address target => mapping(bytes4 selector => bool)) _ignoreToggle;
+
+ mapping(uint256 proposalId => ExecutionPlan) _executionPlan;
+
+ uint32 _baseDelay;
+
+ IAccessManager _manager;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorTimelockAccess")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorTimelockAccessStorageLocation = 0xb26e23d38df572f5669f6310d407229c15b4fb320cb19bf5e8c38856d28d0800;
+
+ function _getGovernorTimelockAccessStorage() private pure returns (GovernorTimelockAccessStorage storage $) {
+ assembly {
+ $.slot := GovernorTimelockAccessStorageLocation
+ }
+ }
+
+ error GovernorUnmetDelay(uint256 proposalId, uint256 neededTimestamp);
+ error GovernorMismatchedNonce(uint256 proposalId, uint256 expectedNonce, uint256 actualNonce);
+ error GovernorLockedIgnore();
+
+ event BaseDelaySet(uint32 oldBaseDelaySeconds, uint32 newBaseDelaySeconds);
+ event AccessManagerIgnoredSet(address target, bytes4 selector, bool ignored);
+
+ /**
+ * @dev Initialize the governor with an {AccessManager} and initial base delay.
+ */
+ function __GovernorTimelockAccess_init(address manager, uint32 initialBaseDelay) internal onlyInitializing {
+ __GovernorTimelockAccess_init_unchained(manager, initialBaseDelay);
+ }
+
+ function __GovernorTimelockAccess_init_unchained(address manager, uint32 initialBaseDelay) internal onlyInitializing {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ $._manager = IAccessManager(manager);
+ _setBaseDelaySeconds(initialBaseDelay);
+ }
+
+ /**
+ * @dev Returns the {AccessManager} instance associated to this governor.
+ */
+ function accessManager() public view virtual returns (IAccessManager) {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ return $._manager;
+ }
+
+ /**
+ * @dev Base delay that will be applied to all function calls. Some may be further delayed by their associated
+ * `AccessManager` authority; in this case the final delay will be the maximum of the base delay and the one
+ * demanded by the authority.
+ *
+ * NOTE: Execution delays are processed by the `AccessManager` contracts, and according to that contract are
+ * expressed in seconds. Therefore, the base delay is also in seconds, regardless of the governor's clock mode.
+ */
+ function baseDelaySeconds() public view virtual returns (uint32) {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ return $._baseDelay;
+ }
+
+ /**
+ * @dev Change the value of {baseDelaySeconds}. This operation can only be invoked through a governance proposal.
+ */
+ function setBaseDelaySeconds(uint32 newBaseDelay) public virtual onlyGovernance {
+ _setBaseDelaySeconds(newBaseDelay);
+ }
+
+ /**
+ * @dev Change the value of {baseDelaySeconds}. Internal function without access control.
+ */
+ function _setBaseDelaySeconds(uint32 newBaseDelay) internal virtual {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ emit BaseDelaySet($._baseDelay, newBaseDelay);
+ $._baseDelay = newBaseDelay;
+ }
+
+ /**
+ * @dev Check if restrictions from the associated {AccessManager} are ignored for a target function. Returns true
+ * when the target function will be invoked directly regardless of `AccessManager` settings for the function.
+ * See {setAccessManagerIgnored} and Security Considerations above.
+ */
+ function isAccessManagerIgnored(address target, bytes4 selector) public view virtual returns (bool) {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ bool isGovernor = target == address(this);
+ return $._ignoreToggle[target][selector] != isGovernor; // equivalent to: isGovernor ? !toggle : toggle
+ }
+
+ /**
+ * @dev Configure whether restrictions from the associated {AccessManager} are ignored for a target function.
+ * See Security Considerations above.
+ */
+ function setAccessManagerIgnored(
+ address target,
+ bytes4[] calldata selectors,
+ bool ignored
+ ) public virtual onlyGovernance {
+ for (uint256 i = 0; i < selectors.length; ++i) {
+ _setAccessManagerIgnored(target, selectors[i], ignored);
+ }
+ }
+
+ /**
+ * @dev Internal version of {setAccessManagerIgnored} without access restriction.
+ */
+ function _setAccessManagerIgnored(address target, bytes4 selector, bool ignored) internal virtual {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ bool isGovernor = target == address(this);
+ if (isGovernor && selector == this.setAccessManagerIgnored.selector) {
+ revert GovernorLockedIgnore();
+ }
+ $._ignoreToggle[target][selector] = ignored != isGovernor; // equivalent to: isGovernor ? !ignored : ignored
+ emit AccessManagerIgnoredSet(target, selector, ignored);
+ }
+
+ /**
+ * @dev Public accessor to check the execution plan, including the number of seconds that the proposal will be
+ * delayed since queuing, an array indicating which of the proposal actions will be executed indirectly through
+ * the associated {AccessManager}, and another indicating which will be scheduled in {queue}. Note that
+ * those that must be scheduled are cancellable by `AccessManager` guardians.
+ */
+ function proposalExecutionPlan(
+ uint256 proposalId
+ ) public view returns (uint32 delay, bool[] memory indirect, bool[] memory withDelay) {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ ExecutionPlan storage plan = $._executionPlan[proposalId];
+
+ uint32 length = plan.length;
+ delay = plan.delay;
+ indirect = new bool[](length);
+ withDelay = new bool[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ (indirect[i], withDelay[i], ) = _getManagerData(plan, i);
+ }
+
+ return (delay, indirect, withDelay);
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalNeedsQueuing(uint256 proposalId) public view virtual override returns (bool) {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ return $._executionPlan[proposalId].delay > 0;
+ }
+
+ /// @inheritdoc IGovernor
+ function propose(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ string memory description
+ ) public virtual override returns (uint256) {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ uint256 proposalId = super.propose(targets, values, calldatas, description);
+
+ uint32 neededDelay = baseDelaySeconds();
+
+ ExecutionPlan storage plan = $._executionPlan[proposalId];
+ plan.length = SafeCast.toUint16(targets.length);
+
+ for (uint256 i = 0; i < targets.length; ++i) {
+ if (calldatas[i].length < 4) {
+ continue;
+ }
+ address target = targets[i];
+ bytes4 selector = bytes4(calldatas[i]);
+ (bool immediate, uint32 delay) = AuthorityUtils.canCallWithDelay(
+ address($._manager),
+ address(this),
+ target,
+ selector
+ );
+ if ((immediate || delay > 0) && !isAccessManagerIgnored(target, selector)) {
+ _setManagerData(plan, i, !immediate, 0);
+ // downcast is safe because both arguments are uint32
+ neededDelay = uint32(Math.max(delay, neededDelay));
+ }
+ }
+
+ plan.delay = neededDelay;
+
+ return proposalId;
+ }
+
+ /**
+ * @dev Mechanism to queue a proposal, potentially scheduling some of its operations in the AccessManager.
+ *
+ * NOTE: The execution delay is chosen based on the delay information retrieved in {propose}. This value may be
+ * off if the delay was updated since proposal creation. In this case, the proposal needs to be recreated.
+ */
+ function _queueOperations(
+ uint256 proposalId,
+ address[] memory targets,
+ uint256[] memory /* values */,
+ bytes[] memory calldatas,
+ bytes32 /* descriptionHash */
+ ) internal virtual override returns (uint48) {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ ExecutionPlan storage plan = $._executionPlan[proposalId];
+ uint48 etaSeconds = Time.timestamp() + plan.delay;
+
+ for (uint256 i = 0; i < targets.length; ++i) {
+ (, bool withDelay, ) = _getManagerData(plan, i);
+ if (withDelay) {
+ // This function can reenter when calling `_manager.schedule` before performing state updates in `_setManagerData`.
+ // However, the `manager` is a trusted contract in the current context's security model (e.g. an `AccessManager`).
+ // slither-disable-next-line reentrancy-no-eth
+ (, uint32 nonce) = $._manager.schedule(targets[i], calldatas[i], etaSeconds);
+ _setManagerData(plan, i, true, nonce);
+ }
+ }
+
+ return etaSeconds;
+ }
+
+ /**
+ * @dev Mechanism to execute a proposal, potentially going through {AccessManager-execute} for delayed operations.
+ */
+ function _executeOperations(
+ uint256 proposalId,
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 /* descriptionHash */
+ ) internal virtual override {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ uint48 etaSeconds = SafeCast.toUint48(proposalEta(proposalId));
+ if (block.timestamp < etaSeconds) {
+ revert GovernorUnmetDelay(proposalId, etaSeconds);
+ }
+
+ ExecutionPlan storage plan = $._executionPlan[proposalId];
+
+ for (uint256 i = 0; i < targets.length; ++i) {
+ (bool controlled, bool withDelay, uint32 nonce) = _getManagerData(plan, i);
+ if (controlled) {
+ uint32 executedNonce = $._manager.execute{value: values[i]}(targets[i], calldatas[i]);
+ if (withDelay && executedNonce != nonce) {
+ revert GovernorMismatchedNonce(proposalId, nonce, executedNonce);
+ }
+ } else {
+ (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);
+ Address.verifyCallResult(success, returndata);
+ }
+ }
+ }
+
+ /// @inheritdoc GovernorUpgradeable
+ function _cancel(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) internal virtual override returns (uint256) {
+ GovernorTimelockAccessStorage storage $ = _getGovernorTimelockAccessStorage();
+ uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);
+
+ uint48 etaSeconds = SafeCast.toUint48(proposalEta(proposalId));
+
+ ExecutionPlan storage plan = $._executionPlan[proposalId];
+
+ // If the proposal has been scheduled it will have an ETA and we may have to externally cancel
+ if (etaSeconds != 0) {
+ for (uint256 i = 0; i < targets.length; ++i) {
+ (, bool withDelay, uint32 nonce) = _getManagerData(plan, i);
+ // Only attempt to cancel if the execution plan included a delay
+ if (withDelay) {
+ bytes32 operationId = $._manager.hashOperation(address(this), targets[i], calldatas[i]);
+ // Check first if the current operation nonce is the one that we observed previously. It could
+ // already have been cancelled and rescheduled. We don't want to cancel unless it is exactly the
+ // instance that we previously scheduled.
+ if (nonce == $._manager.getNonce(operationId)) {
+ // It is important that all calls have an opportunity to be cancelled. We chose to ignore
+ // potential failures of some of the cancel operations to give the other operations a chance to
+ // be properly cancelled. In particular cancel might fail if the operation was already cancelled
+ // by guardians previously. We don't match on the revert reason to avoid encoding assumptions
+ // about specific errors.
+ try $._manager.cancel(address(this), targets[i], calldatas[i]) {} catch {}
+ }
+ }
+ }
+ }
+
+ return proposalId;
+ }
+
+ /**
+ * @dev Returns whether the operation at an index is delayed by the manager, and its scheduling nonce once queued.
+ */
+ function _getManagerData(
+ ExecutionPlan storage plan,
+ uint256 index
+ ) private view returns (bool controlled, bool withDelay, uint32 nonce) {
+ (uint256 bucket, uint256 subindex) = _getManagerDataIndices(index);
+ uint32 value = plan.managerData[bucket][subindex];
+ unchecked {
+ return (value > 0, value > 1, value > 1 ? value - 2 : 0);
+ }
+ }
+
+ /**
+ * @dev Marks an operation at an index as permissioned by the manager, potentially delayed, and
+ * when delayed sets its scheduling nonce.
+ */
+ function _setManagerData(ExecutionPlan storage plan, uint256 index, bool withDelay, uint32 nonce) private {
+ (uint256 bucket, uint256 subindex) = _getManagerDataIndices(index);
+ plan.managerData[bucket][subindex] = withDelay ? nonce + 2 : 1;
+ }
+
+ /**
+ * @dev Returns bucket and subindex for reading manager data from the packed array mapping.
+ */
+ function _getManagerDataIndices(uint256 index) private pure returns (uint256 bucket, uint256 subindex) {
+ bucket = index >> 3; // index / 8
+ subindex = index & 7; // index % 8
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockCompoundUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockCompoundUpgradeable.sol
new file mode 100644
index 0000000..c553334
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockCompoundUpgradeable.sol
@@ -0,0 +1,191 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorTimelockCompound.sol)
+
+pragma solidity ^0.8.24;
+
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {ICompoundTimelock} from "@openzeppelin/contracts/vendor/compound/ICompoundTimelock.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} that binds the execution process to a Compound Timelock. This adds a delay, enforced by
+ * the external timelock to all successful proposals (in addition to the voting duration). The {Governor} needs to be
+ * the admin of the timelock for any operation to be performed. A public, unrestricted,
+ * {GovernorTimelockCompound-__acceptAdmin} is available to accept ownership of the timelock.
+ *
+ * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,
+ * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be
+ * inaccessible from a proposal, unless executed via {Governor-relay}.
+ */
+abstract contract GovernorTimelockCompoundUpgradeable is Initializable, GovernorUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorTimelockCompound
+ struct GovernorTimelockCompoundStorage {
+ ICompoundTimelock _timelock;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorTimelockCompound")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorTimelockCompoundStorageLocation = 0x7d1501d734d0ca30b8d26751a7fae89646767b24afe11265192d56e5fe515b00;
+
+ function _getGovernorTimelockCompoundStorage() private pure returns (GovernorTimelockCompoundStorage storage $) {
+ assembly {
+ $.slot := GovernorTimelockCompoundStorageLocation
+ }
+ }
+
+ /**
+ * @dev Emitted when the timelock controller used for proposal execution is modified.
+ */
+ event TimelockChange(address oldTimelock, address newTimelock);
+
+ /**
+ * @dev Set the timelock.
+ */
+ function __GovernorTimelockCompound_init(ICompoundTimelock timelockAddress) internal onlyInitializing {
+ __GovernorTimelockCompound_init_unchained(timelockAddress);
+ }
+
+ function __GovernorTimelockCompound_init_unchained(ICompoundTimelock timelockAddress) internal onlyInitializing {
+ _updateTimelock(timelockAddress);
+ }
+
+ /**
+ * @dev Overridden version of the {Governor-state} function with added support for the `Expired` state.
+ */
+ function state(uint256 proposalId) public view virtual override returns (ProposalState) {
+ GovernorTimelockCompoundStorage storage $ = _getGovernorTimelockCompoundStorage();
+ ProposalState currentState = super.state(proposalId);
+
+ return
+ (currentState == ProposalState.Queued &&
+ block.timestamp >= proposalEta(proposalId) + $._timelock.GRACE_PERIOD())
+ ? ProposalState.Expired
+ : currentState;
+ }
+
+ /**
+ * @dev Public accessor to check the address of the timelock
+ */
+ function timelock() public view virtual returns (address) {
+ GovernorTimelockCompoundStorage storage $ = _getGovernorTimelockCompoundStorage();
+ return address($._timelock);
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalNeedsQueuing(uint256) public view virtual override returns (bool) {
+ return true;
+ }
+
+ /**
+ * @dev Function to queue a proposal to the timelock.
+ */
+ function _queueOperations(
+ uint256 proposalId,
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 /*descriptionHash*/
+ ) internal virtual override returns (uint48) {
+ GovernorTimelockCompoundStorage storage $ = _getGovernorTimelockCompoundStorage();
+ uint48 etaSeconds = SafeCast.toUint48(block.timestamp + $._timelock.delay());
+
+ for (uint256 i = 0; i < targets.length; ++i) {
+ if (
+ $._timelock.queuedTransactions(keccak256(abi.encode(targets[i], values[i], "", calldatas[i], etaSeconds)))
+ ) {
+ revert GovernorAlreadyQueuedProposal(proposalId);
+ }
+ $._timelock.queueTransaction(targets[i], values[i], "", calldatas[i], etaSeconds);
+ }
+
+ return etaSeconds;
+ }
+
+ /**
+ * @dev Overridden version of the {Governor-_executeOperations} function that run the already queued proposal
+ * through the timelock.
+ */
+ function _executeOperations(
+ uint256 proposalId,
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 /*descriptionHash*/
+ ) internal virtual override {
+ GovernorTimelockCompoundStorage storage $ = _getGovernorTimelockCompoundStorage();
+ uint256 etaSeconds = proposalEta(proposalId);
+ if (etaSeconds == 0) {
+ revert GovernorNotQueuedProposal(proposalId);
+ }
+ Address.sendValue(payable($._timelock), msg.value);
+ for (uint256 i = 0; i < targets.length; ++i) {
+ $._timelock.executeTransaction(targets[i], values[i], "", calldatas[i], etaSeconds);
+ }
+ }
+
+ /**
+ * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it has already
+ * been queued.
+ */
+ function _cancel(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) internal virtual override returns (uint256) {
+ GovernorTimelockCompoundStorage storage $ = _getGovernorTimelockCompoundStorage();
+ uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);
+
+ uint256 etaSeconds = proposalEta(proposalId);
+ if (etaSeconds > 0) {
+ // do external call later
+ for (uint256 i = 0; i < targets.length; ++i) {
+ $._timelock.cancelTransaction(targets[i], values[i], "", calldatas[i], etaSeconds);
+ }
+ }
+
+ return proposalId;
+ }
+
+ /**
+ * @dev Address through which the governor executes action. In this case, the timelock.
+ */
+ function _executor() internal view virtual override returns (address) {
+ GovernorTimelockCompoundStorage storage $ = _getGovernorTimelockCompoundStorage();
+ return address($._timelock);
+ }
+
+ /**
+ * @dev Accept admin right over the timelock.
+ */
+ // solhint-disable-next-line openzeppelin/leading-underscore
+ function __acceptAdmin() public {
+ GovernorTimelockCompoundStorage storage $ = _getGovernorTimelockCompoundStorage();
+ $._timelock.acceptAdmin();
+ }
+
+ /**
+ * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates
+ * must be proposed, scheduled, and executed through governance proposals.
+ *
+ * For security reasons, the timelock must be handed over to another admin before setting up a new one. The two
+ * operations (hand over the timelock) and do the update can be batched in a single proposal.
+ *
+ * Note that if the timelock admin has been handed over in a previous operation, we refuse updates made through the
+ * timelock if admin of the timelock has already been accepted and the operation is executed outside the scope of
+ * governance.
+
+ * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.
+ */
+ function updateTimelock(ICompoundTimelock newTimelock) public virtual onlyGovernance {
+ _updateTimelock(newTimelock);
+ }
+
+ function _updateTimelock(ICompoundTimelock newTimelock) private {
+ GovernorTimelockCompoundStorage storage $ = _getGovernorTimelockCompoundStorage();
+ emit TimelockChange(address($._timelock), address(newTimelock));
+ $._timelock = newTimelock;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol
new file mode 100644
index 0000000..aff9fa7
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol
@@ -0,0 +1,192 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorTimelockControl.sol)
+
+pragma solidity ^0.8.24;
+
+import {IGovernor} from "@openzeppelin/contracts/governance/IGovernor.sol";
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {TimelockControllerUpgradeable} from "../TimelockControllerUpgradeable.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a
+ * delay, enforced by the {TimelockController} to all successful proposals (in addition to the voting duration). The
+ * {Governor} needs the proposer (and ideally the executor and canceller) roles for the {Governor} to work properly.
+ *
+ * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,
+ * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be
+ * inaccessible from a proposal, unless executed via {Governor-relay}.
+ *
+ * WARNING: Setting up the TimelockController to have additional proposers or cancelers besides the governor is very
+ * risky, as it grants them the ability to: 1) execute operations as the timelock, and thus possibly performing
+ * operations or accessing funds that are expected to only be accessible through a vote, and 2) block governance
+ * proposals that have been approved by the voters, effectively executing a Denial of Service attack.
+ */
+abstract contract GovernorTimelockControlUpgradeable is Initializable, GovernorUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorTimelockControl
+ struct GovernorTimelockControlStorage {
+ TimelockControllerUpgradeable _timelock;
+ mapping(uint256 proposalId => bytes32) _timelockIds;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorTimelockControl")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorTimelockControlStorageLocation = 0x0d5829787b8befdbc6044ef7457d8a95c2a04bc99235349f1a212c063e59d400;
+
+ function _getGovernorTimelockControlStorage() private pure returns (GovernorTimelockControlStorage storage $) {
+ assembly {
+ $.slot := GovernorTimelockControlStorageLocation
+ }
+ }
+
+ /**
+ * @dev Emitted when the timelock controller used for proposal execution is modified.
+ */
+ event TimelockChange(address oldTimelock, address newTimelock);
+
+ /**
+ * @dev Set the timelock.
+ */
+ function __GovernorTimelockControl_init(TimelockControllerUpgradeable timelockAddress) internal onlyInitializing {
+ __GovernorTimelockControl_init_unchained(timelockAddress);
+ }
+
+ function __GovernorTimelockControl_init_unchained(TimelockControllerUpgradeable timelockAddress) internal onlyInitializing {
+ _updateTimelock(timelockAddress);
+ }
+
+ /**
+ * @dev Overridden version of the {Governor-state} function that considers the status reported by the timelock.
+ */
+ function state(uint256 proposalId) public view virtual override returns (ProposalState) {
+ GovernorTimelockControlStorage storage $ = _getGovernorTimelockControlStorage();
+ ProposalState currentState = super.state(proposalId);
+
+ if (currentState != ProposalState.Queued) {
+ return currentState;
+ }
+
+ bytes32 queueId = $._timelockIds[proposalId];
+ if ($._timelock.isOperationPending(queueId)) {
+ return ProposalState.Queued;
+ } else if ($._timelock.isOperationDone(queueId)) {
+ // This can happen if the proposal is executed directly on the timelock.
+ return ProposalState.Executed;
+ } else {
+ // This can happen if the proposal is canceled directly on the timelock.
+ return ProposalState.Canceled;
+ }
+ }
+
+ /**
+ * @dev Public accessor to check the address of the timelock
+ */
+ function timelock() public view virtual returns (address) {
+ GovernorTimelockControlStorage storage $ = _getGovernorTimelockControlStorage();
+ return address($._timelock);
+ }
+
+ /// @inheritdoc IGovernor
+ function proposalNeedsQueuing(uint256) public view virtual override returns (bool) {
+ return true;
+ }
+
+ /**
+ * @dev Function to queue a proposal to the timelock.
+ */
+ function _queueOperations(
+ uint256 proposalId,
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) internal virtual override returns (uint48) {
+ GovernorTimelockControlStorage storage $ = _getGovernorTimelockControlStorage();
+ uint256 delay = $._timelock.getMinDelay();
+
+ bytes32 salt = _timelockSalt(descriptionHash);
+ $._timelockIds[proposalId] = $._timelock.hashOperationBatch(targets, values, calldatas, 0, salt);
+ $._timelock.scheduleBatch(targets, values, calldatas, 0, salt, delay);
+
+ return SafeCast.toUint48(block.timestamp + delay);
+ }
+
+ /**
+ * @dev Overridden version of the {Governor-_executeOperations} function that runs the already queued proposal
+ * through the timelock.
+ */
+ function _executeOperations(
+ uint256 proposalId,
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) internal virtual override {
+ GovernorTimelockControlStorage storage $ = _getGovernorTimelockControlStorage();
+ // execute
+ $._timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, _timelockSalt(descriptionHash));
+ // cleanup for refund
+ delete $._timelockIds[proposalId];
+ }
+
+ /**
+ * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it has already
+ * been queued.
+ */
+ // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and
+ // well behaved (according to TimelockController) and this will not happen.
+ // slither-disable-next-line reentrancy-no-eth
+ function _cancel(
+ address[] memory targets,
+ uint256[] memory values,
+ bytes[] memory calldatas,
+ bytes32 descriptionHash
+ ) internal virtual override returns (uint256) {
+ GovernorTimelockControlStorage storage $ = _getGovernorTimelockControlStorage();
+ uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);
+
+ bytes32 timelockId = $._timelockIds[proposalId];
+ if (timelockId != 0) {
+ // cancel
+ $._timelock.cancel(timelockId);
+ // cleanup
+ delete $._timelockIds[proposalId];
+ }
+
+ return proposalId;
+ }
+
+ /**
+ * @dev Address through which the governor executes action. In this case, the timelock.
+ */
+ function _executor() internal view virtual override returns (address) {
+ GovernorTimelockControlStorage storage $ = _getGovernorTimelockControlStorage();
+ return address($._timelock);
+ }
+
+ /**
+ * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates
+ * must be proposed, scheduled, and executed through governance proposals.
+ *
+ * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.
+ */
+ function updateTimelock(TimelockControllerUpgradeable newTimelock) public virtual onlyGovernance {
+ _updateTimelock(newTimelock);
+ }
+
+ function _updateTimelock(TimelockControllerUpgradeable newTimelock) private {
+ GovernorTimelockControlStorage storage $ = _getGovernorTimelockControlStorage();
+ emit TimelockChange(address($._timelock), address(newTimelock));
+ $._timelock = newTimelock;
+ }
+
+ /**
+ * @dev Computes the {TimelockController} operation salt.
+ *
+ * It is computed with the governor address itself to avoid collisions across governor instances using the
+ * same timelock.
+ */
+ function _timelockSalt(bytes32 descriptionHash) private view returns (bytes32) {
+ return bytes20(address(this)) ^ descriptionHash;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol
new file mode 100644
index 0000000..f457456
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorVotesQuorumFraction.sol)
+
+pragma solidity ^0.8.24;
+
+import {GovernorVotesUpgradeable} from "./GovernorVotesUpgradeable.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a
+ * fraction of the total supply.
+ */
+abstract contract GovernorVotesQuorumFractionUpgradeable is Initializable, GovernorVotesUpgradeable {
+ using Checkpoints for Checkpoints.Trace208;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorVotesQuorumFraction
+ struct GovernorVotesQuorumFractionStorage {
+ Checkpoints.Trace208 _quorumNumeratorHistory;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorVotesQuorumFraction")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorVotesQuorumFractionStorageLocation = 0xe770710421fd2cad75ad828c61aa98f2d77d423a440b67872d0f65554148e000;
+
+ function _getGovernorVotesQuorumFractionStorage() private pure returns (GovernorVotesQuorumFractionStorage storage $) {
+ assembly {
+ $.slot := GovernorVotesQuorumFractionStorageLocation
+ }
+ }
+
+ event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);
+
+ /**
+ * @dev The quorum set is not a valid fraction.
+ */
+ error GovernorInvalidQuorumFraction(uint256 quorumNumerator, uint256 quorumDenominator);
+
+ /**
+ * @dev Initialize quorum as a fraction of the token's total supply.
+ *
+ * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is
+ * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be
+ * customized by overriding {quorumDenominator}.
+ */
+ function __GovernorVotesQuorumFraction_init(uint256 quorumNumeratorValue) internal onlyInitializing {
+ __GovernorVotesQuorumFraction_init_unchained(quorumNumeratorValue);
+ }
+
+ function __GovernorVotesQuorumFraction_init_unchained(uint256 quorumNumeratorValue) internal onlyInitializing {
+ _updateQuorumNumerator(quorumNumeratorValue);
+ }
+
+ /**
+ * @dev Returns the current quorum numerator. See {quorumDenominator}.
+ */
+ function quorumNumerator() public view virtual returns (uint256) {
+ GovernorVotesQuorumFractionStorage storage $ = _getGovernorVotesQuorumFractionStorage();
+ return $._quorumNumeratorHistory.latest();
+ }
+
+ /**
+ * @dev Returns the quorum numerator at a specific timepoint. See {quorumDenominator}.
+ */
+ function quorumNumerator(uint256 timepoint) public view virtual returns (uint256) {
+ GovernorVotesQuorumFractionStorage storage $ = _getGovernorVotesQuorumFractionStorage();
+ return _optimisticUpperLookupRecent($._quorumNumeratorHistory, timepoint);
+ }
+
+ /**
+ * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.
+ */
+ function quorumDenominator() public view virtual returns (uint256) {
+ return 100;
+ }
+
+ /**
+ * @dev Returns the quorum for a timepoint, in terms of number of votes: `supply * numerator / denominator`.
+ */
+ function quorum(uint256 timepoint) public view virtual override returns (uint256) {
+ return Math.mulDiv(token().getPastTotalSupply(timepoint), quorumNumerator(timepoint), quorumDenominator());
+ }
+
+ /**
+ * @dev Changes the quorum numerator.
+ *
+ * Emits a {QuorumNumeratorUpdated} event.
+ *
+ * Requirements:
+ *
+ * - Must be called through a governance proposal.
+ * - New numerator must be smaller or equal to the denominator.
+ */
+ function updateQuorumNumerator(uint256 newQuorumNumerator) public virtual onlyGovernance {
+ _updateQuorumNumerator(newQuorumNumerator);
+ }
+
+ /**
+ * @dev Changes the quorum numerator.
+ *
+ * Emits a {QuorumNumeratorUpdated} event.
+ *
+ * Requirements:
+ *
+ * - New numerator must be smaller or equal to the denominator.
+ */
+ function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {
+ GovernorVotesQuorumFractionStorage storage $ = _getGovernorVotesQuorumFractionStorage();
+ uint256 denominator = quorumDenominator();
+ if (newQuorumNumerator > denominator) {
+ revert GovernorInvalidQuorumFraction(newQuorumNumerator, denominator);
+ }
+
+ uint256 oldQuorumNumerator = quorumNumerator();
+ $._quorumNumeratorHistory.push(clock(), SafeCast.toUint208(newQuorumNumerator));
+
+ emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);
+ }
+
+ /**
+ * @dev Returns the numerator at a specific timepoint.
+ */
+ function _optimisticUpperLookupRecent(
+ Checkpoints.Trace208 storage ckpts,
+ uint256 timepoint
+ ) internal view returns (uint256) {
+ // If trace is empty, key and value are both equal to 0.
+ // In that case `key <= timepoint` is true, and it is ok to return 0.
+ (, uint48 key, uint208 value) = ckpts.latestCheckpoint();
+ return key <= timepoint ? value : ckpts.upperLookupRecent(SafeCast.toUint48(timepoint));
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesSuperQuorumFractionUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesSuperQuorumFractionUpgradeable.sol
new file mode 100644
index 0000000..71a1a85
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesSuperQuorumFractionUpgradeable.sol
@@ -0,0 +1,156 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorVotesSuperQuorumFraction.sol)
+
+pragma solidity ^0.8.24;
+
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {GovernorSuperQuorumUpgradeable} from "./GovernorSuperQuorumUpgradeable.sol";
+import {GovernorVotesQuorumFractionUpgradeable} from "./GovernorVotesQuorumFractionUpgradeable.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {GovernorVotesQuorumFraction} with a super quorum expressed as a
+ * fraction of the total supply. Proposals that meet the super quorum (and have a majority of for votes) advance to
+ * the `Succeeded` state before the proposal deadline.
+ */
+abstract contract GovernorVotesSuperQuorumFractionUpgradeable is Initializable, GovernorVotesQuorumFractionUpgradeable, GovernorSuperQuorumUpgradeable {
+ using Checkpoints for Checkpoints.Trace208;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorVotesSuperQuorumFraction
+ struct GovernorVotesSuperQuorumFractionStorage {
+ Checkpoints.Trace208 _superQuorumNumeratorHistory;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorVotesSuperQuorumFraction")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorVotesSuperQuorumFractionStorageLocation = 0x31eabc8444b313223279a7cb4d22bce9201d463789f695e0a51f91d19ec31000;
+
+ function _getGovernorVotesSuperQuorumFractionStorage() private pure returns (GovernorVotesSuperQuorumFractionStorage storage $) {
+ assembly {
+ $.slot := GovernorVotesSuperQuorumFractionStorageLocation
+ }
+ }
+
+ event SuperQuorumNumeratorUpdated(uint256 oldSuperQuorumNumerator, uint256 newSuperQuorumNumerator);
+
+ /**
+ * @dev The super quorum set is not valid as it exceeds the quorum denominator.
+ */
+ error GovernorInvalidSuperQuorumFraction(uint256 superQuorumNumerator, uint256 denominator);
+
+ /**
+ * @dev The super quorum set is not valid as it is smaller or equal to the quorum.
+ */
+ error GovernorInvalidSuperQuorumTooSmall(uint256 superQuorumNumerator, uint256 quorumNumerator);
+
+ /**
+ * @dev The quorum set is not valid as it exceeds the super quorum.
+ */
+ error GovernorInvalidQuorumTooLarge(uint256 quorumNumerator, uint256 superQuorumNumerator);
+
+ /**
+ * @dev Initialize super quorum as a fraction of the token's total supply.
+ *
+ * The super quorum is specified as a fraction of the token's total supply and has to
+ * be greater than the quorum.
+ */
+ function __GovernorVotesSuperQuorumFraction_init(uint256 superQuorumNumeratorValue) internal onlyInitializing {
+ __GovernorVotesSuperQuorumFraction_init_unchained(superQuorumNumeratorValue);
+ }
+
+ function __GovernorVotesSuperQuorumFraction_init_unchained(uint256 superQuorumNumeratorValue) internal onlyInitializing {
+ _updateSuperQuorumNumerator(superQuorumNumeratorValue);
+ }
+
+ /**
+ * @dev Returns the current super quorum numerator.
+ */
+ function superQuorumNumerator() public view virtual returns (uint256) {
+ GovernorVotesSuperQuorumFractionStorage storage $ = _getGovernorVotesSuperQuorumFractionStorage();
+ return $._superQuorumNumeratorHistory.latest();
+ }
+
+ /**
+ * @dev Returns the super quorum numerator at a specific `timepoint`.
+ */
+ function superQuorumNumerator(uint256 timepoint) public view virtual returns (uint256) {
+ GovernorVotesSuperQuorumFractionStorage storage $ = _getGovernorVotesSuperQuorumFractionStorage();
+ return _optimisticUpperLookupRecent($._superQuorumNumeratorHistory, timepoint);
+ }
+
+ /**
+ * @dev Returns the super quorum for a `timepoint`, in terms of number of votes: `supply * numerator / denominator`.
+ * See {GovernorSuperQuorum-superQuorum} for more details.
+ */
+ function superQuorum(uint256 timepoint) public view virtual override returns (uint256) {
+ return Math.mulDiv(token().getPastTotalSupply(timepoint), superQuorumNumerator(timepoint), quorumDenominator());
+ }
+
+ /**
+ * @dev Changes the super quorum numerator.
+ *
+ * Emits a {SuperQuorumNumeratorUpdated} event.
+ *
+ * Requirements:
+ *
+ * - Must be called through a governance proposal.
+ * - New super quorum numerator must be smaller or equal to the denominator.
+ * - New super quorum numerator must be greater than or equal to the quorum numerator.
+ */
+ function updateSuperQuorumNumerator(uint256 newSuperQuorumNumerator) public virtual onlyGovernance {
+ _updateSuperQuorumNumerator(newSuperQuorumNumerator);
+ }
+
+ /**
+ * @dev Changes the super quorum numerator.
+ *
+ * Emits a {SuperQuorumNumeratorUpdated} event.
+ *
+ * Requirements:
+ *
+ * - New super quorum numerator must be smaller or equal to the denominator.
+ * - New super quorum numerator must be greater than or equal to the quorum numerator.
+ */
+ function _updateSuperQuorumNumerator(uint256 newSuperQuorumNumerator) internal virtual {
+ GovernorVotesSuperQuorumFractionStorage storage $ = _getGovernorVotesSuperQuorumFractionStorage();
+ uint256 denominator = quorumDenominator();
+ if (newSuperQuorumNumerator > denominator) {
+ revert GovernorInvalidSuperQuorumFraction(newSuperQuorumNumerator, denominator);
+ }
+
+ uint256 quorumNumerator = quorumNumerator();
+ if (newSuperQuorumNumerator < quorumNumerator) {
+ revert GovernorInvalidSuperQuorumTooSmall(newSuperQuorumNumerator, quorumNumerator);
+ }
+
+ uint256 oldSuperQuorumNumerator = $._superQuorumNumeratorHistory.latest();
+ $._superQuorumNumeratorHistory.push(clock(), SafeCast.toUint208(newSuperQuorumNumerator));
+
+ emit SuperQuorumNumeratorUpdated(oldSuperQuorumNumerator, newSuperQuorumNumerator);
+ }
+
+ /**
+ * @dev Overrides {GovernorVotesQuorumFraction-_updateQuorumNumerator} to ensure the super
+ * quorum numerator is greater than or equal to the quorum numerator.
+ */
+ function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual override {
+ GovernorVotesSuperQuorumFractionStorage storage $ = _getGovernorVotesSuperQuorumFractionStorage();
+ // Ignoring check when the superQuorum was never set (construction sets quorum before superQuorum)
+ if ($._superQuorumNumeratorHistory.length() > 0) {
+ uint256 superQuorumNumerator_ = superQuorumNumerator();
+ if (newQuorumNumerator > superQuorumNumerator_) {
+ revert GovernorInvalidQuorumTooLarge(newQuorumNumerator, superQuorumNumerator_);
+ }
+ }
+ super._updateQuorumNumerator(newQuorumNumerator);
+ }
+
+ /// @inheritdoc GovernorSuperQuorumUpgradeable
+ function state(
+ uint256 proposalId
+ ) public view virtual override(GovernorUpgradeable, GovernorSuperQuorumUpgradeable) returns (ProposalState) {
+ return super.state(proposalId);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol
new file mode 100644
index 0000000..340cc29
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorVotes.sol)
+
+pragma solidity ^0.8.24;
+
+import {GovernorUpgradeable} from "../GovernorUpgradeable.sol";
+import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";
+import {IERC5805} from "@openzeppelin/contracts/interfaces/IERC5805.sol";
+import {Time} from "@openzeppelin/contracts/utils/types/Time.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes}
+ * token.
+ */
+abstract contract GovernorVotesUpgradeable is Initializable, GovernorUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.GovernorVotes
+ struct GovernorVotesStorage {
+ IERC5805 _token;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.GovernorVotes")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant GovernorVotesStorageLocation = 0x3ba4977254e415696610a40ebf2258dbfa0ec6a2ff64e84bfe715ff16977cc00;
+
+ function _getGovernorVotesStorage() private pure returns (GovernorVotesStorage storage $) {
+ assembly {
+ $.slot := GovernorVotesStorageLocation
+ }
+ }
+
+ function __GovernorVotes_init(IVotes tokenAddress) internal onlyInitializing {
+ __GovernorVotes_init_unchained(tokenAddress);
+ }
+
+ function __GovernorVotes_init_unchained(IVotes tokenAddress) internal onlyInitializing {
+ GovernorVotesStorage storage $ = _getGovernorVotesStorage();
+ $._token = IERC5805(address(tokenAddress));
+ }
+
+ /**
+ * @dev The token that voting power is sourced from.
+ */
+ function token() public view virtual returns (IERC5805) {
+ GovernorVotesStorage storage $ = _getGovernorVotesStorage();
+ return $._token;
+ }
+
+ /**
+ * @dev Clock (as specified in ERC-6372) is set to match the token's clock. Fallback to block numbers if the token
+ * does not implement ERC-6372.
+ */
+ function clock() public view virtual override returns (uint48) {
+ try token().clock() returns (uint48 timepoint) {
+ return timepoint;
+ } catch {
+ return Time.blockNumber();
+ }
+ }
+
+ /**
+ * @dev Machine-readable description of the clock as specified in ERC-6372.
+ */
+ // solhint-disable-next-line func-name-mixedcase
+ function CLOCK_MODE() public view virtual override returns (string memory) {
+ try token().CLOCK_MODE() returns (string memory clockmode) {
+ return clockmode;
+ } catch {
+ return "mode=blocknumber&from=default";
+ }
+ }
+
+ /**
+ * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).
+ */
+ function _getVotes(
+ address account,
+ uint256 timepoint,
+ bytes memory /*params*/
+ ) internal view virtual override returns (uint256) {
+ return token().getPastVotes(account, timepoint);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/utils/VotesExtendedUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/utils/VotesExtendedUpgradeable.sol
new file mode 100644
index 0000000..6c7a57f
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/utils/VotesExtendedUpgradeable.sol
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (governance/utils/VotesExtended.sol)
+
+pragma solidity ^0.8.24;
+
+import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
+import {VotesUpgradeable} from "./VotesUpgradeable.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {Votes} that adds checkpoints for delegations and balances.
+ *
+ * WARNING: While this contract extends {Votes}, valid uses of {Votes} may not be compatible with
+ * {VotesExtended} without additional considerations. This implementation of {_transferVotingUnits} must
+ * run AFTER the voting weight movement is registered, such that it is reflected on {_getVotingUnits}.
+ *
+ * Said differently, {VotesExtended} MUST be integrated in a way that calls {_transferVotingUnits} AFTER the
+ * asset transfer is registered and balances are updated:
+ *
+ * ```solidity
+ * contract VotingToken is Token, VotesExtended {
+ * function transfer(address from, address to, uint256 tokenId) public override {
+ * super.transfer(from, to, tokenId); // <- Perform the transfer first ...
+ * _transferVotingUnits(from, to, 1); // <- ... then call _transferVotingUnits.
+ * }
+ *
+ * function _getVotingUnits(address account) internal view override returns (uint256) {
+ * return balanceOf(account);
+ * }
+ * }
+ * ```
+ *
+ * {ERC20Votes} and {ERC721Votes} follow this pattern and are thus safe to use with {VotesExtended}.
+ */
+abstract contract VotesExtendedUpgradeable is Initializable, VotesUpgradeable {
+ using Checkpoints for Checkpoints.Trace160;
+ using Checkpoints for Checkpoints.Trace208;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.VotesExtended
+ struct VotesExtendedStorage {
+ mapping(address delegator => Checkpoints.Trace160) _userDelegationCheckpoints;
+ mapping(address account => Checkpoints.Trace208) _userVotingUnitsCheckpoints;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.VotesExtended")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant VotesExtendedStorageLocation = 0x4a7bc7aabb540021543c1f28dd259f8776612c96fd248bdcc6fdf56c7778d900;
+
+ function _getVotesExtendedStorage() private pure returns (VotesExtendedStorage storage $) {
+ assembly {
+ $.slot := VotesExtendedStorageLocation
+ }
+ }
+
+ function __VotesExtended_init() internal onlyInitializing {
+ }
+
+ function __VotesExtended_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Returns the delegate of an `account` at a specific moment in the past. If the `clock()` is
+ * configured to use block numbers, this will return the value at the end of the corresponding block.
+ *
+ * Requirements:
+ *
+ * - `timepoint` must be in the past. If operating using block numbers, the block must be already mined.
+ */
+ function getPastDelegate(address account, uint256 timepoint) public view virtual returns (address) {
+ VotesExtendedStorage storage $ = _getVotesExtendedStorage();
+ return address($._userDelegationCheckpoints[account].upperLookupRecent(_validateTimepoint(timepoint)));
+ }
+
+ /**
+ * @dev Returns the `balanceOf` of an `account` at a specific moment in the past. If the `clock()` is
+ * configured to use block numbers, this will return the value at the end of the corresponding block.
+ *
+ * Requirements:
+ *
+ * - `timepoint` must be in the past. If operating using block numbers, the block must be already mined.
+ */
+ function getPastBalanceOf(address account, uint256 timepoint) public view virtual returns (uint256) {
+ VotesExtendedStorage storage $ = _getVotesExtendedStorage();
+ return $._userVotingUnitsCheckpoints[account].upperLookupRecent(_validateTimepoint(timepoint));
+ }
+
+ /// @inheritdoc VotesUpgradeable
+ function _delegate(address account, address delegatee) internal virtual override {
+ VotesExtendedStorage storage $ = _getVotesExtendedStorage();
+ super._delegate(account, delegatee);
+
+ $._userDelegationCheckpoints[account].push(clock(), uint160(delegatee));
+ }
+
+ /// @inheritdoc VotesUpgradeable
+ function _transferVotingUnits(address from, address to, uint256 amount) internal virtual override {
+ VotesExtendedStorage storage $ = _getVotesExtendedStorage();
+ super._transferVotingUnits(from, to, amount);
+ if (from != to) {
+ if (from != address(0)) {
+ $._userVotingUnitsCheckpoints[from].push(clock(), SafeCast.toUint208(_getVotingUnits(from)));
+ }
+ if (to != address(0)) {
+ $._userVotingUnitsCheckpoints[to].push(clock(), SafeCast.toUint208(_getVotingUnits(to)));
+ }
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/governance/utils/VotesUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/governance/utils/VotesUpgradeable.sol
new file mode 100644
index 0000000..34f0e0e
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/governance/utils/VotesUpgradeable.sol
@@ -0,0 +1,281 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (governance/utils/Votes.sol)
+
+pragma solidity ^0.8.24;
+
+import {IERC5805} from "@openzeppelin/contracts/interfaces/IERC5805.sol";
+import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol";
+import {NoncesUpgradeable} from "../../utils/NoncesUpgradeable.sol";
+import {EIP712Upgradeable} from "../../utils/cryptography/EIP712Upgradeable.sol";
+import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import {Time} from "@openzeppelin/contracts/utils/types/Time.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev This is a base abstract contract that tracks voting units, which are a measure of voting power that can be
+ * transferred, and provides a system of vote delegation, where an account can delegate its voting units to a sort of
+ * "representative" that will pool delegated voting units from different accounts and can then use it to vote in
+ * decisions. In fact, voting units _must_ be delegated in order to count as actual votes, and an account has to
+ * delegate those votes to itself if it wishes to participate in decisions and does not have a trusted representative.
+ *
+ * This contract is often combined with a token contract such that voting units correspond to token units. For an
+ * example, see {ERC721Votes}.
+ *
+ * The full history of delegate votes is tracked on-chain so that governance protocols can consider votes as distributed
+ * at a particular block number to protect against flash loans and double voting. The opt-in delegate system makes the
+ * cost of this history tracking optional.
+ *
+ * When using this module the derived contract must implement {_getVotingUnits} (for example, make it return
+ * {ERC721-balanceOf}), and can use {_transferVotingUnits} to track a change in the distribution of those units (in the
+ * previous example, it would be included in {ERC721-_update}).
+ */
+abstract contract VotesUpgradeable is Initializable, ContextUpgradeable, EIP712Upgradeable, NoncesUpgradeable, IERC5805 {
+ using Checkpoints for Checkpoints.Trace208;
+
+ bytes32 private constant DELEGATION_TYPEHASH =
+ keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.Votes
+ struct VotesStorage {
+ mapping(address account => address) _delegatee;
+
+ mapping(address delegatee => Checkpoints.Trace208) _delegateCheckpoints;
+
+ Checkpoints.Trace208 _totalCheckpoints;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Votes")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant VotesStorageLocation = 0xe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d00;
+
+ function _getVotesStorage() private pure returns (VotesStorage storage $) {
+ assembly {
+ $.slot := VotesStorageLocation
+ }
+ }
+
+ /**
+ * @dev The clock was incorrectly modified.
+ */
+ error ERC6372InconsistentClock();
+
+ /**
+ * @dev Lookup to future votes is not available.
+ */
+ error ERC5805FutureLookup(uint256 timepoint, uint48 clock);
+
+ function __Votes_init() internal onlyInitializing {
+ }
+
+ function __Votes_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based
+ * checkpoints (and voting), in which case {CLOCK_MODE} should be overridden as well to match.
+ */
+ function clock() public view virtual returns (uint48) {
+ return Time.blockNumber();
+ }
+
+ /**
+ * @dev Machine-readable description of the clock as specified in ERC-6372.
+ */
+ // solhint-disable-next-line func-name-mixedcase
+ function CLOCK_MODE() public view virtual returns (string memory) {
+ // Check that the clock was not modified
+ if (clock() != Time.blockNumber()) {
+ revert ERC6372InconsistentClock();
+ }
+ return "mode=blocknumber&from=default";
+ }
+
+ /**
+ * @dev Validate that a timepoint is in the past, and return it as a uint48.
+ */
+ function _validateTimepoint(uint256 timepoint) internal view returns (uint48) {
+ uint48 currentTimepoint = clock();
+ if (timepoint >= currentTimepoint) revert ERC5805FutureLookup(timepoint, currentTimepoint);
+ return SafeCast.toUint48(timepoint);
+ }
+
+ /**
+ * @dev Returns the current amount of votes that `account` has.
+ */
+ function getVotes(address account) public view virtual returns (uint256) {
+ VotesStorage storage $ = _getVotesStorage();
+ return $._delegateCheckpoints[account].latest();
+ }
+
+ /**
+ * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is
+ * configured to use block numbers, this will return the value at the end of the corresponding block.
+ *
+ * Requirements:
+ *
+ * - `timepoint` must be in the past. If operating using block numbers, the block must be already mined.
+ */
+ function getPastVotes(address account, uint256 timepoint) public view virtual returns (uint256) {
+ VotesStorage storage $ = _getVotesStorage();
+ return $._delegateCheckpoints[account].upperLookupRecent(_validateTimepoint(timepoint));
+ }
+
+ /**
+ * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is
+ * configured to use block numbers, this will return the value at the end of the corresponding block.
+ *
+ * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.
+ * Votes that have not been delegated are still part of total supply, even though they would not participate in a
+ * vote.
+ *
+ * Requirements:
+ *
+ * - `timepoint` must be in the past. If operating using block numbers, the block must be already mined.
+ */
+ function getPastTotalSupply(uint256 timepoint) public view virtual returns (uint256) {
+ VotesStorage storage $ = _getVotesStorage();
+ return $._totalCheckpoints.upperLookupRecent(_validateTimepoint(timepoint));
+ }
+
+ /**
+ * @dev Returns the current total supply of votes.
+ */
+ function _getTotalSupply() internal view virtual returns (uint256) {
+ VotesStorage storage $ = _getVotesStorage();
+ return $._totalCheckpoints.latest();
+ }
+
+ /**
+ * @dev Returns the delegate that `account` has chosen.
+ */
+ function delegates(address account) public view virtual returns (address) {
+ VotesStorage storage $ = _getVotesStorage();
+ return $._delegatee[account];
+ }
+
+ /**
+ * @dev Delegates votes from the sender to `delegatee`.
+ */
+ function delegate(address delegatee) public virtual {
+ address account = _msgSender();
+ _delegate(account, delegatee);
+ }
+
+ /**
+ * @dev Delegates votes from signer to `delegatee`.
+ */
+ function delegateBySig(
+ address delegatee,
+ uint256 nonce,
+ uint256 expiry,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) public virtual {
+ if (block.timestamp > expiry) {
+ revert VotesExpiredSignature(expiry);
+ }
+ address signer = ECDSA.recover(
+ _hashTypedDataV4(keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
+ v,
+ r,
+ s
+ );
+ _useCheckedNonce(signer, nonce);
+ _delegate(signer, delegatee);
+ }
+
+ /**
+ * @dev Delegate all of `account`'s voting units to `delegatee`.
+ *
+ * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.
+ */
+ function _delegate(address account, address delegatee) internal virtual {
+ VotesStorage storage $ = _getVotesStorage();
+ address oldDelegate = delegates(account);
+ $._delegatee[account] = delegatee;
+
+ emit DelegateChanged(account, oldDelegate, delegatee);
+ _moveDelegateVotes(oldDelegate, delegatee, _getVotingUnits(account));
+ }
+
+ /**
+ * @dev Transfers, mints, or burns voting units. To register a mint, `from` should be zero. To register a burn, `to`
+ * should be zero. Total supply of voting units will be adjusted with mints and burns.
+ */
+ function _transferVotingUnits(address from, address to, uint256 amount) internal virtual {
+ VotesStorage storage $ = _getVotesStorage();
+ if (from == address(0)) {
+ _push($._totalCheckpoints, _add, SafeCast.toUint208(amount));
+ }
+ if (to == address(0)) {
+ _push($._totalCheckpoints, _subtract, SafeCast.toUint208(amount));
+ }
+ _moveDelegateVotes(delegates(from), delegates(to), amount);
+ }
+
+ /**
+ * @dev Moves delegated votes from one delegate to another.
+ */
+ function _moveDelegateVotes(address from, address to, uint256 amount) internal virtual {
+ VotesStorage storage $ = _getVotesStorage();
+ if (from != to && amount > 0) {
+ if (from != address(0)) {
+ (uint256 oldValue, uint256 newValue) = _push(
+ $._delegateCheckpoints[from],
+ _subtract,
+ SafeCast.toUint208(amount)
+ );
+ emit DelegateVotesChanged(from, oldValue, newValue);
+ }
+ if (to != address(0)) {
+ (uint256 oldValue, uint256 newValue) = _push(
+ $._delegateCheckpoints[to],
+ _add,
+ SafeCast.toUint208(amount)
+ );
+ emit DelegateVotesChanged(to, oldValue, newValue);
+ }
+ }
+ }
+
+ /**
+ * @dev Get number of checkpoints for `account`.
+ */
+ function _numCheckpoints(address account) internal view virtual returns (uint32) {
+ VotesStorage storage $ = _getVotesStorage();
+ return SafeCast.toUint32($._delegateCheckpoints[account].length());
+ }
+
+ /**
+ * @dev Get the `pos`-th checkpoint for `account`.
+ */
+ function _checkpoints(
+ address account,
+ uint32 pos
+ ) internal view virtual returns (Checkpoints.Checkpoint208 memory) {
+ VotesStorage storage $ = _getVotesStorage();
+ return $._delegateCheckpoints[account].at(pos);
+ }
+
+ function _push(
+ Checkpoints.Trace208 storage store,
+ function(uint208, uint208) view returns (uint208) op,
+ uint208 delta
+ ) private returns (uint208 oldValue, uint208 newValue) {
+ return store.push(clock(), op(store.latest(), delta));
+ }
+
+ function _add(uint208 a, uint208 b) private pure returns (uint208) {
+ return a + b;
+ }
+
+ function _subtract(uint208 a, uint208 b) private pure returns (uint208) {
+ return a - b;
+ }
+
+ /**
+ * @dev Must return the voting units held by an account.
+ */
+ function _getVotingUnits(address) internal view virtual returns (uint256);
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/metatx/ERC2771ContextUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/metatx/ERC2771ContextUpgradeable.sol
new file mode 100644
index 0000000..5fbedb9
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/metatx/ERC2771ContextUpgradeable.sol
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (metatx/ERC2771Context.sol)
+
+pragma solidity ^0.8.20;
+
+import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Context variant with ERC-2771 support. See {_msgSender} for the calldata format.
+ *
+ * WARNING: Avoid using this pattern in contracts that rely on a specific calldata length as they'll
+ * be affected by any forwarder whose `msg.data` is suffixed with the `from` address according to the ERC-2771
+ * specification adding the address size in bytes (20) to the calldata size. An example of an unexpected
+ * behavior could be an unintended fallback (or another function) invocation while trying to invoke the `receive`
+ * function only accessible if `msg.data.length == 0`.
+ *
+ * WARNING: The usage of `delegatecall` in this contract is dangerous and may result in context corruption.
+ * Any forwarded request to this contract triggering a `delegatecall` to itself will result in an invalid {_msgSender}
+ * recovery.
+ */
+abstract contract ERC2771ContextUpgradeable is Initializable, ContextUpgradeable {
+ /// @custom:oz-upgrades-unsafe-allow state-variable-immutable
+ address private immutable _trustedForwarder;
+
+ /**
+ * @dev Initializes the contract with a trusted forwarder, which will be able to
+ * invoke functions on this contract on behalf of other accounts.
+ *
+ * NOTE: The trusted forwarder can be replaced by overriding {trustedForwarder}.
+ */
+ /// @custom:oz-upgrades-unsafe-allow constructor
+ constructor(address trustedForwarder_) {
+ _trustedForwarder = trustedForwarder_;
+ }
+
+ /**
+ * @dev Returns the address of the trusted forwarder.
+ */
+ function trustedForwarder() public view virtual returns (address) {
+ return _trustedForwarder;
+ }
+
+ /**
+ * @dev Indicates whether any particular address is the trusted forwarder.
+ */
+ function isTrustedForwarder(address forwarder) public view virtual returns (bool) {
+ return forwarder == trustedForwarder();
+ }
+
+ /**
+ * @dev Override for `msg.sender`. Defaults to the original `msg.sender` whenever
+ * a call is not performed by the trusted forwarder or the calldata length is less than
+ * 20 bytes (an address length).
+ */
+ function _msgSender() internal view virtual override returns (address) {
+ uint256 calldataLength = msg.data.length;
+ uint256 contextSuffixLength = _contextSuffixLength();
+ if (calldataLength >= contextSuffixLength && isTrustedForwarder(msg.sender)) {
+ unchecked {
+ return address(bytes20(msg.data[calldataLength - contextSuffixLength:]));
+ }
+ } else {
+ return super._msgSender();
+ }
+ }
+
+ /**
+ * @dev Override for `msg.data`. Defaults to the original `msg.data` whenever
+ * a call is not performed by the trusted forwarder or the calldata length is less than
+ * 20 bytes (an address length).
+ */
+ function _msgData() internal view virtual override returns (bytes calldata) {
+ uint256 calldataLength = msg.data.length;
+ uint256 contextSuffixLength = _contextSuffixLength();
+ if (calldataLength >= contextSuffixLength && isTrustedForwarder(msg.sender)) {
+ unchecked {
+ return msg.data[:calldataLength - contextSuffixLength];
+ }
+ } else {
+ return super._msgData();
+ }
+ }
+
+ /**
+ * @dev ERC-2771 specifies the context as being a single address (20 bytes).
+ */
+ function _contextSuffixLength() internal view virtual override returns (uint256) {
+ return 20;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/metatx/ERC2771ForwarderUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/metatx/ERC2771ForwarderUpgradeable.sol
new file mode 100644
index 0000000..eb36d44
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/metatx/ERC2771ForwarderUpgradeable.sol
@@ -0,0 +1,380 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (metatx/ERC2771Forwarder.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC2771ContextUpgradeable} from "./ERC2771ContextUpgradeable.sol";
+import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import {EIP712Upgradeable} from "../utils/cryptography/EIP712Upgradeable.sol";
+import {NoncesUpgradeable} from "../utils/NoncesUpgradeable.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {Errors} from "@openzeppelin/contracts/utils/Errors.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev A forwarder compatible with ERC-2771 contracts. See {ERC2771Context}.
+ *
+ * This forwarder operates on forward requests that include:
+ *
+ * * `from`: An address to operate on behalf of. It is required to be equal to the request signer.
+ * * `to`: The address that should be called.
+ * * `value`: The amount of native token to attach with the requested call.
+ * * `gas`: The amount of gas limit that will be forwarded with the requested call.
+ * * `nonce` (implicit): Taken from {Nonces} for `from` and included in the signed typed data.
+ * * `deadline`: A timestamp after which the request is not executable anymore.
+ * * `data`: Encoded `msg.data` to send with the requested call.
+ *
+ * Relayers are able to submit batches if they are processing a high volume of requests. With high
+ * throughput, relayers may run into limitations of the chain such as limits on the number of
+ * transactions in the mempool. In these cases the recommendation is to distribute the load among
+ * multiple accounts.
+ *
+ * NOTE: Batching requests includes an optional refund for unused `msg.value` that is achieved by
+ * performing a call with empty calldata. While this is within the bounds of ERC-2771 compliance,
+ * if the refund receiver happens to consider the forwarder a trusted forwarder, it MUST properly
+ * handle `msg.data.length == 0`. `ERC2771Context` in OpenZeppelin Contracts versions prior to 4.9.3
+ * do not handle this properly.
+ *
+ * ==== Security Considerations
+ *
+ * If a relayer submits a forward request, it should be willing to pay up to 100% of the gas amount
+ * specified in the request. This contract does not implement any kind of retribution for this gas,
+ * and it is assumed that there is an out of band incentive for relayers to pay for execution on
+ * behalf of signers. Often, the relayer is operated by a project that will consider it a user
+ * acquisition cost.
+ *
+ * By offering to pay for gas, relayers are at risk of having that gas used by an attacker toward
+ * some other purpose that is not aligned with the expected out of band incentives. If you operate a
+ * relayer, consider whitelisting target contracts and function selectors. When relaying ERC-721 or
+ * ERC-1155 transfers specifically, consider rejecting the use of the `data` field, since it can be
+ * used to execute arbitrary code.
+ */
+contract ERC2771ForwarderUpgradeable is Initializable, EIP712Upgradeable, NoncesUpgradeable {
+ using ECDSA for bytes32;
+
+ struct ForwardRequestData {
+ address from;
+ address to;
+ uint256 value;
+ uint256 gas;
+ uint48 deadline;
+ bytes data;
+ bytes signature;
+ }
+
+ bytes32 internal constant FORWARD_REQUEST_TYPEHASH =
+ keccak256(
+ "ForwardRequest(address from,address to,uint256 value,uint256 gas,uint256 nonce,uint48 deadline,bytes data)"
+ );
+
+ /**
+ * @dev Emitted when a `ForwardRequest` is executed.
+ *
+ * NOTE: An unsuccessful forward request could be due to an invalid signature, an expired deadline,
+ * or simply a revert in the requested call. The contract guarantees that the relayer is not able to force
+ * the requested call to run out of gas.
+ */
+ event ExecutedForwardRequest(address indexed signer, uint256 nonce, bool success);
+
+ /**
+ * @dev The request `from` doesn't match with the recovered `signer`.
+ */
+ error ERC2771ForwarderInvalidSigner(address signer, address from);
+
+ /**
+ * @dev The `requestedValue` doesn't match with the available `msgValue`.
+ */
+ error ERC2771ForwarderMismatchedValue(uint256 requestedValue, uint256 msgValue);
+
+ /**
+ * @dev The request `deadline` has expired.
+ */
+ error ERC2771ForwarderExpiredRequest(uint48 deadline);
+
+ /**
+ * @dev The request target doesn't trust the `forwarder`.
+ */
+ error ERC2771UntrustfulTarget(address target, address forwarder);
+
+ function initialize(string memory name) public virtual initializer {
+ __ERC2771Forwarder_init(name);
+ }
+ /**
+ * @dev See {EIP712-constructor}.
+ */
+ function __ERC2771Forwarder_init(string memory name) internal onlyInitializing {
+ __EIP712_init_unchained(name, "1");
+ }
+
+ function __ERC2771Forwarder_init_unchained(string memory) internal onlyInitializing {}
+
+ /**
+ * @dev Returns `true` if a request is valid for a provided `signature` at the current block timestamp.
+ *
+ * A transaction is considered valid when the target trusts this forwarder, the request hasn't expired
+ * (deadline is not met), and the signer matches the `from` parameter of the signed request.
+ *
+ * NOTE: A request may return false here but it won't cause {executeBatch} to revert if a refund
+ * receiver is provided.
+ */
+ function verify(ForwardRequestData calldata request) public view virtual returns (bool) {
+ (bool isTrustedForwarder, bool active, bool signerMatch, ) = _validate(request);
+ return isTrustedForwarder && active && signerMatch;
+ }
+
+ /**
+ * @dev Executes a `request` on behalf of `signature`'s signer using the ERC-2771 protocol. The gas
+ * provided to the requested call may not be exactly the amount requested, but the call will not run
+ * out of gas. Will revert if the request is invalid or the call reverts, in this case the nonce is not consumed.
+ *
+ * Requirements:
+ *
+ * - The request value should be equal to the provided `msg.value`.
+ * - The request should be valid according to {verify}.
+ */
+ function execute(ForwardRequestData calldata request) public payable virtual {
+ // We make sure that msg.value and request.value match exactly.
+ // If the request is invalid or the call reverts, this whole function
+ // will revert, ensuring value isn't stuck.
+ if (msg.value != request.value) {
+ revert ERC2771ForwarderMismatchedValue(request.value, msg.value);
+ }
+
+ if (!_execute(request, true)) {
+ revert Errors.FailedCall();
+ }
+ }
+
+ /**
+ * @dev Batch version of {execute} with optional refunding and atomic execution.
+ *
+ * In case a batch contains at least one invalid request (see {verify}), the
+ * request will be skipped and the `refundReceiver` parameter will receive back the
+ * unused requested value at the end of the execution. This is done to prevent reverting
+ * the entire batch when a request is invalid or has already been submitted.
+ *
+ * If the `refundReceiver` is the `address(0)`, this function will revert when at least
+ * one of the requests was not valid instead of skipping it. This could be useful if
+ * a batch is required to get executed atomically (at least at the top-level). For example,
+ * refunding (and thus atomicity) can be opt-out if the relayer is using a service that avoids
+ * including reverted transactions.
+ *
+ * Requirements:
+ *
+ * - The sum of the requests' values should be equal to the provided `msg.value`.
+ * - All of the requests should be valid (see {verify}) when `refundReceiver` is the zero address.
+ *
+ * NOTE: Setting a zero `refundReceiver` guarantees an all-or-nothing requests execution only for
+ * the first-level forwarded calls. In case a forwarded request calls to a contract with another
+ * subcall, the second-level call may revert without the top-level call reverting.
+ */
+ function executeBatch(
+ ForwardRequestData[] calldata requests,
+ address payable refundReceiver
+ ) public payable virtual {
+ bool atomic = refundReceiver == address(0);
+
+ uint256 requestsValue;
+ uint256 refundValue;
+
+ for (uint256 i; i < requests.length; ++i) {
+ requestsValue += requests[i].value;
+ bool success = _execute(requests[i], atomic);
+ if (!success) {
+ refundValue += requests[i].value;
+ }
+ }
+
+ // The batch should revert if there's a mismatched msg.value provided
+ // to avoid request value tampering
+ if (requestsValue != msg.value) {
+ revert ERC2771ForwarderMismatchedValue(requestsValue, msg.value);
+ }
+
+ // Some requests with value were invalid (possibly due to frontrunning).
+ // To avoid leaving ETH in the contract this value is refunded.
+ if (refundValue != 0) {
+ // We know refundReceiver != address(0) && requestsValue == msg.value
+ // meaning we can ensure refundValue is not taken from the original contract's balance
+ // and refundReceiver is a known account.
+ Address.sendValue(refundReceiver, refundValue);
+ }
+ }
+
+ /**
+ * @dev Validates if the provided request can be executed at current block timestamp with
+ * the given `request.signature` on behalf of `request.from`.
+ */
+ function _validate(
+ ForwardRequestData calldata request
+ ) internal view virtual returns (bool isTrustedForwarder, bool active, bool signerMatch, address signer) {
+ (bool isValid, address recovered) = _recoverForwardRequestSigner(request);
+
+ return (
+ _isTrustedByTarget(request.to),
+ request.deadline >= block.timestamp,
+ isValid && recovered == request.from,
+ recovered
+ );
+ }
+
+ /**
+ * @dev Returns a tuple with the recovered the signer of an EIP712 forward request message hash
+ * and a boolean indicating if the signature is valid.
+ *
+ * NOTE: The signature is considered valid if {ECDSA-tryRecoverCalldata} indicates no recover error for it.
+ */
+ function _recoverForwardRequestSigner(
+ ForwardRequestData calldata request
+ ) internal view virtual returns (bool isValid, address signer) {
+ (address recovered, ECDSA.RecoverError err, ) = _hashTypedDataV4(
+ keccak256(
+ abi.encode(
+ FORWARD_REQUEST_TYPEHASH,
+ request.from,
+ request.to,
+ request.value,
+ request.gas,
+ nonces(request.from),
+ request.deadline,
+ keccak256(request.data)
+ )
+ )
+ ).tryRecoverCalldata(request.signature);
+
+ return (err == ECDSA.RecoverError.NoError, recovered);
+ }
+
+ /**
+ * @dev Validates and executes a signed request returning the request call `success` value.
+ *
+ * Internal function without msg.value validation.
+ *
+ * Requirements:
+ *
+ * - The caller must have provided enough gas to forward with the call.
+ * - The request must be valid (see {verify}) if the `requireValidRequest` is true.
+ *
+ * Emits an {ExecutedForwardRequest} event.
+ *
+ * IMPORTANT: Using this function doesn't check that all the `msg.value` was sent, potentially
+ * leaving value stuck in the contract.
+ */
+ function _execute(
+ ForwardRequestData calldata request,
+ bool requireValidRequest
+ ) internal virtual returns (bool success) {
+ (bool isTrustedForwarder, bool active, bool signerMatch, address signer) = _validate(request);
+
+ // Need to explicitly specify if a revert is required since non-reverting is default for
+ // batches and reversion is opt-in since it could be useful in some scenarios
+ if (requireValidRequest) {
+ if (!isTrustedForwarder) {
+ revert ERC2771UntrustfulTarget(request.to, address(this));
+ }
+
+ if (!active) {
+ revert ERC2771ForwarderExpiredRequest(request.deadline);
+ }
+
+ if (!signerMatch) {
+ revert ERC2771ForwarderInvalidSigner(signer, request.from);
+ }
+ }
+
+ // Ignore an invalid request because requireValidRequest = false
+ if (isTrustedForwarder && signerMatch && active) {
+ // Nonce should be used before the call to prevent reusing by reentrancy
+ uint256 currentNonce = _useNonce(signer);
+
+ uint256 reqGas = request.gas;
+ address to = request.to;
+ uint256 value = request.value;
+ bytes memory data = abi.encodePacked(request.data, request.from);
+
+ uint256 gasLeft;
+
+ assembly ("memory-safe") {
+ success := call(reqGas, to, value, add(data, 0x20), mload(data), 0x00, 0x00)
+ gasLeft := gas()
+ }
+
+ _checkForwardedGas(gasLeft, request);
+
+ emit ExecutedForwardRequest(signer, currentNonce, success);
+ }
+ }
+
+ /**
+ * @dev Returns whether the target trusts this forwarder.
+ *
+ * This function performs a static call to the target contract calling the
+ * {ERC2771Context-isTrustedForwarder} function.
+ *
+ * NOTE: Consider the execution of this forwarder is permissionless. Without this check, anyone may transfer assets
+ * that are owned by, or are approved to this forwarder.
+ */
+ function _isTrustedByTarget(address target) internal view virtual returns (bool) {
+ bytes memory encodedParams = abi.encodeCall(ERC2771ContextUpgradeable.isTrustedForwarder, (address(this)));
+
+ bool success;
+ uint256 returnSize;
+ uint256 returnValue;
+ assembly ("memory-safe") {
+ // Perform the staticcall and save the result in the scratch space.
+ // | Location | Content | Content (Hex) |
+ // |-----------|----------|--------------------------------------------------------------------|
+ // | | | result ↓ |
+ // | 0x00:0x1F | selector | 0x0000000000000000000000000000000000000000000000000000000000000001 |
+ success := staticcall(gas(), target, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)
+ returnSize := returndatasize()
+ returnValue := mload(0x00)
+ }
+
+ return success && returnSize >= 0x20 && returnValue > 0;
+ }
+
+ /**
+ * @dev Checks if the requested gas was correctly forwarded to the callee.
+ *
+ * As a consequence of https://eips.ethereum.org/EIPS/eip-150[EIP-150]:
+ * - At most `gasleft() - floor(gasleft() / 64)` is forwarded to the callee.
+ * - At least `floor(gasleft() / 64)` is kept in the caller.
+ *
+ * It reverts consuming all the available gas if the forwarded gas is not the requested gas.
+ *
+ * IMPORTANT: The `gasLeft` parameter should be measured exactly at the end of the forwarded call.
+ * Any gas consumed in between will make room for bypassing this check.
+ */
+ function _checkForwardedGas(uint256 gasLeft, ForwardRequestData calldata request) private pure {
+ // To avoid insufficient gas griefing attacks, as referenced in https://ronan.eth.limo/blog/ethereum-gas-dangers/
+ //
+ // A malicious relayer can attempt to shrink the gas forwarded so that the underlying call reverts out-of-gas
+ // but the forwarding itself still succeeds. In order to make sure that the subcall received sufficient gas,
+ // we will inspect gasleft() after the forwarding.
+ //
+ // Let X be the gas available before the subcall, such that the subcall gets at most X * 63 / 64.
+ // We can't know X after CALL dynamic costs, but we want it to be such that X * 63 / 64 >= req.gas.
+ // Let Y be the gas used in the subcall. gasleft() measured immediately after the subcall will be gasleft() = X - Y.
+ // If the subcall ran out of gas, then Y = X * 63 / 64 and gasleft() = X - Y = X / 64.
+ // Under this assumption req.gas / 63 > gasleft() is true if and only if
+ // req.gas / 63 > X / 64, or equivalently req.gas > X * 63 / 64.
+ // This means that if the subcall runs out of gas we are able to detect that insufficient gas was passed.
+ //
+ // We will now also see that req.gas / 63 > gasleft() implies that req.gas >= X * 63 / 64.
+ // The contract guarantees Y <= req.gas, thus gasleft() = X - Y >= X - req.gas.
+ // - req.gas / 63 > gasleft()
+ // - req.gas / 63 >= X - req.gas
+ // - req.gas >= X * 63 / 64
+ // In other words if req.gas < X * 63 / 64 then req.gas / 63 <= gasleft(), thus if the relayer behaves honestly
+ // the forwarding does not revert.
+ if (gasLeft < request.gas / 63) {
+ // We explicitly trigger invalid opcode to consume all gas and bubble-up the effects, since
+ // neither revert or assert consume all gas since Solidity 0.8.20
+ // https://docs.soliditylang.org/en/v0.8.20/control-structures.html#panic-via-assert-and-error-via-require
+ assembly ("memory-safe") {
+ invalid()
+ }
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/package.json b/lib/openzeppelin-contracts-upgradeable/package.json
new file mode 100644
index 0000000..2ae6c87
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "@openzeppelin/contracts-upgradeable",
+ "description": "Secure Smart Contract library for Solidity",
+ "version": "5.6.1",
+ "files": [
+ "**/*.sol",
+ "/build/contracts/*.json",
+ "!/mocks/**/*"
+ ],
+ "scripts": {
+ "prepack": "bash ../scripts/prepack.sh",
+ "prepare-docs": "cd ..; npm run prepare-docs"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable.git"
+ },
+ "keywords": [
+ "solidity",
+ "ethereum",
+ "smart",
+ "contracts",
+ "security",
+ "zeppelin"
+ ],
+ "author": "OpenZeppelin Community ",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/OpenZeppelin/openzeppelin-contracts/issues"
+ },
+ "homepage": "https://openzeppelin.com/contracts/",
+ "peerDependencies": {
+ "@openzeppelin/contracts": "5.6.1"
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/proxy/utils/Initializable.sol b/lib/openzeppelin-contracts-upgradeable/proxy/utils/Initializable.sol
new file mode 100644
index 0000000..b5f26b5
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/proxy/utils/Initializable.sol
@@ -0,0 +1,5 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.20;
+
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
diff --git a/lib/openzeppelin-contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol
new file mode 100644
index 0000000..e869ba6
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol
@@ -0,0 +1,5 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.22;
+
+import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol
new file mode 100644
index 0000000..291856c
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol
@@ -0,0 +1,441 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC1155/ERC1155.sol)
+
+pragma solidity ^0.8.24;
+
+import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
+import {IERC1155MetadataURI} from "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
+import {ERC1155Utils} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Utils.sol";
+import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {ERC165Upgradeable} from "../../utils/introspection/ERC165Upgradeable.sol";
+import {Arrays} from "@openzeppelin/contracts/utils/Arrays.sol";
+import {IERC1155Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the basic standard multi-token.
+ * See https://eips.ethereum.org/EIPS/eip-1155
+ * Originally based on code by Enjin: https://github.com/enjin/erc-1155
+ */
+abstract contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155, IERC1155MetadataURI, IERC1155Errors {
+ using Arrays for uint256[];
+ using Arrays for address[];
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC1155
+ struct ERC1155Storage {
+ mapping(uint256 id => mapping(address account => uint256)) _balances;
+
+ mapping(address account => mapping(address operator => bool)) _operatorApprovals;
+
+ // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
+ string _uri;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC1155")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC1155StorageLocation = 0x88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4500;
+
+ function _getERC1155Storage() private pure returns (ERC1155Storage storage $) {
+ assembly {
+ $.slot := ERC1155StorageLocation
+ }
+ }
+
+ /**
+ * @dev See {_setURI}.
+ */
+ function __ERC1155_init(string memory uri_) internal onlyInitializing {
+ __ERC1155_init_unchained(uri_);
+ }
+
+ function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing {
+ _setURI(uri_);
+ }
+
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165) returns (bool) {
+ return
+ interfaceId == type(IERC1155).interfaceId ||
+ interfaceId == type(IERC1155MetadataURI).interfaceId ||
+ super.supportsInterface(interfaceId);
+ }
+
+ /**
+ * @dev See {IERC1155MetadataURI-uri}.
+ *
+ * This implementation returns the same URI for *all* token types. It relies
+ * on the token type ID substitution mechanism
+ * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the ERC].
+ *
+ * Clients calling this function must replace the `\{id\}` substring with the
+ * actual token type ID.
+ */
+ function uri(uint256 /* id */) public view virtual returns (string memory) {
+ ERC1155Storage storage $ = _getERC1155Storage();
+ return $._uri;
+ }
+
+ /// @inheritdoc IERC1155
+ function balanceOf(address account, uint256 id) public view virtual returns (uint256) {
+ ERC1155Storage storage $ = _getERC1155Storage();
+ return $._balances[id][account];
+ }
+
+ /**
+ * @dev See {IERC1155-balanceOfBatch}.
+ *
+ * Requirements:
+ *
+ * - `accounts` and `ids` must have the same length.
+ */
+ function balanceOfBatch(
+ address[] memory accounts,
+ uint256[] memory ids
+ ) public view virtual returns (uint256[] memory) {
+ if (accounts.length != ids.length) {
+ revert ERC1155InvalidArrayLength(ids.length, accounts.length);
+ }
+
+ uint256[] memory batchBalances = new uint256[](accounts.length);
+
+ for (uint256 i = 0; i < accounts.length; ++i) {
+ batchBalances[i] = balanceOf(accounts.unsafeMemoryAccess(i), ids.unsafeMemoryAccess(i));
+ }
+
+ return batchBalances;
+ }
+
+ /// @inheritdoc IERC1155
+ function setApprovalForAll(address operator, bool approved) public virtual {
+ _setApprovalForAll(_msgSender(), operator, approved);
+ }
+
+ /// @inheritdoc IERC1155
+ function isApprovedForAll(address account, address operator) public view virtual returns (bool) {
+ ERC1155Storage storage $ = _getERC1155Storage();
+ return $._operatorApprovals[account][operator];
+ }
+
+ /// @inheritdoc IERC1155
+ function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) public virtual {
+ _checkAuthorized(_msgSender(), from);
+ _safeTransferFrom(from, to, id, value, data);
+ }
+
+ /// @inheritdoc IERC1155
+ function safeBatchTransferFrom(
+ address from,
+ address to,
+ uint256[] memory ids,
+ uint256[] memory values,
+ bytes memory data
+ ) public virtual {
+ _checkAuthorized(_msgSender(), from);
+ _safeBatchTransferFrom(from, to, ids, values, data);
+ }
+
+ /// @dev Checks if `operator` is authorized to transfer tokens owned by `owner`. Reverts with {ERC1155MissingApprovalForAll} if not.
+ function _checkAuthorized(address operator, address owner) internal view virtual {
+ if (owner != operator && !isApprovedForAll(owner, operator)) {
+ revert ERC1155MissingApprovalForAll(operator, owner);
+ }
+ }
+
+ /**
+ * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. Will mint (or burn) if `from`
+ * (or `to`) is the zero address.
+ *
+ * Emits a {TransferSingle} event if the arrays contain one element, and {TransferBatch} otherwise.
+ *
+ * Requirements:
+ *
+ * - If `to` refers to a smart contract, it must implement either {IERC1155Receiver-onERC1155Received}
+ * or {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value.
+ * - `ids` and `values` must have the same length.
+ *
+ * NOTE: The ERC-1155 acceptance check is not performed in this function. See {_updateWithAcceptanceCheck} instead.
+ */
+ function _update(address from, address to, uint256[] memory ids, uint256[] memory values) internal virtual {
+ ERC1155Storage storage $ = _getERC1155Storage();
+ if (ids.length != values.length) {
+ revert ERC1155InvalidArrayLength(ids.length, values.length);
+ }
+
+ address operator = _msgSender();
+
+ for (uint256 i = 0; i < ids.length; ++i) {
+ uint256 id = ids.unsafeMemoryAccess(i);
+ uint256 value = values.unsafeMemoryAccess(i);
+
+ if (from != address(0)) {
+ uint256 fromBalance = $._balances[id][from];
+ if (fromBalance < value) {
+ revert ERC1155InsufficientBalance(from, fromBalance, value, id);
+ }
+ unchecked {
+ // Overflow not possible: value <= fromBalance
+ $._balances[id][from] = fromBalance - value;
+ }
+ }
+
+ if (to != address(0)) {
+ $._balances[id][to] += value;
+ }
+ }
+
+ if (ids.length == 1) {
+ uint256 id = ids.unsafeMemoryAccess(0);
+ uint256 value = values.unsafeMemoryAccess(0);
+ emit TransferSingle(operator, from, to, id, value);
+ } else {
+ emit TransferBatch(operator, from, to, ids, values);
+ }
+ }
+
+ /**
+ * @dev Version of {_update} that performs the token acceptance check by calling
+ * {IERC1155Receiver-onERC1155Received} or {IERC1155Receiver-onERC1155BatchReceived} on the receiver address if it
+ * contains code (eg. is a smart contract at the moment of execution).
+ *
+ * IMPORTANT: Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any
+ * update to the contract state after this function would break the check-effect-interaction pattern. Consider
+ * overriding {_update} instead.
+ *
+ * NOTE: This version is kept for backward compatibility. We recommend calling the alternative version with a boolean
+ * flag in order to achieve better control over which hook to call.
+ */
+ function _updateWithAcceptanceCheck(
+ address from,
+ address to,
+ uint256[] memory ids,
+ uint256[] memory values,
+ bytes memory data
+ ) internal virtual {
+ _updateWithAcceptanceCheck(from, to, ids, values, data, ids.length != 1);
+ }
+
+ /**
+ * @dev Version of {_update} that performs the token acceptance check by calling
+ * {IERC1155Receiver-onERC1155Received} or {IERC1155Receiver-onERC1155BatchReceived} on the receiver address if it
+ * contains code (eg. is a smart contract at the moment of execution).
+ *
+ * IMPORTANT: Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any
+ * update to the contract state after this function would break the check-effect-interaction pattern. Consider
+ * overriding {_update} instead.
+ */
+ function _updateWithAcceptanceCheck(
+ address from,
+ address to,
+ uint256[] memory ids,
+ uint256[] memory values,
+ bytes memory data,
+ bool batch
+ ) internal virtual {
+ _update(from, to, ids, values);
+ if (to != address(0)) {
+ address operator = _msgSender();
+ if (batch) {
+ ERC1155Utils.checkOnERC1155BatchReceived(operator, from, to, ids, values, data);
+ } else {
+ uint256 id = ids.unsafeMemoryAccess(0);
+ uint256 value = values.unsafeMemoryAccess(0);
+ ERC1155Utils.checkOnERC1155Received(operator, from, to, id, value, data);
+ }
+ }
+ }
+
+ /**
+ * @dev Transfers a `value` tokens of token type `id` from `from` to `to`.
+ *
+ * Emits a {TransferSingle} event.
+ *
+ * Requirements:
+ *
+ * - `to` cannot be the zero address.
+ * - `from` must have a balance of tokens of type `id` of at least `value` amount.
+ * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
+ * acceptance magic value.
+ */
+ function _safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) internal {
+ if (to == address(0)) {
+ revert ERC1155InvalidReceiver(address(0));
+ }
+ if (from == address(0)) {
+ revert ERC1155InvalidSender(address(0));
+ }
+ (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);
+ _updateWithAcceptanceCheck(from, to, ids, values, data, false);
+ }
+
+ /**
+ * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
+ *
+ * Emits a {TransferBatch} event.
+ *
+ * Requirements:
+ *
+ * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
+ * acceptance magic value.
+ * - `ids` and `values` must have the same length.
+ */
+ function _safeBatchTransferFrom(
+ address from,
+ address to,
+ uint256[] memory ids,
+ uint256[] memory values,
+ bytes memory data
+ ) internal {
+ if (to == address(0)) {
+ revert ERC1155InvalidReceiver(address(0));
+ }
+ if (from == address(0)) {
+ revert ERC1155InvalidSender(address(0));
+ }
+ _updateWithAcceptanceCheck(from, to, ids, values, data, true);
+ }
+
+ /**
+ * @dev Sets a new URI for all token types, by relying on the token type ID
+ * substitution mechanism
+ * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the ERC].
+ *
+ * By this mechanism, any occurrence of the `\{id\}` substring in either the
+ * URI or any of the values in the JSON file at said URI will be replaced by
+ * clients with the token type ID.
+ *
+ * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
+ * interpreted by clients as
+ * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
+ * for token type ID 0x4cce0.
+ *
+ * See {uri}.
+ *
+ * Because these URIs cannot be meaningfully represented by the {URI} event,
+ * this function emits no events.
+ */
+ function _setURI(string memory newuri) internal virtual {
+ ERC1155Storage storage $ = _getERC1155Storage();
+ $._uri = newuri;
+ }
+
+ /**
+ * @dev Creates a `value` amount of tokens of type `id`, and assigns them to `to`.
+ *
+ * Emits a {TransferSingle} event.
+ *
+ * Requirements:
+ *
+ * - `to` cannot be the zero address.
+ * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
+ * acceptance magic value.
+ */
+ function _mint(address to, uint256 id, uint256 value, bytes memory data) internal {
+ if (to == address(0)) {
+ revert ERC1155InvalidReceiver(address(0));
+ }
+ (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);
+ _updateWithAcceptanceCheck(address(0), to, ids, values, data, false);
+ }
+
+ /**
+ * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
+ *
+ * Emits a {TransferBatch} event.
+ *
+ * Requirements:
+ *
+ * - `ids` and `values` must have the same length.
+ * - `to` cannot be the zero address.
+ * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
+ * acceptance magic value.
+ */
+ function _mintBatch(address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {
+ if (to == address(0)) {
+ revert ERC1155InvalidReceiver(address(0));
+ }
+ _updateWithAcceptanceCheck(address(0), to, ids, values, data, true);
+ }
+
+ /**
+ * @dev Destroys a `value` amount of tokens of type `id` from `from`
+ *
+ * Emits a {TransferSingle} event.
+ *
+ * Requirements:
+ *
+ * - `from` cannot be the zero address.
+ * - `from` must have at least `value` amount of tokens of type `id`.
+ */
+ function _burn(address from, uint256 id, uint256 value) internal {
+ if (from == address(0)) {
+ revert ERC1155InvalidSender(address(0));
+ }
+ (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);
+ _updateWithAcceptanceCheck(from, address(0), ids, values, "", false);
+ }
+
+ /**
+ * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
+ *
+ * Emits a {TransferBatch} event.
+ *
+ * Requirements:
+ *
+ * - `from` cannot be the zero address.
+ * - `from` must have at least `value` amount of tokens of type `id`.
+ * - `ids` and `values` must have the same length.
+ */
+ function _burnBatch(address from, uint256[] memory ids, uint256[] memory values) internal {
+ if (from == address(0)) {
+ revert ERC1155InvalidSender(address(0));
+ }
+ _updateWithAcceptanceCheck(from, address(0), ids, values, "", true);
+ }
+
+ /**
+ * @dev Approve `operator` to operate on all of `owner` tokens
+ *
+ * Emits an {ApprovalForAll} event.
+ *
+ * Requirements:
+ *
+ * - `owner` cannot be the zero address.
+ * - `operator` cannot be the zero address.
+ */
+ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
+ ERC1155Storage storage $ = _getERC1155Storage();
+ if (owner == address(0)) {
+ revert ERC1155InvalidApprover(address(0));
+ }
+ if (operator == address(0)) {
+ revert ERC1155InvalidOperator(address(0));
+ }
+ $._operatorApprovals[owner][operator] = approved;
+ emit ApprovalForAll(owner, operator, approved);
+ }
+
+ /**
+ * @dev Creates an array in memory with only one value for each of the elements provided.
+ */
+ function _asSingletonArrays(
+ uint256 element1,
+ uint256 element2
+ ) private pure returns (uint256[] memory array1, uint256[] memory array2) {
+ assembly ("memory-safe") {
+ // Load the free memory pointer
+ array1 := mload(0x40)
+ // Set array length to 1
+ mstore(array1, 1)
+ // Store the single element at the next word after the length (where content starts)
+ mstore(add(array1, 0x20), element1)
+
+ // Repeat for next array locating it right after the first array
+ array2 := add(array1, 0x40)
+ mstore(array2, 1)
+ mstore(add(array2, 0x20), element2)
+
+ // Update the free memory pointer by pointing after the second array
+ mstore(0x40, add(array2, 0x40))
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol
new file mode 100644
index 0000000..70c2eb4
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC1155/extensions/ERC1155Burnable.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC1155Upgradeable} from "../ERC1155Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {ERC1155} that allows token holders to destroy both their
+ * own tokens and those that they have been approved to use.
+ */
+abstract contract ERC1155BurnableUpgradeable is Initializable, ERC1155Upgradeable {
+ function __ERC1155Burnable_init() internal onlyInitializing {
+ }
+
+ function __ERC1155Burnable_init_unchained() internal onlyInitializing {
+ }
+ function burn(address account, uint256 id, uint256 value) public virtual {
+ if (account != _msgSender() && !isApprovedForAll(account, _msgSender())) {
+ revert ERC1155MissingApprovalForAll(_msgSender(), account);
+ }
+
+ _burn(account, id, value);
+ }
+
+ function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual {
+ if (account != _msgSender() && !isApprovedForAll(account, _msgSender())) {
+ revert ERC1155MissingApprovalForAll(_msgSender(), account);
+ }
+
+ _burnBatch(account, ids, values);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol
new file mode 100644
index 0000000..66581a8
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC1155/extensions/ERC1155Pausable.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC1155Upgradeable} from "../ERC1155Upgradeable.sol";
+import {PausableUpgradeable} from "../../../utils/PausableUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev ERC-1155 token with pausable token transfers, minting and burning.
+ *
+ * Useful for scenarios such as preventing trades until the end of an evaluation
+ * period, or having an emergency switch for freezing all token transfers in the
+ * event of a large bug.
+ *
+ * IMPORTANT: This contract does not include public pause and unpause functions. In
+ * addition to inheriting this contract, you must define both functions, invoking the
+ * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate
+ * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will
+ * make the contract pause mechanism of the contract unreachable, and thus unusable.
+ */
+abstract contract ERC1155PausableUpgradeable is Initializable, ERC1155Upgradeable, PausableUpgradeable {
+ function __ERC1155Pausable_init() internal onlyInitializing {
+ }
+
+ function __ERC1155Pausable_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev See {ERC1155-_update}.
+ *
+ * Requirements:
+ *
+ * - the contract must not be paused.
+ */
+ function _update(
+ address from,
+ address to,
+ uint256[] memory ids,
+ uint256[] memory values
+ ) internal virtual override whenNotPaused {
+ super._update(from, to, ids, values);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol
new file mode 100644
index 0000000..7b6a111
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC1155Upgradeable} from "../ERC1155Upgradeable.sol";
+import {Arrays} from "@openzeppelin/contracts/utils/Arrays.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of ERC-1155 that adds tracking of total supply per id.
+ *
+ * Useful for scenarios where Fungible and Non-fungible tokens have to be
+ * clearly identified. Note: While a `totalSupply` of 1 may mean the
+ * corresponding token is an NFT, there are no inherent guarantees that
+ * no more tokens with the same id will be minted in future.
+ *
+ * NOTE: This contract implies a global limit of 2**256 - 1 to the number of tokens
+ * that can be minted.
+ *
+ * CAUTION: This extension should not be added in an upgrade to an already deployed contract.
+ */
+abstract contract ERC1155SupplyUpgradeable is Initializable, ERC1155Upgradeable {
+ using Arrays for uint256[];
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC1155Supply
+ struct ERC1155SupplyStorage {
+ mapping(uint256 id => uint256) _totalSupply;
+ uint256 _totalSupplyAll;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC1155Supply")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC1155SupplyStorageLocation = 0x4a593662ee04d27b6a00ebb31be7fe0c102c2ade82a7c5d764f2df05dc4e2800;
+
+ function _getERC1155SupplyStorage() private pure returns (ERC1155SupplyStorage storage $) {
+ assembly {
+ $.slot := ERC1155SupplyStorageLocation
+ }
+ }
+
+ function __ERC1155Supply_init() internal onlyInitializing {
+ }
+
+ function __ERC1155Supply_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Total value of tokens with a given id.
+ */
+ function totalSupply(uint256 id) public view virtual returns (uint256) {
+ ERC1155SupplyStorage storage $ = _getERC1155SupplyStorage();
+ return $._totalSupply[id];
+ }
+
+ /**
+ * @dev Total value of tokens.
+ */
+ function totalSupply() public view virtual returns (uint256) {
+ ERC1155SupplyStorage storage $ = _getERC1155SupplyStorage();
+ return $._totalSupplyAll;
+ }
+
+ /**
+ * @dev Indicates whether any tokens exist with a given id, or not.
+ */
+ function exists(uint256 id) public view virtual returns (bool) {
+ return totalSupply(id) > 0;
+ }
+
+ /// @inheritdoc ERC1155Upgradeable
+ function _update(
+ address from,
+ address to,
+ uint256[] memory ids,
+ uint256[] memory values
+ ) internal virtual override {
+ ERC1155SupplyStorage storage $ = _getERC1155SupplyStorage();
+ super._update(from, to, ids, values);
+
+ if (from == address(0)) {
+ uint256 totalMintValue = 0;
+ for (uint256 i = 0; i < ids.length; ++i) {
+ uint256 value = values.unsafeMemoryAccess(i);
+ // Overflow check required: The rest of the code assumes that totalSupply never overflows
+ $._totalSupply[ids.unsafeMemoryAccess(i)] += value;
+ totalMintValue += value;
+ }
+ // Overflow check required: The rest of the code assumes that totalSupplyAll never overflows
+ $._totalSupplyAll += totalMintValue;
+ }
+
+ if (to == address(0)) {
+ uint256 totalBurnValue = 0;
+ for (uint256 i = 0; i < ids.length; ++i) {
+ uint256 value = values.unsafeMemoryAccess(i);
+
+ unchecked {
+ // Overflow not possible: values[i] <= balanceOf(from, ids[i]) <= totalSupply(ids[i])
+ $._totalSupply[ids.unsafeMemoryAccess(i)] -= value;
+ // Overflow not possible: sum_i(values[i]) <= sum_i(totalSupply(ids[i])) <= totalSupplyAll
+ totalBurnValue += value;
+ }
+ }
+ unchecked {
+ // Overflow not possible: totalBurnValue = sum_i(values[i]) <= sum_i(totalSupply(ids[i])) <= totalSupplyAll
+ $._totalSupplyAll -= totalBurnValue;
+ }
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol
new file mode 100644
index 0000000..a4c9978
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC1155/extensions/ERC1155URIStorage.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC1155Upgradeable} from "../ERC1155Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev ERC-1155 token with storage based token URI management.
+ * Inspired by the {ERC721URIStorage} extension
+ */
+abstract contract ERC1155URIStorageUpgradeable is Initializable, ERC1155Upgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC1155URIStorage
+ struct ERC1155URIStorageStorage {
+ // Optional base URI
+ string _baseURI;
+
+ // Optional mapping for token URIs
+ mapping(uint256 tokenId => string) _tokenURIs;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC1155URIStorage")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC1155URIStorageStorageLocation = 0x89fc852226e759c7c636cf34d732f0198fc56a54876b2374a52beb7b0c558600;
+
+ function _getERC1155URIStorageStorage() private pure returns (ERC1155URIStorageStorage storage $) {
+ assembly {
+ $.slot := ERC1155URIStorageStorageLocation
+ }
+ }
+
+ function __ERC1155URIStorage_init() internal onlyInitializing {
+ __ERC1155URIStorage_init_unchained();
+ }
+
+ function __ERC1155URIStorage_init_unchained() internal onlyInitializing {
+ ERC1155URIStorageStorage storage $ = _getERC1155URIStorageStorage();
+ $._baseURI = "";
+ }
+ /**
+ * @dev See {IERC1155MetadataURI-uri}.
+ *
+ * This implementation returns the concatenation of the `_baseURI`
+ * and the token-specific uri if the latter is set
+ *
+ * This enables the following behaviors:
+ *
+ * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation
+ * of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`
+ * is empty per default);
+ *
+ * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`
+ * which in most cases will contain `ERC1155._uri`;
+ *
+ * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a
+ * uri value set, then the result is empty.
+ */
+ function uri(uint256 tokenId) public view virtual override returns (string memory) {
+ ERC1155URIStorageStorage storage $ = _getERC1155URIStorageStorage();
+ string memory tokenURI = $._tokenURIs[tokenId];
+
+ // If token URI is set, concatenate base URI and tokenURI (via string.concat).
+ return bytes(tokenURI).length > 0 ? string.concat($._baseURI, tokenURI) : super.uri(tokenId);
+ }
+
+ /**
+ * @dev Sets `tokenURI` as the tokenURI of `tokenId`.
+ */
+ function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {
+ ERC1155URIStorageStorage storage $ = _getERC1155URIStorageStorage();
+ $._tokenURIs[tokenId] = tokenURI;
+ emit URI(uri(tokenId), tokenId);
+ }
+
+ /**
+ * @dev Sets `baseURI` as the `_baseURI` for all tokens
+ */
+ function _setBaseURI(string memory baseURI) internal virtual {
+ ERC1155URIStorageStorage storage $ = _getERC1155URIStorageStorage();
+ $._baseURI = baseURI;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol
new file mode 100644
index 0000000..35fa5a9
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol
@@ -0,0 +1,330 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/ERC20.sol)
+
+pragma solidity ^0.8.20;
+
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
+import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol";
+import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the {IERC20} interface.
+ *
+ * This implementation is agnostic to the way tokens are created. This means
+ * that a supply mechanism has to be added in a derived contract using {_mint}.
+ *
+ * TIP: For a detailed writeup see our guide
+ * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
+ * to implement supply mechanisms].
+ *
+ * The default value of {decimals} is 18. To change this, you should override
+ * this function so it returns a different value.
+ *
+ * We have followed general OpenZeppelin Contracts guidelines: functions revert
+ * instead returning `false` on failure. This behavior is nonetheless
+ * conventional and does not conflict with the expectations of ERC-20
+ * applications.
+ */
+abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC20
+ struct ERC20Storage {
+ mapping(address account => uint256) _balances;
+
+ mapping(address account => mapping(address spender => uint256)) _allowances;
+
+ uint256 _totalSupply;
+
+ string _name;
+ string _symbol;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00;
+
+ function _getERC20Storage() private pure returns (ERC20Storage storage $) {
+ assembly {
+ $.slot := ERC20StorageLocation
+ }
+ }
+
+ /**
+ * @dev Sets the values for {name} and {symbol}.
+ *
+ * Both values are immutable: they can only be set once during construction.
+ */
+ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {
+ __ERC20_init_unchained(name_, symbol_);
+ }
+
+ function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
+ ERC20Storage storage $ = _getERC20Storage();
+ $._name = name_;
+ $._symbol = symbol_;
+ }
+
+ /**
+ * @dev Returns the name of the token.
+ */
+ function name() public view virtual returns (string memory) {
+ ERC20Storage storage $ = _getERC20Storage();
+ return $._name;
+ }
+
+ /**
+ * @dev Returns the symbol of the token, usually a shorter version of the
+ * name.
+ */
+ function symbol() public view virtual returns (string memory) {
+ ERC20Storage storage $ = _getERC20Storage();
+ return $._symbol;
+ }
+
+ /**
+ * @dev Returns the number of decimals used to get its user representation.
+ * For example, if `decimals` equals `2`, a balance of `505` tokens should
+ * be displayed to a user as `5.05` (`505 / 10 ** 2`).
+ *
+ * Tokens usually opt for a value of 18, imitating the relationship between
+ * Ether and Wei. This is the default value returned by this function, unless
+ * it's overridden.
+ *
+ * NOTE: This information is only used for _display_ purposes: it in
+ * no way affects any of the arithmetic of the contract, including
+ * {IERC20-balanceOf} and {IERC20-transfer}.
+ */
+ function decimals() public view virtual returns (uint8) {
+ return 18;
+ }
+
+ /// @inheritdoc IERC20
+ function totalSupply() public view virtual returns (uint256) {
+ ERC20Storage storage $ = _getERC20Storage();
+ return $._totalSupply;
+ }
+
+ /// @inheritdoc IERC20
+ function balanceOf(address account) public view virtual returns (uint256) {
+ ERC20Storage storage $ = _getERC20Storage();
+ return $._balances[account];
+ }
+
+ /**
+ * @dev See {IERC20-transfer}.
+ *
+ * Requirements:
+ *
+ * - `to` cannot be the zero address.
+ * - the caller must have a balance of at least `value`.
+ */
+ function transfer(address to, uint256 value) public virtual returns (bool) {
+ address owner = _msgSender();
+ _transfer(owner, to, value);
+ return true;
+ }
+
+ /// @inheritdoc IERC20
+ function allowance(address owner, address spender) public view virtual returns (uint256) {
+ ERC20Storage storage $ = _getERC20Storage();
+ return $._allowances[owner][spender];
+ }
+
+ /**
+ * @dev See {IERC20-approve}.
+ *
+ * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
+ * `transferFrom`. This is semantically equivalent to an infinite approval.
+ *
+ * Requirements:
+ *
+ * - `spender` cannot be the zero address.
+ */
+ function approve(address spender, uint256 value) public virtual returns (bool) {
+ address owner = _msgSender();
+ _approve(owner, spender, value);
+ return true;
+ }
+
+ /**
+ * @dev See {IERC20-transferFrom}.
+ *
+ * Skips emitting an {Approval} event indicating an allowance update. This is not
+ * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
+ *
+ * NOTE: Does not update the allowance if the current allowance
+ * is the maximum `uint256`.
+ *
+ * Requirements:
+ *
+ * - `from` and `to` cannot be the zero address.
+ * - `from` must have a balance of at least `value`.
+ * - the caller must have allowance for ``from``'s tokens of at least
+ * `value`.
+ */
+ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
+ address spender = _msgSender();
+ _spendAllowance(from, spender, value);
+ _transfer(from, to, value);
+ return true;
+ }
+
+ /**
+ * @dev Moves a `value` amount of tokens from `from` to `to`.
+ *
+ * This internal function is equivalent to {transfer}, and can be used to
+ * e.g. implement automatic token fees, slashing mechanisms, etc.
+ *
+ * Emits a {Transfer} event.
+ *
+ * NOTE: This function is not virtual, {_update} should be overridden instead.
+ */
+ function _transfer(address from, address to, uint256 value) internal {
+ if (from == address(0)) {
+ revert ERC20InvalidSender(address(0));
+ }
+ if (to == address(0)) {
+ revert ERC20InvalidReceiver(address(0));
+ }
+ _update(from, to, value);
+ }
+
+ /**
+ * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
+ * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
+ * this function.
+ *
+ * Emits a {Transfer} event.
+ */
+ function _update(address from, address to, uint256 value) internal virtual {
+ ERC20Storage storage $ = _getERC20Storage();
+ if (from == address(0)) {
+ // Overflow check required: The rest of the code assumes that totalSupply never overflows
+ $._totalSupply += value;
+ } else {
+ uint256 fromBalance = $._balances[from];
+ if (fromBalance < value) {
+ revert ERC20InsufficientBalance(from, fromBalance, value);
+ }
+ unchecked {
+ // Overflow not possible: value <= fromBalance <= totalSupply.
+ $._balances[from] = fromBalance - value;
+ }
+ }
+
+ if (to == address(0)) {
+ unchecked {
+ // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
+ $._totalSupply -= value;
+ }
+ } else {
+ unchecked {
+ // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
+ $._balances[to] += value;
+ }
+ }
+
+ emit Transfer(from, to, value);
+ }
+
+ /**
+ * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
+ * Relies on the `_update` mechanism
+ *
+ * Emits a {Transfer} event with `from` set to the zero address.
+ *
+ * NOTE: This function is not virtual, {_update} should be overridden instead.
+ */
+ function _mint(address account, uint256 value) internal {
+ if (account == address(0)) {
+ revert ERC20InvalidReceiver(address(0));
+ }
+ _update(address(0), account, value);
+ }
+
+ /**
+ * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
+ * Relies on the `_update` mechanism.
+ *
+ * Emits a {Transfer} event with `to` set to the zero address.
+ *
+ * NOTE: This function is not virtual, {_update} should be overridden instead
+ */
+ function _burn(address account, uint256 value) internal {
+ if (account == address(0)) {
+ revert ERC20InvalidSender(address(0));
+ }
+ _update(account, address(0), value);
+ }
+
+ /**
+ * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
+ *
+ * This internal function is equivalent to `approve`, and can be used to
+ * e.g. set automatic allowances for certain subsystems, etc.
+ *
+ * Emits an {Approval} event.
+ *
+ * Requirements:
+ *
+ * - `owner` cannot be the zero address.
+ * - `spender` cannot be the zero address.
+ *
+ * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
+ */
+ function _approve(address owner, address spender, uint256 value) internal {
+ _approve(owner, spender, value, true);
+ }
+
+ /**
+ * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
+ *
+ * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
+ * `_spendAllowance` during the `transferFrom` operation sets the flag to false. This saves gas by not emitting any
+ * `Approval` event during `transferFrom` operations.
+ *
+ * Anyone who wishes to continue emitting `Approval` events on the `transferFrom` operation can force the flag to
+ * true using the following override:
+ *
+ * ```solidity
+ * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
+ * super._approve(owner, spender, value, true);
+ * }
+ * ```
+ *
+ * Requirements are the same as {_approve}.
+ */
+ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
+ ERC20Storage storage $ = _getERC20Storage();
+ if (owner == address(0)) {
+ revert ERC20InvalidApprover(address(0));
+ }
+ if (spender == address(0)) {
+ revert ERC20InvalidSpender(address(0));
+ }
+ $._allowances[owner][spender] = value;
+ if (emitEvent) {
+ emit Approval(owner, spender, value);
+ }
+ }
+
+ /**
+ * @dev Updates `owner`'s allowance for `spender` based on spent `value`.
+ *
+ * Does not update the allowance value in case of infinite allowance.
+ * Revert if not enough allowance is available.
+ *
+ * Does not emit an {Approval} event.
+ */
+ function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
+ uint256 currentAllowance = allowance(owner, spender);
+ if (currentAllowance < type(uint256).max) {
+ if (currentAllowance < value) {
+ revert ERC20InsufficientAllowance(spender, currentAllowance, value);
+ }
+ unchecked {
+ _approve(owner, spender, currentAllowance - value, false);
+ }
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC1363Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC1363Upgradeable.sol
new file mode 100644
index 0000000..f5b01cd
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC1363Upgradeable.sol
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/ERC1363.sol)
+
+pragma solidity ^0.8.20;
+
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {ERC165Upgradeable} from "../../../utils/introspection/ERC165Upgradeable.sol";
+import {IERC1363} from "@openzeppelin/contracts/interfaces/IERC1363.sol";
+import {ERC1363Utils} from "@openzeppelin/contracts/token/ERC20/utils/ERC1363Utils.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @title ERC1363
+ * @dev Extension of {ERC20} tokens that adds support for code execution after transfers and approvals
+ * on recipient contracts. Calls after transfers are enabled through the {ERC1363-transferAndCall} and
+ * {ERC1363-transferFromAndCall} methods while calls after approvals can be made with {ERC1363-approveAndCall}
+ *
+ * _Available since v5.1._
+ */
+abstract contract ERC1363Upgradeable is Initializable, ERC20Upgradeable, ERC165Upgradeable, IERC1363 {
+ /**
+ * @dev Indicates a failure within the {transfer} part of a transferAndCall operation.
+ * @param receiver Address to which tokens are being transferred.
+ * @param value Amount of tokens to be transferred.
+ */
+ error ERC1363TransferFailed(address receiver, uint256 value);
+
+ /**
+ * @dev Indicates a failure within the {transferFrom} part of a transferFromAndCall operation.
+ * @param sender Address from which to send tokens.
+ * @param receiver Address to which tokens are being transferred.
+ * @param value Amount of tokens to be transferred.
+ */
+ error ERC1363TransferFromFailed(address sender, address receiver, uint256 value);
+
+ /**
+ * @dev Indicates a failure within the {approve} part of a approveAndCall operation.
+ * @param spender Address which will spend the funds.
+ * @param value Amount of tokens to be spent.
+ */
+ error ERC1363ApproveFailed(address spender, uint256 value);
+
+ function __ERC1363_init() internal onlyInitializing {
+ }
+
+ function __ERC1363_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165) returns (bool) {
+ return interfaceId == type(IERC1363).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /**
+ * @dev Moves a `value` amount of tokens from the caller's account to `to`
+ * and then calls {IERC1363Receiver-onTransferReceived} on `to`. Returns a flag that indicates
+ * if the call succeeded.
+ *
+ * Requirements:
+ *
+ * - The target has code (i.e. is a contract).
+ * - The target `to` must implement the {IERC1363Receiver} interface.
+ * - The target must return the {IERC1363Receiver-onTransferReceived} selector to accept the transfer.
+ * - The internal {transfer} must succeed (returned `true`).
+ */
+ function transferAndCall(address to, uint256 value) public returns (bool) {
+ return transferAndCall(to, value, "");
+ }
+
+ /**
+ * @dev Variant of {transferAndCall} that accepts an additional `data` parameter with
+ * no specified format.
+ */
+ function transferAndCall(address to, uint256 value, bytes memory data) public virtual returns (bool) {
+ if (!transfer(to, value)) {
+ revert ERC1363TransferFailed(to, value);
+ }
+ ERC1363Utils.checkOnERC1363TransferReceived(_msgSender(), _msgSender(), to, value, data);
+ return true;
+ }
+
+ /**
+ * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
+ * and then calls {IERC1363Receiver-onTransferReceived} on `to`. Returns a flag that indicates
+ * if the call succeeded.
+ *
+ * Requirements:
+ *
+ * - The target has code (i.e. is a contract).
+ * - The target `to` must implement the {IERC1363Receiver} interface.
+ * - The target must return the {IERC1363Receiver-onTransferReceived} selector to accept the transfer.
+ * - The internal {transferFrom} must succeed (returned `true`).
+ */
+ function transferFromAndCall(address from, address to, uint256 value) public returns (bool) {
+ return transferFromAndCall(from, to, value, "");
+ }
+
+ /**
+ * @dev Variant of {transferFromAndCall} that accepts an additional `data` parameter with
+ * no specified format.
+ */
+ function transferFromAndCall(
+ address from,
+ address to,
+ uint256 value,
+ bytes memory data
+ ) public virtual returns (bool) {
+ if (!transferFrom(from, to, value)) {
+ revert ERC1363TransferFromFailed(from, to, value);
+ }
+ ERC1363Utils.checkOnERC1363TransferReceived(_msgSender(), from, to, value, data);
+ return true;
+ }
+
+ /**
+ * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
+ * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
+ * Returns a flag that indicates if the call succeeded.
+ *
+ * Requirements:
+ *
+ * - The target has code (i.e. is a contract).
+ * - The target `spender` must implement the {IERC1363Spender} interface.
+ * - The target must return the {IERC1363Spender-onApprovalReceived} selector to accept the approval.
+ * - The internal {approve} must succeed (returned `true`).
+ */
+ function approveAndCall(address spender, uint256 value) public returns (bool) {
+ return approveAndCall(spender, value, "");
+ }
+
+ /**
+ * @dev Variant of {approveAndCall} that accepts an additional `data` parameter with
+ * no specified format.
+ */
+ function approveAndCall(address spender, uint256 value, bytes memory data) public virtual returns (bool) {
+ if (!approve(spender, value)) {
+ revert ERC1363ApproveFailed(spender, value);
+ }
+ ERC1363Utils.checkOnERC1363ApprovalReceived(_msgSender(), spender, value, data);
+ return true;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol
new file mode 100644
index 0000000..afb5bd2
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)
+
+pragma solidity ^0.8.20;
+
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {ContextUpgradeable} from "../../../utils/ContextUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {ERC20} that allows token holders to destroy both their own
+ * tokens and those that they have an allowance for, in a way that can be
+ * recognized off-chain (via event analysis).
+ */
+abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable {
+ function __ERC20Burnable_init() internal onlyInitializing {
+ }
+
+ function __ERC20Burnable_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Destroys a `value` amount of tokens from the caller.
+ *
+ * See {ERC20-_burn}.
+ */
+ function burn(uint256 value) public virtual {
+ _burn(_msgSender(), value);
+ }
+
+ /**
+ * @dev Destroys a `value` amount of tokens from `account`, deducting from
+ * the caller's allowance.
+ *
+ * See {ERC20-_burn} and {ERC20-allowance}.
+ *
+ * Requirements:
+ *
+ * - the caller must have allowance for ``accounts``'s tokens of at least
+ * `value`.
+ */
+ function burnFrom(address account, uint256 value) public virtual {
+ _spendAllowance(account, _msgSender(), value);
+ _burn(account, value);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20CappedUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20CappedUpgradeable.sol
new file mode 100644
index 0000000..cddb8d9
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20CappedUpgradeable.sol
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/ERC20Capped.sol)
+
+pragma solidity ^0.8.20;
+
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {ERC20} that adds a cap to the supply of tokens.
+ */
+abstract contract ERC20CappedUpgradeable is Initializable, ERC20Upgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC20Capped
+ struct ERC20CappedStorage {
+ uint256 _cap;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20Capped")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC20CappedStorageLocation = 0x0f070392f17d5f958cc1ac31867dabecfc5c9758b4a419a200803226d7155d00;
+
+ function _getERC20CappedStorage() private pure returns (ERC20CappedStorage storage $) {
+ assembly {
+ $.slot := ERC20CappedStorageLocation
+ }
+ }
+
+ /**
+ * @dev Total supply cap has been exceeded.
+ */
+ error ERC20ExceededCap(uint256 increasedSupply, uint256 cap);
+
+ /**
+ * @dev The supplied cap is not a valid cap.
+ */
+ error ERC20InvalidCap(uint256 cap);
+
+ /**
+ * @dev Sets the value of the `cap`. This value is immutable, it can only be
+ * set once during construction.
+ */
+ function __ERC20Capped_init(uint256 cap_) internal onlyInitializing {
+ __ERC20Capped_init_unchained(cap_);
+ }
+
+ function __ERC20Capped_init_unchained(uint256 cap_) internal onlyInitializing {
+ ERC20CappedStorage storage $ = _getERC20CappedStorage();
+ if (cap_ == 0) {
+ revert ERC20InvalidCap(0);
+ }
+ $._cap = cap_;
+ }
+
+ /**
+ * @dev Returns the cap on the token's total supply.
+ */
+ function cap() public view virtual returns (uint256) {
+ ERC20CappedStorage storage $ = _getERC20CappedStorage();
+ return $._cap;
+ }
+
+ /// @inheritdoc ERC20Upgradeable
+ function _update(address from, address to, uint256 value) internal virtual override {
+ super._update(from, to, value);
+
+ if (from == address(0)) {
+ uint256 maxSupply = cap();
+ uint256 supply = totalSupply();
+ if (supply > maxSupply) {
+ revert ERC20ExceededCap(supply, maxSupply);
+ }
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20CrosschainUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20CrosschainUpgradeable.sol
new file mode 100644
index 0000000..eb878fa
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20CrosschainUpgradeable.sol
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC20/extensions/ERC20Crosschain.sol)
+
+pragma solidity ^0.8.26;
+
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {BridgeFungibleUpgradeable} from "../../../crosschain/bridges/abstract/BridgeFungibleUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {ERC20} that makes it natively cross-chain using the ERC-7786 based {BridgeFungible}.
+ *
+ * This extension makes the token compatible with counterparts on other chains, which can be:
+ * * {ERC20Crosschain} instances,
+ * * {ERC20} instances that are bridged using {BridgeERC20},
+ * * {ERC20Bridgeable} instances that are bridged using {BridgeERC7802}.
+ *
+ * It is mostly equivalent to inheriting from both {ERC20Bridgeable} and {BridgeERC7802}, and configuring them such
+ * that:
+ * * `token` (on the {BridgeERC7802} side) is `address(this)`,
+ * * `_checkTokenBridge` (on the {ERC20Bridgeable} side) is implemented such that it only accepts self-calls.
+ */
+// slither-disable-next-line locked-ether
+abstract contract ERC20CrosschainUpgradeable is Initializable, ERC20Upgradeable, BridgeFungibleUpgradeable {
+ function __ERC20Crosschain_init() internal onlyInitializing {
+ }
+
+ function __ERC20Crosschain_init_unchained() internal onlyInitializing {
+ }
+ /// @dev Variant of {crosschainTransfer} that allows an authorized account (using ERC20 allowance) to operate on `from`'s assets.
+ function crosschainTransferFrom(address from, bytes memory to, uint256 amount) public virtual returns (bytes32) {
+ _spendAllowance(from, _msgSender(), amount);
+ return _crosschainTransfer(from, to, amount);
+ }
+
+ /// @dev "Locking" tokens is achieved through burning
+ function _onSend(address from, uint256 amount) internal virtual override {
+ _burn(from, amount);
+ }
+
+ /// @dev "Unlocking" tokens is achieved through minting
+ function _onReceive(address to, uint256 amount) internal virtual override {
+ _mint(to, amount);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol
new file mode 100644
index 0000000..aafbc83
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol
@@ -0,0 +1,136 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC20/extensions/ERC20FlashMint.sol)
+
+pragma solidity ^0.8.20;
+
+import {IERC3156FlashBorrower} from "@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol";
+import {IERC3156FlashLender} from "@openzeppelin/contracts/interfaces/IERC3156FlashLender.sol";
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the ERC-3156 Flash loans extension, as defined in
+ * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].
+ *
+ * Adds the {flashLoan} method, which provides flash loan support at the token
+ * level. By default there is no fee, but this can be changed by overriding {flashFee}.
+ *
+ * NOTE: When this extension is used along with the {ERC20Capped} or {ERC20Votes} extensions,
+ * {maxFlashLoan} will not correctly reflect the maximum that can be flash minted. We recommend
+ * overriding {maxFlashLoan} so that it correctly reflects the supply cap.
+ */
+abstract contract ERC20FlashMintUpgradeable is Initializable, ERC20Upgradeable, IERC3156FlashLender {
+ bytes32 private constant RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan");
+
+ /**
+ * @dev The loan token is not valid.
+ */
+ error ERC3156UnsupportedToken(address token);
+
+ /**
+ * @dev The requested loan exceeds the max loan value for `token`.
+ */
+ error ERC3156ExceededMaxLoan(uint256 maxLoan);
+
+ /**
+ * @dev The receiver of a flashloan is not a valid {IERC3156FlashBorrower-onFlashLoan} implementer.
+ */
+ error ERC3156InvalidReceiver(address receiver);
+
+ function __ERC20FlashMint_init() internal onlyInitializing {
+ }
+
+ function __ERC20FlashMint_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Returns the maximum amount of tokens available for loan.
+ *
+ * NOTE: This function will not automatically detect any supply cap
+ * added by other extensions, such as {ERC20Capped}. If necessary,
+ * override this function to take a supply cap into account.
+ *
+ * @param token The address of the token that is requested.
+ * @return The amount of token that can be loaned.
+ */
+ function maxFlashLoan(address token) public view virtual returns (uint256) {
+ return token == address(this) ? type(uint256).max - totalSupply() : 0;
+ }
+
+ /**
+ * @dev Returns the fee applied when doing flash loans. This function calls
+ * the {_flashFee} function which returns the fee applied when doing flash
+ * loans.
+ * @param token The token to be flash loaned.
+ * @param value The amount of tokens to be loaned.
+ * @return The fees applied to the corresponding flash loan.
+ */
+ function flashFee(address token, uint256 value) public view virtual returns (uint256) {
+ if (token != address(this)) {
+ revert ERC3156UnsupportedToken(token);
+ }
+ return _flashFee(token, value);
+ }
+
+ /**
+ * @dev Returns the fee applied when doing flash loans. By default this
+ * implementation has 0 fees. This function can be overloaded to make
+ * the flash loan mechanism deflationary.
+ * @return The fees applied to the corresponding flash loan.
+ */
+ function _flashFee(address /*token*/, uint256 /*value*/) internal view virtual returns (uint256) {
+ return 0;
+ }
+
+ /**
+ * @dev Returns the receiver address of the flash fee. By default this
+ * implementation returns the address(0) which means the fee amount will be burnt.
+ * This function can be overloaded to change the fee receiver.
+ * @return The address for which the flash fee will be sent to.
+ */
+ function _flashFeeReceiver() internal view virtual returns (address) {
+ return address(0);
+ }
+
+ /**
+ * @dev Performs a flash loan. New tokens are minted and sent to the
+ * `receiver`, who is required to implement the {IERC3156FlashBorrower}
+ * interface. By the end of the flash loan, the receiver is expected to own
+ * value + fee tokens and have them approved back to the token contract itself so
+ * they can be burned.
+ * @param receiver The receiver of the flash loan. Should implement the
+ * {IERC3156FlashBorrower-onFlashLoan} interface.
+ * @param token The token to be flash loaned. Only `address(this)` is
+ * supported.
+ * @param value The amount of tokens to be loaned.
+ * @param data An arbitrary datafield that is passed to the receiver.
+ * @return `true` if the flash loan was successful.
+ */
+ // This function can reenter, but it doesn't pose a risk because it always preserves the property that the amount
+ // minted at the beginning is always recovered and burned at the end, or else the entire function will revert.
+ // slither-disable-next-line reentrancy-no-eth
+ function flashLoan(
+ IERC3156FlashBorrower receiver,
+ address token,
+ uint256 value,
+ bytes calldata data
+ ) public virtual returns (bool) {
+ uint256 maxLoan = maxFlashLoan(token);
+ if (value > maxLoan) {
+ revert ERC3156ExceededMaxLoan(maxLoan);
+ }
+ uint256 fee = flashFee(token, value);
+ _mint(address(receiver), value);
+ if (receiver.onFlashLoan(_msgSender(), token, value, fee, data) != RETURN_VALUE) {
+ revert ERC3156InvalidReceiver(address(receiver));
+ }
+ address flashFeeReceiver = _flashFeeReceiver();
+ _spendAllowance(address(receiver), address(this), value + fee);
+ if (fee == 0 || flashFeeReceiver == address(0)) {
+ _burn(address(receiver), value + fee);
+ } else {
+ _burn(address(receiver), value);
+ _transfer(address(receiver), flashFeeReceiver, fee);
+ }
+ return true;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol
new file mode 100644
index 0000000..e455d57
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/ERC20Pausable.sol)
+
+pragma solidity ^0.8.20;
+
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {PausableUpgradeable} from "../../../utils/PausableUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev ERC-20 token with pausable token transfers, minting and burning.
+ *
+ * Useful for scenarios such as preventing trades until the end of an evaluation
+ * period, or having an emergency switch for freezing all token transfers in the
+ * event of a large bug.
+ *
+ * IMPORTANT: This contract does not include public pause and unpause functions. In
+ * addition to inheriting this contract, you must define both functions, invoking the
+ * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate
+ * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will
+ * make the contract pause mechanism of the contract unreachable, and thus unusable.
+ */
+abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable {
+ function __ERC20Pausable_init() internal onlyInitializing {
+ }
+
+ function __ERC20Pausable_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev See {ERC20-_update}.
+ *
+ * Requirements:
+ *
+ * - the contract must not be paused.
+ */
+ function _update(address from, address to, uint256 value) internal virtual override whenNotPaused {
+ super._update(from, to, value);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol
new file mode 100644
index 0000000..0e85606
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/extensions/ERC20Permit.sol)
+
+pragma solidity ^0.8.24;
+
+import {IERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import {EIP712Upgradeable} from "../../../utils/cryptography/EIP712Upgradeable.sol";
+import {NoncesUpgradeable} from "../../../utils/NoncesUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in
+ * https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].
+ *
+ * Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by
+ * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
+ * need to send a transaction, and thus is not required to hold Ether at all.
+ */
+abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20Permit, EIP712Upgradeable, NoncesUpgradeable {
+ bytes32 private constant PERMIT_TYPEHASH =
+ keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
+
+ /**
+ * @dev Permit deadline has expired.
+ */
+ error ERC2612ExpiredSignature(uint256 deadline);
+
+ /**
+ * @dev Mismatched signature.
+ */
+ error ERC2612InvalidSigner(address signer, address owner);
+
+ /**
+ * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
+ *
+ * It's a good idea to use the same `name` that is defined as the ERC-20 token name.
+ */
+ function __ERC20Permit_init(string memory name) internal onlyInitializing {
+ __EIP712_init_unchained(name, "1");
+ }
+
+ function __ERC20Permit_init_unchained(string memory) internal onlyInitializing {}
+
+ /// @inheritdoc IERC20Permit
+ function permit(
+ address owner,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) public virtual {
+ if (block.timestamp > deadline) {
+ revert ERC2612ExpiredSignature(deadline);
+ }
+
+ bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));
+
+ bytes32 hash = _hashTypedDataV4(structHash);
+
+ address signer = ECDSA.recover(hash, v, r, s);
+ if (signer != owner) {
+ revert ERC2612InvalidSigner(signer, owner);
+ }
+
+ _approve(owner, spender, value);
+ }
+
+ /// @inheritdoc IERC20Permit
+ function nonces(address owner) public view virtual override(IERC20Permit, NoncesUpgradeable) returns (uint256) {
+ return super.nonces(owner);
+ }
+
+ /// @inheritdoc IERC20Permit
+ // solhint-disable-next-line func-name-mixedcase
+ function DOMAIN_SEPARATOR() external view returns (bytes32) {
+ return _domainSeparatorV4();
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol
new file mode 100644
index 0000000..4857555
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol
@@ -0,0 +1,89 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/extensions/ERC20Votes.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {VotesUpgradeable} from "../../../governance/utils/VotesUpgradeable.sol";
+import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of ERC-20 to support Compound-like voting and delegation. This version is more generic than Compound's,
+ * and supports token supply up to 2^208^ - 1, while COMP is limited to 2^96^ - 1.
+ *
+ * NOTE: This contract does not provide interface compatibility with Compound's COMP token.
+ *
+ * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either
+ * by calling the {Votes-delegate} function directly, or by providing a signature to be used with {Votes-delegateBySig}. Voting
+ * power can be queried through the public accessors {Votes-getVotes} and {Votes-getPastVotes}.
+ *
+ * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it
+ * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.
+ */
+abstract contract ERC20VotesUpgradeable is Initializable, ERC20Upgradeable, VotesUpgradeable {
+ /**
+ * @dev Total supply cap has been exceeded, introducing a risk of votes overflowing.
+ */
+ error ERC20ExceededSafeSupply(uint256 increasedSupply, uint256 cap);
+
+ function __ERC20Votes_init() internal onlyInitializing {
+ }
+
+ function __ERC20Votes_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Maximum token supply. Defaults to `type(uint208).max` (2^208^ - 1).
+ *
+ * This maximum is enforced in {_update}. It limits the total supply of the token, which is otherwise a uint256,
+ * so that checkpoints can be stored in the Trace208 structure used by {Votes}. Increasing this value will not
+ * remove the underlying limitation, and will cause {_update} to fail because of a math overflow in
+ * {Votes-_transferVotingUnits}. An override could be used to further restrict the total supply (to a lower value) if
+ * additional logic requires it. When resolving override conflicts on this function, the minimum should be
+ * returned.
+ */
+ function _maxSupply() internal view virtual returns (uint256) {
+ return type(uint208).max;
+ }
+
+ /**
+ * @dev Move voting power when tokens are transferred.
+ *
+ * Emits a {IVotes-DelegateVotesChanged} event.
+ */
+ function _update(address from, address to, uint256 value) internal virtual override {
+ super._update(from, to, value);
+ if (from == address(0)) {
+ uint256 supply = totalSupply();
+ uint256 cap = _maxSupply();
+ if (supply > cap) {
+ revert ERC20ExceededSafeSupply(supply, cap);
+ }
+ }
+ _transferVotingUnits(from, to, value);
+ }
+
+ /**
+ * @dev Returns the voting units of an `account`.
+ *
+ * WARNING: Overriding this function may compromise the internal vote accounting.
+ * `ERC20Votes` assumes tokens map to voting units 1:1 and this is not easy to change.
+ */
+ function _getVotingUnits(address account) internal view virtual override returns (uint256) {
+ return balanceOf(account);
+ }
+
+ /**
+ * @dev Get number of checkpoints for `account`.
+ */
+ function numCheckpoints(address account) public view virtual returns (uint32) {
+ return _numCheckpoints(account);
+ }
+
+ /**
+ * @dev Get the `pos`-th checkpoint for `account`.
+ */
+ function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoints.Checkpoint208 memory) {
+ return _checkpoints(account, pos);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol
new file mode 100644
index 0000000..734aa0c
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC20WrapperUpgradeable.sol
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC20/extensions/ERC20Wrapper.sol)
+
+pragma solidity ^0.8.20;
+
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of the ERC-20 token contract to support token wrapping.
+ *
+ * Users can deposit and withdraw "underlying tokens" and receive a matching number of "wrapped tokens". This is useful
+ * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the
+ * wrapping of an existing "basic" ERC-20 into a governance token.
+ *
+ * WARNING: Any mechanism in which the underlying token changes the {balanceOf} of an account without an explicit transfer
+ * may desynchronize this contract's supply and its underlying balance. Please exercise caution when wrapping tokens that
+ * may undercollateralize the wrapper (i.e. wrapper's total supply is higher than its underlying balance). See {_recover}
+ * for recovering value accrued to the wrapper.
+ */
+abstract contract ERC20WrapperUpgradeable is Initializable, ERC20Upgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC20Wrapper
+ struct ERC20WrapperStorage {
+ IERC20 _underlying;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20Wrapper")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC20WrapperStorageLocation = 0x3b5a617e0d4c238430871a64fe18212794b0c8d05a4eac064a8c9039fb5e0700;
+
+ function _getERC20WrapperStorage() private pure returns (ERC20WrapperStorage storage $) {
+ assembly {
+ $.slot := ERC20WrapperStorageLocation
+ }
+ }
+
+ /**
+ * @dev The underlying token couldn't be wrapped.
+ */
+ error ERC20InvalidUnderlying(address token);
+
+ function __ERC20Wrapper_init(IERC20 underlyingToken) internal onlyInitializing {
+ __ERC20Wrapper_init_unchained(underlyingToken);
+ }
+
+ function __ERC20Wrapper_init_unchained(IERC20 underlyingToken) internal onlyInitializing {
+ ERC20WrapperStorage storage $ = _getERC20WrapperStorage();
+ if (address(underlyingToken) == address(this)) {
+ revert ERC20InvalidUnderlying(address(this));
+ }
+ $._underlying = underlyingToken;
+ }
+
+ /// @inheritdoc IERC20Metadata
+ function decimals() public view virtual override returns (uint8) {
+ ERC20WrapperStorage storage $ = _getERC20WrapperStorage();
+ try IERC20Metadata(address($._underlying)).decimals() returns (uint8 value) {
+ return value;
+ } catch {
+ return super.decimals();
+ }
+ }
+
+ /**
+ * @dev Returns the address of the underlying ERC-20 token that is being wrapped.
+ */
+ function underlying() public view returns (IERC20) {
+ ERC20WrapperStorage storage $ = _getERC20WrapperStorage();
+ return $._underlying;
+ }
+
+ /**
+ * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.
+ */
+ function depositFor(address account, uint256 value) public virtual returns (bool) {
+ ERC20WrapperStorage storage $ = _getERC20WrapperStorage();
+ address sender = _msgSender();
+ if (sender == address(this)) {
+ revert ERC20InvalidSender(address(this));
+ }
+ if (account == address(this)) {
+ revert ERC20InvalidReceiver(account);
+ }
+ SafeERC20.safeTransferFrom($._underlying, sender, address(this), value);
+ _mint(account, value);
+ return true;
+ }
+
+ /**
+ * @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.
+ */
+ function withdrawTo(address account, uint256 value) public virtual returns (bool) {
+ ERC20WrapperStorage storage $ = _getERC20WrapperStorage();
+ if (account == address(this)) {
+ revert ERC20InvalidReceiver(account);
+ }
+ _burn(_msgSender(), value);
+ SafeERC20.safeTransfer($._underlying, account, value);
+ return true;
+ }
+
+ /**
+ * @dev Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake or acquired from
+ * rebasing mechanisms. Internal function that can be exposed with access control if desired.
+ */
+ function _recover(address account) internal virtual returns (uint256) {
+ ERC20WrapperStorage storage $ = _getERC20WrapperStorage();
+ uint256 value = $._underlying.balanceOf(address(this)) - totalSupply();
+ _mint(account, value);
+ return value;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol
new file mode 100644
index 0000000..948da3a
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol
@@ -0,0 +1,337 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC20/extensions/ERC4626.sol)
+
+pragma solidity ^0.8.24;
+
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";
+import {LowLevelCall} from "@openzeppelin/contracts/utils/LowLevelCall.sol";
+import {Memory} from "@openzeppelin/contracts/utils/Memory.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the ERC-4626 "Tokenized Vault Standard" as defined in
+ * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].
+ *
+ * This extension allows the minting and burning of "shares" (represented using the ERC-20 inheritance) in exchange for
+ * underlying "assets" through standardized {deposit}, {mint}, {redeem} and {burn} workflows. This contract extends
+ * the ERC-20 standard. Any additional extensions included along it would affect the "shares" token represented by this
+ * contract and not the "assets" token which is an independent contract.
+ *
+ * [CAUTION]
+ * ====
+ * In empty (or nearly empty) ERC-4626 vaults, deposits are at high risk of being stolen through frontrunning
+ * with a "donation" to the vault that inflates the price of a share. This is variously known as a donation or inflation
+ * attack and is essentially a problem of slippage. Vault deployers can protect against this attack by making an initial
+ * deposit of a non-trivial amount of the asset, such that price manipulation becomes infeasible. Withdrawals may
+ * similarly be affected by slippage. Users can protect against this attack as well as unexpected slippage in general by
+ * verifying the amount received is as expected, using a wrapper that performs these checks such as
+ * https://github.com/fei-protocol/ERC4626#erc4626router-and-base[ERC4626Router].
+ *
+ * Since v4.9, this implementation introduces configurable virtual assets and shares to help developers mitigate that risk.
+ * The `_decimalsOffset()` corresponds to an offset in the decimal representation between the underlying asset's decimals
+ * and the vault decimals. This offset also determines the rate of virtual shares to virtual assets in the vault, which
+ * itself determines the initial exchange rate. While not fully preventing the attack, analysis shows that the default
+ * offset (0) makes it non-profitable even if an attacker is able to capture value from multiple user deposits, as a result
+ * of the value being captured by the virtual shares (out of the attacker's donation) matching the attacker's expected gains.
+ * With a larger offset, the attack becomes orders of magnitude more expensive than it is profitable. More details about the
+ * underlying math can be found xref:ROOT:erc4626.adoc#inflation-attack[here].
+ *
+ * The drawback of this approach is that the virtual shares do capture (a very small) part of the value being accrued
+ * to the vault. Also, if the vault experiences losses, the users try to exit the vault, the virtual shares and assets
+ * will cause the first user to exit to experience reduced losses in detriment to the last users that will experience
+ * bigger losses. Developers willing to revert back to the pre-v4.9 behavior just need to override the
+ * `_convertToShares` and `_convertToAssets` functions.
+ *
+ * To learn more, check out our xref:ROOT:erc4626.adoc[ERC-4626 guide].
+ * ====
+ *
+ * [NOTE]
+ * ====
+ * When overriding this contract, some elements must be considered:
+ *
+ * * When overriding the behavior of the deposit or withdraw mechanisms, it is recommended to override the internal
+ * functions. Overriding {_deposit} automatically affects both {deposit} and {mint}. Similarly, overriding {_withdraw}
+ * automatically affects both {withdraw} and {redeem}. Overall it is not recommended to override the public facing
+ * functions since that could lead to inconsistent behaviors between the {deposit} and {mint} or between {withdraw} and
+ * {redeem}, which is documented to have led to loss of funds.
+ *
+ * * Overrides to the deposit or withdraw mechanism must be reflected in the preview functions as well.
+ *
+ * * {maxWithdraw} depends on {maxRedeem}. Therefore, overriding {maxRedeem} only is enough. On the other hand,
+ * overriding {maxWithdraw} only would have no effect on {maxRedeem}, and could create an inconsistency between the two
+ * functions.
+ *
+ * * If {previewRedeem} is overridden to revert, {maxWithdraw} must be overridden as necessary to ensure it
+ * always return successfully.
+ * ====
+ */
+abstract contract ERC4626Upgradeable is Initializable, ERC20Upgradeable, IERC4626 {
+ using Math for uint256;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC4626
+ struct ERC4626Storage {
+ IERC20 _asset;
+ uint8 _underlyingDecimals;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC4626")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC4626StorageLocation = 0x0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00;
+
+ function _getERC4626Storage() private pure returns (ERC4626Storage storage $) {
+ assembly {
+ $.slot := ERC4626StorageLocation
+ }
+ }
+
+ /**
+ * @dev Attempted to deposit more assets than the max amount for `receiver`.
+ */
+ error ERC4626ExceededMaxDeposit(address receiver, uint256 assets, uint256 max);
+
+ /**
+ * @dev Attempted to mint more shares than the max amount for `receiver`.
+ */
+ error ERC4626ExceededMaxMint(address receiver, uint256 shares, uint256 max);
+
+ /**
+ * @dev Attempted to withdraw more assets than the max amount for `owner`.
+ */
+ error ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max);
+
+ /**
+ * @dev Attempted to redeem more shares than the max amount for `owner`.
+ */
+ error ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max);
+
+ /**
+ * @dev Set the underlying asset contract. This must be an ERC20-compatible contract (ERC-20 or ERC-777).
+ */
+ function __ERC4626_init(IERC20 asset_) internal onlyInitializing {
+ __ERC4626_init_unchained(asset_);
+ }
+
+ function __ERC4626_init_unchained(IERC20 asset_) internal onlyInitializing {
+ ERC4626Storage storage $ = _getERC4626Storage();
+ (bool success, uint8 assetDecimals) = _tryGetAssetDecimals(asset_);
+ $._underlyingDecimals = success ? assetDecimals : 18;
+ $._asset = asset_;
+ }
+
+ /**
+ * @dev Attempts to fetch the asset decimals. A return value of false indicates that the attempt failed in some way.
+ */
+ function _tryGetAssetDecimals(IERC20 asset_) private view returns (bool ok, uint8 assetDecimals) {
+ Memory.Pointer ptr = Memory.getFreeMemoryPointer();
+ (bool success, bytes32 returnedDecimals, ) = LowLevelCall.staticcallReturn64Bytes(
+ address(asset_),
+ abi.encodeCall(IERC20Metadata.decimals, ())
+ );
+ Memory.unsafeSetFreeMemoryPointer(ptr);
+
+ return
+ (success && LowLevelCall.returnDataSize() >= 32 && uint256(returnedDecimals) <= type(uint8).max)
+ ? (true, uint8(uint256(returnedDecimals)))
+ : (false, 0);
+ }
+
+ /**
+ * @dev Decimals are computed by adding the decimal offset on top of the underlying asset's decimals. This
+ * "original" value is cached during construction of the vault contract. If this read operation fails (e.g., the
+ * asset has not been created yet), a default of 18 is used to represent the underlying asset's decimals.
+ *
+ * See {IERC20Metadata-decimals}.
+ */
+ function decimals() public view virtual override(IERC20Metadata, ERC20Upgradeable) returns (uint8) {
+ ERC4626Storage storage $ = _getERC4626Storage();
+ return $._underlyingDecimals + _decimalsOffset();
+ }
+
+ /// @inheritdoc IERC4626
+ function asset() public view virtual returns (address) {
+ ERC4626Storage storage $ = _getERC4626Storage();
+ return address($._asset);
+ }
+
+ /// @inheritdoc IERC4626
+ function totalAssets() public view virtual returns (uint256) {
+ return IERC20(asset()).balanceOf(address(this));
+ }
+
+ /// @inheritdoc IERC4626
+ function convertToShares(uint256 assets) public view virtual returns (uint256) {
+ return _convertToShares(assets, Math.Rounding.Floor);
+ }
+
+ /// @inheritdoc IERC4626
+ function convertToAssets(uint256 shares) public view virtual returns (uint256) {
+ return _convertToAssets(shares, Math.Rounding.Floor);
+ }
+
+ /// @inheritdoc IERC4626
+ function maxDeposit(address) public view virtual returns (uint256) {
+ return type(uint256).max;
+ }
+
+ /// @inheritdoc IERC4626
+ function maxMint(address) public view virtual returns (uint256) {
+ return type(uint256).max;
+ }
+
+ /// @inheritdoc IERC4626
+ function maxWithdraw(address owner) public view virtual returns (uint256) {
+ return previewRedeem(maxRedeem(owner));
+ }
+
+ /// @inheritdoc IERC4626
+ function maxRedeem(address owner) public view virtual returns (uint256) {
+ return balanceOf(owner);
+ }
+
+ /// @inheritdoc IERC4626
+ function previewDeposit(uint256 assets) public view virtual returns (uint256) {
+ return _convertToShares(assets, Math.Rounding.Floor);
+ }
+
+ /// @inheritdoc IERC4626
+ function previewMint(uint256 shares) public view virtual returns (uint256) {
+ return _convertToAssets(shares, Math.Rounding.Ceil);
+ }
+
+ /// @inheritdoc IERC4626
+ function previewWithdraw(uint256 assets) public view virtual returns (uint256) {
+ return _convertToShares(assets, Math.Rounding.Ceil);
+ }
+
+ /// @inheritdoc IERC4626
+ function previewRedeem(uint256 shares) public view virtual returns (uint256) {
+ return _convertToAssets(shares, Math.Rounding.Floor);
+ }
+
+ /// @inheritdoc IERC4626
+ function deposit(uint256 assets, address receiver) public virtual returns (uint256) {
+ uint256 maxAssets = maxDeposit(receiver);
+ if (assets > maxAssets) {
+ revert ERC4626ExceededMaxDeposit(receiver, assets, maxAssets);
+ }
+
+ uint256 shares = previewDeposit(assets);
+ _deposit(_msgSender(), receiver, assets, shares);
+
+ return shares;
+ }
+
+ /// @inheritdoc IERC4626
+ function mint(uint256 shares, address receiver) public virtual returns (uint256) {
+ uint256 maxShares = maxMint(receiver);
+ if (shares > maxShares) {
+ revert ERC4626ExceededMaxMint(receiver, shares, maxShares);
+ }
+
+ uint256 assets = previewMint(shares);
+ _deposit(_msgSender(), receiver, assets, shares);
+
+ return assets;
+ }
+
+ /// @inheritdoc IERC4626
+ function withdraw(uint256 assets, address receiver, address owner) public virtual returns (uint256) {
+ uint256 maxAssets = maxWithdraw(owner);
+ if (assets > maxAssets) {
+ revert ERC4626ExceededMaxWithdraw(owner, assets, maxAssets);
+ }
+
+ uint256 shares = previewWithdraw(assets);
+ _withdraw(_msgSender(), receiver, owner, assets, shares);
+
+ return shares;
+ }
+
+ /// @inheritdoc IERC4626
+ function redeem(uint256 shares, address receiver, address owner) public virtual returns (uint256) {
+ uint256 maxShares = maxRedeem(owner);
+ if (shares > maxShares) {
+ revert ERC4626ExceededMaxRedeem(owner, shares, maxShares);
+ }
+
+ uint256 assets = previewRedeem(shares);
+ _withdraw(_msgSender(), receiver, owner, assets, shares);
+
+ return assets;
+ }
+
+ /**
+ * @dev Internal conversion function (from assets to shares) with support for rounding direction.
+ */
+ function _convertToShares(uint256 assets, Math.Rounding rounding) internal view virtual returns (uint256) {
+ return assets.mulDiv(totalSupply() + 10 ** _decimalsOffset(), totalAssets() + 1, rounding);
+ }
+
+ /**
+ * @dev Internal conversion function (from shares to assets) with support for rounding direction.
+ */
+ function _convertToAssets(uint256 shares, Math.Rounding rounding) internal view virtual returns (uint256) {
+ return shares.mulDiv(totalAssets() + 1, totalSupply() + 10 ** _decimalsOffset(), rounding);
+ }
+
+ /**
+ * @dev Deposit/mint common workflow.
+ */
+ function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal virtual {
+ // If asset() is ERC-777, `transferFrom` can trigger a reentrancy BEFORE the transfer happens through the
+ // `tokensToSend` hook. On the other hand, the `tokenReceived` hook, that is triggered after the transfer,
+ // calls the vault, which is assumed not malicious.
+ //
+ // Conclusion: we need to do the transfer before we mint so that any reentrancy would happen before the
+ // assets are transferred and before the shares are minted, which is a valid state.
+ // slither-disable-next-line reentrancy-no-eth
+ _transferIn(caller, assets);
+ _mint(receiver, shares);
+
+ emit Deposit(caller, receiver, assets, shares);
+ }
+
+ /**
+ * @dev Withdraw/redeem common workflow.
+ */
+ function _withdraw(
+ address caller,
+ address receiver,
+ address owner,
+ uint256 assets,
+ uint256 shares
+ ) internal virtual {
+ if (caller != owner) {
+ _spendAllowance(owner, caller, shares);
+ }
+
+ // If asset() is ERC-777, `transfer` can trigger a reentrancy AFTER the transfer happens through the
+ // `tokensReceived` hook. On the other hand, the `tokensToSend` hook, that is triggered before the transfer,
+ // calls the vault, which is assumed not malicious.
+ //
+ // Conclusion: we need to do the transfer after the burn so that any reentrancy would happen after the
+ // shares are burned and after the assets are transferred, which is a valid state.
+ _burn(owner, shares);
+ _transferOut(receiver, assets);
+
+ emit Withdraw(caller, receiver, owner, assets, shares);
+ }
+
+ /// @dev Performs a transfer in of underlying assets. The default implementation uses `SafeERC20`. Used by {_deposit}.
+ function _transferIn(address from, uint256 assets) internal virtual {
+ SafeERC20.safeTransferFrom(IERC20(asset()), from, address(this), assets);
+ }
+
+ /// @dev Performs a transfer out of underlying assets. The default implementation uses `SafeERC20`. Used by {_withdraw}.
+ function _transferOut(address to, uint256 assets) internal virtual {
+ SafeERC20.safeTransfer(IERC20(asset()), to, assets);
+ }
+
+ function _decimalsOffset() internal view virtual returns (uint8) {
+ return 0;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/draft-ERC20BridgeableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/draft-ERC20BridgeableUpgradeable.sol
new file mode 100644
index 0000000..99aea49
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/draft-ERC20BridgeableUpgradeable.sol
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/draft-ERC20Bridgeable.sol)
+
+pragma solidity ^0.8.20;
+
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {ERC165Upgradeable} from "../../../utils/introspection/ERC165Upgradeable.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {IERC7802} from "@openzeppelin/contracts/interfaces/draft-IERC7802.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev ERC20 extension that implements the standard token interface according to
+ * https://eips.ethereum.org/EIPS/eip-7802[ERC-7802].
+ */
+abstract contract ERC20BridgeableUpgradeable is Initializable, ERC20Upgradeable, ERC165Upgradeable, IERC7802 {
+ /// @dev Modifier to restrict access to the token bridge.
+ modifier onlyTokenBridge() {
+ // Token bridge should never be impersonated using a relayer/forwarder. Using msg.sender is preferable to
+ // _msgSender() for security reasons.
+ _checkTokenBridge(msg.sender);
+ _;
+ }
+
+ function __ERC20Bridgeable_init() internal onlyInitializing {
+ }
+
+ function __ERC20Bridgeable_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc ERC165Upgradeable
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165) returns (bool) {
+ return interfaceId == type(IERC7802).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /**
+ * @dev See {IERC7802-crosschainMint}. Emits a {IERC7802-CrosschainMint} event.
+ */
+ function crosschainMint(address to, uint256 value) public virtual override onlyTokenBridge {
+ _mint(to, value);
+ emit CrosschainMint(to, value, _msgSender());
+ }
+
+ /**
+ * @dev See {IERC7802-crosschainBurn}. Emits a {IERC7802-CrosschainBurn} event.
+ */
+ function crosschainBurn(address from, uint256 value) public virtual override onlyTokenBridge {
+ _burn(from, value);
+ emit CrosschainBurn(from, value, _msgSender());
+ }
+
+ /**
+ * @dev Checks if the caller is a trusted token bridge. MUST revert otherwise.
+ *
+ * Developers should implement this function using an access control mechanism that allows
+ * customizing the list of allowed senders. Consider using {AccessControl} or {AccessManaged}.
+ */
+ function _checkTokenBridge(address caller) internal virtual;
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/draft-ERC20TemporaryApprovalUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/draft-ERC20TemporaryApprovalUpgradeable.sol
new file mode 100644
index 0000000..b7a9e72
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC20/extensions/draft-ERC20TemporaryApprovalUpgradeable.sol
@@ -0,0 +1,126 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/extensions/draft-ERC20TemporaryApproval.sol)
+
+pragma solidity ^0.8.24;
+
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";
+import {IERC7674} from "@openzeppelin/contracts/interfaces/draft-IERC7674.sol";
+import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
+import {SlotDerivation} from "@openzeppelin/contracts/utils/SlotDerivation.sol";
+import {TransientSlot} from "@openzeppelin/contracts/utils/TransientSlot.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {ERC20} that adds support for temporary allowances following ERC-7674.
+ *
+ * WARNING: This is a draft contract. The corresponding ERC is still subject to changes.
+ *
+ * _Available since v5.1._
+ */
+abstract contract ERC20TemporaryApprovalUpgradeable is Initializable, ERC20Upgradeable, IERC7674 {
+ using SlotDerivation for bytes32;
+ using TransientSlot for bytes32;
+ using TransientSlot for TransientSlot.Uint256Slot;
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20_TEMPORARY_APPROVAL_STORAGE")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC20_TEMPORARY_APPROVAL_STORAGE =
+ 0xea2d0e77a01400d0111492b1321103eed560d8fe44b9a7c2410407714583c400;
+
+ function __ERC20TemporaryApproval_init() internal onlyInitializing {
+ }
+
+ function __ERC20TemporaryApproval_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev {allowance} override that includes the temporary allowance when looking up the current allowance. If
+ * adding up the persistent and the temporary allowances result in an overflow, type(uint256).max is returned.
+ */
+ function allowance(address owner, address spender) public view virtual override(IERC20, ERC20Upgradeable) returns (uint256) {
+ (bool success, uint256 amount) = Math.tryAdd(
+ super.allowance(owner, spender),
+ _temporaryAllowance(owner, spender)
+ );
+ return success ? amount : type(uint256).max;
+ }
+
+ /**
+ * @dev Internal getter for the current temporary allowance that `spender` has over `owner` tokens.
+ */
+ function _temporaryAllowance(address owner, address spender) internal view virtual returns (uint256) {
+ return _temporaryAllowanceSlot(owner, spender).tload();
+ }
+
+ /**
+ * @dev Alternative to {approve} that sets a `value` amount of tokens as the temporary allowance of `spender` over
+ * the caller's tokens.
+ *
+ * Returns a boolean value indicating whether the operation succeeded.
+ *
+ * Requirements:
+ * - `spender` cannot be the zero address.
+ *
+ * Does NOT emit an {Approval} event.
+ */
+ function temporaryApprove(address spender, uint256 value) public virtual returns (bool) {
+ _temporaryApprove(_msgSender(), spender, value);
+ return true;
+ }
+
+ /**
+ * @dev Sets `value` as the temporary allowance of `spender` over the `owner`'s tokens.
+ *
+ * This internal function is equivalent to `temporaryApprove`, and can be used to e.g. set automatic allowances
+ * for certain subsystems, etc.
+ *
+ * Requirements:
+ * - `owner` cannot be the zero address.
+ * - `spender` cannot be the zero address.
+ *
+ * Does NOT emit an {Approval} event.
+ */
+ function _temporaryApprove(address owner, address spender, uint256 value) internal virtual {
+ if (owner == address(0)) {
+ revert ERC20InvalidApprover(address(0));
+ }
+ if (spender == address(0)) {
+ revert ERC20InvalidSpender(address(0));
+ }
+ _temporaryAllowanceSlot(owner, spender).tstore(value);
+ }
+
+ /**
+ * @dev {_spendAllowance} override that consumes the temporary allowance (if any) before eventually falling back
+ * to consuming the persistent allowance.
+ * NOTE: This function skips calling `super._spendAllowance` if the temporary allowance
+ * is enough to cover the spending.
+ */
+ function _spendAllowance(address owner, address spender, uint256 value) internal virtual override {
+ // load transient allowance
+ uint256 currentTemporaryAllowance = _temporaryAllowance(owner, spender);
+
+ // Check and update (if needed) the temporary allowance + set remaining value
+ if (currentTemporaryAllowance > 0) {
+ // All value is covered by the infinite allowance. nothing left to spend, we can return early
+ if (currentTemporaryAllowance == type(uint256).max) {
+ return;
+ }
+ // check how much of the value is covered by the transient allowance
+ uint256 spendTemporaryAllowance = Math.min(currentTemporaryAllowance, value);
+ unchecked {
+ // decrease transient allowance accordingly
+ _temporaryApprove(owner, spender, currentTemporaryAllowance - spendTemporaryAllowance);
+ // update value necessary
+ value -= spendTemporaryAllowance;
+ }
+ }
+ // reduce any remaining value from the persistent allowance
+ if (value > 0) {
+ super._spendAllowance(owner, spender, value);
+ }
+ }
+
+ function _temporaryAllowanceSlot(address owner, address spender) private pure returns (TransientSlot.Uint256Slot) {
+ return ERC20_TEMPORARY_APPROVAL_STORAGE.deriveMapping(owner).deriveMapping(spender).asUint256();
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC6909/ERC6909Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC6909/ERC6909Upgradeable.sol
new file mode 100644
index 0000000..8897d71
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC6909/ERC6909Upgradeable.sol
@@ -0,0 +1,250 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC6909/ERC6909.sol)
+
+pragma solidity ^0.8.20;
+
+import {IERC6909} from "@openzeppelin/contracts/interfaces/IERC6909.sol";
+import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {ERC165Upgradeable} from "../../utils/introspection/ERC165Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of ERC-6909.
+ * See https://eips.ethereum.org/EIPS/eip-6909
+ */
+contract ERC6909Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC6909 {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC6909
+ struct ERC6909Storage {
+ mapping(address owner => mapping(uint256 id => uint256)) _balances;
+
+ mapping(address owner => mapping(address operator => bool)) _operatorApprovals;
+
+ mapping(address owner => mapping(address spender => mapping(uint256 id => uint256))) _allowances;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC6909")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC6909StorageLocation = 0x9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900;
+
+ function _getERC6909Storage() private pure returns (ERC6909Storage storage $) {
+ assembly {
+ $.slot := ERC6909StorageLocation
+ }
+ }
+
+ error ERC6909InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 id);
+ error ERC6909InsufficientAllowance(address spender, uint256 allowance, uint256 needed, uint256 id);
+ error ERC6909InvalidApprover(address approver);
+ error ERC6909InvalidReceiver(address receiver);
+ error ERC6909InvalidSender(address sender);
+ error ERC6909InvalidSpender(address spender);
+
+ function __ERC6909_init() internal onlyInitializing {
+ }
+
+ function __ERC6909_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165) returns (bool) {
+ return interfaceId == type(IERC6909).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /// @inheritdoc IERC6909
+ function balanceOf(address owner, uint256 id) public view virtual override returns (uint256) {
+ ERC6909Storage storage $ = _getERC6909Storage();
+ return $._balances[owner][id];
+ }
+
+ /// @inheritdoc IERC6909
+ function allowance(address owner, address spender, uint256 id) public view virtual override returns (uint256) {
+ ERC6909Storage storage $ = _getERC6909Storage();
+ return $._allowances[owner][spender][id];
+ }
+
+ /// @inheritdoc IERC6909
+ function isOperator(address owner, address spender) public view virtual override returns (bool) {
+ ERC6909Storage storage $ = _getERC6909Storage();
+ return $._operatorApprovals[owner][spender];
+ }
+
+ /// @inheritdoc IERC6909
+ function approve(address spender, uint256 id, uint256 amount) public virtual override returns (bool) {
+ _approve(_msgSender(), spender, id, amount);
+ return true;
+ }
+
+ /// @inheritdoc IERC6909
+ function setOperator(address spender, bool approved) public virtual override returns (bool) {
+ _setOperator(_msgSender(), spender, approved);
+ return true;
+ }
+
+ /// @inheritdoc IERC6909
+ function transfer(address receiver, uint256 id, uint256 amount) public virtual override returns (bool) {
+ _transfer(_msgSender(), receiver, id, amount);
+ return true;
+ }
+
+ /// @inheritdoc IERC6909
+ function transferFrom(
+ address sender,
+ address receiver,
+ uint256 id,
+ uint256 amount
+ ) public virtual override returns (bool) {
+ address caller = _msgSender();
+ if (sender != caller && !isOperator(sender, caller)) {
+ _spendAllowance(sender, caller, id, amount);
+ }
+ _transfer(sender, receiver, id, amount);
+ return true;
+ }
+
+ /**
+ * @dev Creates `amount` of token `id` and assigns them to `account`, by transferring it from address(0).
+ * Relies on the `_update` mechanism.
+ *
+ * Emits a {Transfer} event with `from` set to the zero address.
+ *
+ * NOTE: This function is not virtual, {_update} should be overridden instead.
+ */
+ function _mint(address to, uint256 id, uint256 amount) internal {
+ if (to == address(0)) {
+ revert ERC6909InvalidReceiver(address(0));
+ }
+ _update(address(0), to, id, amount);
+ }
+
+ /**
+ * @dev Moves `amount` of token `id` from `from` to `to` without checking for approvals. This function verifies
+ * that neither the sender nor the receiver are address(0), which means it cannot mint or burn tokens.
+ * Relies on the `_update` mechanism.
+ *
+ * Emits a {Transfer} event.
+ *
+ * NOTE: This function is not virtual, {_update} should be overridden instead.
+ */
+ function _transfer(address from, address to, uint256 id, uint256 amount) internal {
+ if (from == address(0)) {
+ revert ERC6909InvalidSender(address(0));
+ }
+ if (to == address(0)) {
+ revert ERC6909InvalidReceiver(address(0));
+ }
+ _update(from, to, id, amount);
+ }
+
+ /**
+ * @dev Destroys a `amount` of token `id` from `account`.
+ * Relies on the `_update` mechanism.
+ *
+ * Emits a {Transfer} event with `to` set to the zero address.
+ *
+ * NOTE: This function is not virtual, {_update} should be overridden instead
+ */
+ function _burn(address from, uint256 id, uint256 amount) internal {
+ if (from == address(0)) {
+ revert ERC6909InvalidSender(address(0));
+ }
+ _update(from, address(0), id, amount);
+ }
+
+ /**
+ * @dev Transfers `amount` of token `id` from `from` to `to`, or alternatively mints (or burns) if `from`
+ * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
+ * this function.
+ *
+ * Emits a {Transfer} event.
+ */
+ function _update(address from, address to, uint256 id, uint256 amount) internal virtual {
+ ERC6909Storage storage $ = _getERC6909Storage();
+ address caller = _msgSender();
+
+ if (from != address(0)) {
+ uint256 fromBalance = $._balances[from][id];
+ if (fromBalance < amount) {
+ revert ERC6909InsufficientBalance(from, fromBalance, amount, id);
+ }
+ unchecked {
+ // Overflow not possible: amount <= fromBalance.
+ $._balances[from][id] = fromBalance - amount;
+ }
+ }
+ if (to != address(0)) {
+ $._balances[to][id] += amount;
+ }
+
+ emit Transfer(caller, from, to, id, amount);
+ }
+
+ /**
+ * @dev Sets `amount` as the allowance of `spender` over the `owner`'s `id` tokens.
+ *
+ * This internal function is equivalent to `approve`, and can be used to e.g. set automatic allowances for certain
+ * subsystems, etc.
+ *
+ * Emits an {Approval} event.
+ *
+ * Requirements:
+ *
+ * - `owner` cannot be the zero address.
+ * - `spender` cannot be the zero address.
+ */
+ function _approve(address owner, address spender, uint256 id, uint256 amount) internal virtual {
+ ERC6909Storage storage $ = _getERC6909Storage();
+ if (owner == address(0)) {
+ revert ERC6909InvalidApprover(address(0));
+ }
+ if (spender == address(0)) {
+ revert ERC6909InvalidSpender(address(0));
+ }
+ $._allowances[owner][spender][id] = amount;
+ emit Approval(owner, spender, id, amount);
+ }
+
+ /**
+ * @dev Approve `spender` to operate on all of `owner`'s tokens
+ *
+ * This internal function is equivalent to `setOperator`, and can be used to e.g. set automatic allowances for
+ * certain subsystems, etc.
+ *
+ * Emits an {OperatorSet} event.
+ *
+ * Requirements:
+ *
+ * - `owner` cannot be the zero address.
+ * - `spender` cannot be the zero address.
+ */
+ function _setOperator(address owner, address spender, bool approved) internal virtual {
+ ERC6909Storage storage $ = _getERC6909Storage();
+ if (owner == address(0)) {
+ revert ERC6909InvalidApprover(address(0));
+ }
+ if (spender == address(0)) {
+ revert ERC6909InvalidSpender(address(0));
+ }
+ $._operatorApprovals[owner][spender] = approved;
+ emit OperatorSet(owner, spender, approved);
+ }
+
+ /**
+ * @dev Updates `owner`'s allowance for `spender` based on spent `amount`.
+ *
+ * Does not update the allowance value in case of infinite allowance.
+ * Revert if not enough allowance is available.
+ *
+ * Does not emit an {Approval} event.
+ */
+ function _spendAllowance(address owner, address spender, uint256 id, uint256 amount) internal virtual {
+ ERC6909Storage storage $ = _getERC6909Storage();
+ uint256 currentAllowance = allowance(owner, spender, id);
+ if (currentAllowance < type(uint256).max) {
+ if (currentAllowance < amount) {
+ revert ERC6909InsufficientAllowance(spender, currentAllowance, amount, id);
+ }
+ unchecked {
+ $._allowances[owner][spender][id] = currentAllowance - amount;
+ }
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909ContentURIUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909ContentURIUpgradeable.sol
new file mode 100644
index 0000000..eefbddb
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909ContentURIUpgradeable.sol
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC6909/extensions/ERC6909ContentURI.sol)
+
+pragma solidity ^0.8.20;
+
+import {ERC6909Upgradeable} from "../ERC6909Upgradeable.sol";
+import {IERC6909ContentURI} from "@openzeppelin/contracts/interfaces/IERC6909.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the Content URI extension defined in ERC6909.
+ */
+contract ERC6909ContentURIUpgradeable is Initializable, ERC6909Upgradeable, IERC6909ContentURI {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC6909ContentURI
+ struct ERC6909ContentURIStorage {
+ string _contractURI;
+ mapping(uint256 id => string) _tokenURIs;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC6909ContentURI")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC6909ContentURIStorageLocation = 0x2ada2772a8c4d40c4be8741992e423a9f97d5f4ef76852e5c17a40aa7fb9e500;
+
+ function _getERC6909ContentURIStorage() private pure returns (ERC6909ContentURIStorage storage $) {
+ assembly {
+ $.slot := ERC6909ContentURIStorageLocation
+ }
+ }
+
+ /// @dev Event emitted when the contract URI is changed. See https://eips.ethereum.org/EIPS/eip-7572[ERC-7572] for details.
+ event ContractURIUpdated();
+
+ /// @dev See {IERC1155-URI}
+ event URI(string value, uint256 indexed id);
+
+ function __ERC6909ContentURI_init() internal onlyInitializing {
+ }
+
+ function __ERC6909ContentURI_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC6909Upgradeable, IERC165) returns (bool) {
+ return interfaceId == type(IERC6909ContentURI).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /// @inheritdoc IERC6909ContentURI
+ function contractURI() public view virtual override returns (string memory) {
+ ERC6909ContentURIStorage storage $ = _getERC6909ContentURIStorage();
+ return $._contractURI;
+ }
+
+ /// @inheritdoc IERC6909ContentURI
+ function tokenURI(uint256 id) public view virtual override returns (string memory) {
+ ERC6909ContentURIStorage storage $ = _getERC6909ContentURIStorage();
+ return $._tokenURIs[id];
+ }
+
+ /**
+ * @dev Sets the {contractURI} for the contract.
+ *
+ * Emits a {ContractURIUpdated} event.
+ */
+ function _setContractURI(string memory newContractURI) internal virtual {
+ ERC6909ContentURIStorage storage $ = _getERC6909ContentURIStorage();
+ $._contractURI = newContractURI;
+
+ emit ContractURIUpdated();
+ }
+
+ /**
+ * @dev Sets the {tokenURI} for a given token of type `id`.
+ *
+ * Emits a {URI} event.
+ */
+ function _setTokenURI(uint256 id, string memory newTokenURI) internal virtual {
+ ERC6909ContentURIStorage storage $ = _getERC6909ContentURIStorage();
+ $._tokenURIs[id] = newTokenURI;
+
+ emit URI(newTokenURI, id);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909MetadataUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909MetadataUpgradeable.sol
new file mode 100644
index 0000000..8016ba2
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909MetadataUpgradeable.sol
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC6909/extensions/ERC6909Metadata.sol)
+
+pragma solidity ^0.8.20;
+
+import {ERC6909Upgradeable} from "../ERC6909Upgradeable.sol";
+import {IERC6909Metadata} from "@openzeppelin/contracts/interfaces/IERC6909.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the Metadata extension defined in ERC6909. Exposes the name, symbol, and decimals of each token id.
+ */
+contract ERC6909MetadataUpgradeable is Initializable, ERC6909Upgradeable, IERC6909Metadata {
+ struct TokenMetadata {
+ string name;
+ string symbol;
+ uint8 decimals;
+ }
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC6909Metadata
+ struct ERC6909MetadataStorage {
+ mapping(uint256 id => TokenMetadata) _tokenMetadata;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC6909Metadata")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC6909MetadataStorageLocation = 0xa0651e3d105d335a33d7d04897e080112be09c416f44637d6543e5b47885f800;
+
+ function _getERC6909MetadataStorage() private pure returns (ERC6909MetadataStorage storage $) {
+ assembly {
+ $.slot := ERC6909MetadataStorageLocation
+ }
+ }
+
+ /// @dev The name of the token of type `id` was updated to `newName`.
+ event ERC6909NameUpdated(uint256 indexed id, string newName);
+
+ /// @dev The symbol for the token of type `id` was updated to `newSymbol`.
+ event ERC6909SymbolUpdated(uint256 indexed id, string newSymbol);
+
+ /// @dev The decimals value for token of type `id` was updated to `newDecimals`.
+ event ERC6909DecimalsUpdated(uint256 indexed id, uint8 newDecimals);
+
+ function __ERC6909Metadata_init() internal onlyInitializing {
+ }
+
+ function __ERC6909Metadata_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC6909Metadata
+ function name(uint256 id) public view virtual override returns (string memory) {
+ ERC6909MetadataStorage storage $ = _getERC6909MetadataStorage();
+ return $._tokenMetadata[id].name;
+ }
+
+ /// @inheritdoc IERC6909Metadata
+ function symbol(uint256 id) public view virtual override returns (string memory) {
+ ERC6909MetadataStorage storage $ = _getERC6909MetadataStorage();
+ return $._tokenMetadata[id].symbol;
+ }
+
+ /// @inheritdoc IERC6909Metadata
+ function decimals(uint256 id) public view virtual override returns (uint8) {
+ ERC6909MetadataStorage storage $ = _getERC6909MetadataStorage();
+ return $._tokenMetadata[id].decimals;
+ }
+
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC6909Upgradeable, IERC165) returns (bool) {
+ return interfaceId == type(IERC6909Metadata).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /**
+ * @dev Sets the `name` for a given token of type `id`.
+ *
+ * Emits an {ERC6909NameUpdated} event.
+ */
+ function _setName(uint256 id, string memory newName) internal virtual {
+ ERC6909MetadataStorage storage $ = _getERC6909MetadataStorage();
+ $._tokenMetadata[id].name = newName;
+
+ emit ERC6909NameUpdated(id, newName);
+ }
+
+ /**
+ * @dev Sets the `symbol` for a given token of type `id`.
+ *
+ * Emits an {ERC6909SymbolUpdated} event.
+ */
+ function _setSymbol(uint256 id, string memory newSymbol) internal virtual {
+ ERC6909MetadataStorage storage $ = _getERC6909MetadataStorage();
+ $._tokenMetadata[id].symbol = newSymbol;
+
+ emit ERC6909SymbolUpdated(id, newSymbol);
+ }
+
+ /**
+ * @dev Sets the `decimals` for a given token of type `id`.
+ *
+ * Emits an {ERC6909DecimalsUpdated} event.
+ */
+ function _setDecimals(uint256 id, uint8 newDecimals) internal virtual {
+ ERC6909MetadataStorage storage $ = _getERC6909MetadataStorage();
+ $._tokenMetadata[id].decimals = newDecimals;
+
+ emit ERC6909DecimalsUpdated(id, newDecimals);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909TokenSupplyUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909TokenSupplyUpgradeable.sol
new file mode 100644
index 0000000..c5d9275
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC6909/extensions/ERC6909TokenSupplyUpgradeable.sol
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC6909/extensions/ERC6909TokenSupply.sol)
+
+pragma solidity ^0.8.20;
+
+import {ERC6909Upgradeable} from "../ERC6909Upgradeable.sol";
+import {IERC6909TokenSupply} from "@openzeppelin/contracts/interfaces/IERC6909.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the Token Supply extension defined in ERC6909.
+ * Tracks the total supply of each token id individually.
+ */
+contract ERC6909TokenSupplyUpgradeable is Initializable, ERC6909Upgradeable, IERC6909TokenSupply {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC6909TokenSupply
+ struct ERC6909TokenSupplyStorage {
+ mapping(uint256 id => uint256) _totalSupplies;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC6909TokenSupply")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC6909TokenSupplyStorageLocation = 0x9cc5ac148333cfaf4365d2d67a9c6e8fab8e8f4df7b569f769d68102db719600;
+
+ function _getERC6909TokenSupplyStorage() private pure returns (ERC6909TokenSupplyStorage storage $) {
+ assembly {
+ $.slot := ERC6909TokenSupplyStorageLocation
+ }
+ }
+
+ function __ERC6909TokenSupply_init() internal onlyInitializing {
+ }
+
+ function __ERC6909TokenSupply_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC6909TokenSupply
+ function totalSupply(uint256 id) public view virtual override returns (uint256) {
+ ERC6909TokenSupplyStorage storage $ = _getERC6909TokenSupplyStorage();
+ return $._totalSupplies[id];
+ }
+
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC6909Upgradeable, IERC165) returns (bool) {
+ return interfaceId == type(IERC6909TokenSupply).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /// @dev Override the `_update` function to update the total supply of each token id as necessary.
+ function _update(address from, address to, uint256 id, uint256 amount) internal virtual override {
+ ERC6909TokenSupplyStorage storage $ = _getERC6909TokenSupplyStorage();
+ super._update(from, to, id, amount);
+
+ if (from == address(0)) {
+ $._totalSupplies[id] += amount;
+ }
+ if (to == address(0)) {
+ unchecked {
+ // amount <= _balances[from][id] <= _totalSupplies[id]
+ $._totalSupplies[id] -= amount;
+ }
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol
new file mode 100644
index 0000000..76c3aff
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol
@@ -0,0 +1,462 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC721/ERC721.sol)
+
+pragma solidity ^0.8.24;
+
+import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
+import {IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
+import {ERC721Utils} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol";
+import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol";
+import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {ERC165Upgradeable} from "../../utils/introspection/ERC165Upgradeable.sol";
+import {IERC721Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC-721] Non-Fungible Token Standard, including
+ * the Metadata extension, but not including the Enumerable extension, which is available separately as
+ * {ERC721Enumerable}.
+ */
+abstract contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721, IERC721Metadata, IERC721Errors {
+ using Strings for uint256;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC721
+ struct ERC721Storage {
+ // Token name
+ string _name;
+
+ // Token symbol
+ string _symbol;
+
+ mapping(uint256 tokenId => address) _owners;
+
+ mapping(address owner => uint256) _balances;
+
+ mapping(uint256 tokenId => address) _tokenApprovals;
+
+ mapping(address owner => mapping(address operator => bool)) _operatorApprovals;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC721")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC721StorageLocation = 0x80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300;
+
+ function _getERC721Storage() private pure returns (ERC721Storage storage $) {
+ assembly {
+ $.slot := ERC721StorageLocation
+ }
+ }
+
+ /**
+ * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
+ */
+ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {
+ __ERC721_init_unchained(name_, symbol_);
+ }
+
+ function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
+ ERC721Storage storage $ = _getERC721Storage();
+ $._name = name_;
+ $._symbol = symbol_;
+ }
+
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165) returns (bool) {
+ return
+ interfaceId == type(IERC721).interfaceId ||
+ interfaceId == type(IERC721Metadata).interfaceId ||
+ super.supportsInterface(interfaceId);
+ }
+
+ /// @inheritdoc IERC721
+ function balanceOf(address owner) public view virtual returns (uint256) {
+ ERC721Storage storage $ = _getERC721Storage();
+ if (owner == address(0)) {
+ revert ERC721InvalidOwner(address(0));
+ }
+ return $._balances[owner];
+ }
+
+ /// @inheritdoc IERC721
+ function ownerOf(uint256 tokenId) public view virtual returns (address) {
+ return _requireOwned(tokenId);
+ }
+
+ /// @inheritdoc IERC721Metadata
+ function name() public view virtual returns (string memory) {
+ ERC721Storage storage $ = _getERC721Storage();
+ return $._name;
+ }
+
+ /// @inheritdoc IERC721Metadata
+ function symbol() public view virtual returns (string memory) {
+ ERC721Storage storage $ = _getERC721Storage();
+ return $._symbol;
+ }
+
+ /// @inheritdoc IERC721Metadata
+ function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
+ _requireOwned(tokenId);
+
+ string memory baseURI = _baseURI();
+ return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : "";
+ }
+
+ /**
+ * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
+ * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
+ * by default, can be overridden in child contracts.
+ */
+ function _baseURI() internal view virtual returns (string memory) {
+ return "";
+ }
+
+ /// @inheritdoc IERC721
+ function approve(address to, uint256 tokenId) public virtual {
+ _approve(to, tokenId, _msgSender());
+ }
+
+ /// @inheritdoc IERC721
+ function getApproved(uint256 tokenId) public view virtual returns (address) {
+ _requireOwned(tokenId);
+
+ return _getApproved(tokenId);
+ }
+
+ /// @inheritdoc IERC721
+ function setApprovalForAll(address operator, bool approved) public virtual {
+ _setApprovalForAll(_msgSender(), operator, approved);
+ }
+
+ /// @inheritdoc IERC721
+ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
+ ERC721Storage storage $ = _getERC721Storage();
+ return $._operatorApprovals[owner][operator];
+ }
+
+ /// @inheritdoc IERC721
+ function transferFrom(address from, address to, uint256 tokenId) public virtual {
+ if (to == address(0)) {
+ revert ERC721InvalidReceiver(address(0));
+ }
+ // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
+ // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
+ address previousOwner = _update(to, tokenId, _msgSender());
+ if (previousOwner != from) {
+ revert ERC721IncorrectOwner(from, tokenId, previousOwner);
+ }
+ }
+
+ /// @inheritdoc IERC721
+ function safeTransferFrom(address from, address to, uint256 tokenId) public {
+ safeTransferFrom(from, to, tokenId, "");
+ }
+
+ /// @inheritdoc IERC721
+ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
+ transferFrom(from, to, tokenId);
+ ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);
+ }
+
+ /**
+ * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
+ *
+ * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
+ * core ERC-721 logic MUST be matched with the use of {_increaseBalance} to keep balances
+ * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
+ * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
+ */
+ function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
+ ERC721Storage storage $ = _getERC721Storage();
+ return $._owners[tokenId];
+ }
+
+ /**
+ * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
+ */
+ function _getApproved(uint256 tokenId) internal view virtual returns (address) {
+ ERC721Storage storage $ = _getERC721Storage();
+ return $._tokenApprovals[tokenId];
+ }
+
+ /**
+ * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
+ * particular (ignoring whether it is owned by `owner`).
+ *
+ * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
+ * assumption.
+ */
+ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
+ return
+ spender != address(0) &&
+ (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
+ }
+
+ /**
+ * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
+ * Reverts if:
+ * - `spender` does not have approval from `owner` for `tokenId`.
+ * - `spender` does not have approval to manage all of `owner`'s assets.
+ *
+ * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
+ * assumption.
+ */
+ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
+ if (!_isAuthorized(owner, spender, tokenId)) {
+ if (owner == address(0)) {
+ revert ERC721NonexistentToken(tokenId);
+ } else {
+ revert ERC721InsufficientApproval(spender, tokenId);
+ }
+ }
+ }
+
+ /**
+ * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
+ *
+ * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
+ * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
+ *
+ * WARNING: Increasing an account's balance using this function tends to be paired with an override of the
+ * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
+ * remain consistent with one another.
+ */
+ function _increaseBalance(address account, uint128 value) internal virtual {
+ ERC721Storage storage $ = _getERC721Storage();
+ unchecked {
+ $._balances[account] += value;
+ }
+ }
+
+ /**
+ * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
+ * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
+ *
+ * The `auth` argument is optional. If the value passed is non 0, then this function will check that
+ * `auth` is either the owner of the token, or approved to operate on the token (by the owner).
+ *
+ * Emits a {Transfer} event.
+ *
+ * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
+ */
+ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
+ ERC721Storage storage $ = _getERC721Storage();
+ address from = _ownerOf(tokenId);
+
+ // Perform (optional) operator check
+ if (auth != address(0)) {
+ _checkAuthorized(from, auth, tokenId);
+ }
+
+ // Execute the update
+ if (from != address(0)) {
+ // Clear approval. No need to re-authorize or emit the Approval event
+ _approve(address(0), tokenId, address(0), false);
+
+ unchecked {
+ $._balances[from] -= 1;
+ }
+ }
+
+ if (to != address(0)) {
+ unchecked {
+ $._balances[to] += 1;
+ }
+ }
+
+ $._owners[tokenId] = to;
+
+ emit Transfer(from, to, tokenId);
+
+ return from;
+ }
+
+ /**
+ * @dev Mints `tokenId` and transfers it to `to`.
+ *
+ * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
+ *
+ * Requirements:
+ *
+ * - `tokenId` must not exist.
+ * - `to` cannot be the zero address.
+ *
+ * Emits a {Transfer} event.
+ */
+ function _mint(address to, uint256 tokenId) internal {
+ if (to == address(0)) {
+ revert ERC721InvalidReceiver(address(0));
+ }
+ address previousOwner = _update(to, tokenId, address(0));
+ if (previousOwner != address(0)) {
+ revert ERC721InvalidSender(address(0));
+ }
+ }
+
+ /**
+ * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
+ *
+ * Requirements:
+ *
+ * - `tokenId` must not exist.
+ * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
+ *
+ * Emits a {Transfer} event.
+ */
+ function _safeMint(address to, uint256 tokenId) internal {
+ _safeMint(to, tokenId, "");
+ }
+
+ /**
+ * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
+ * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
+ */
+ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
+ _mint(to, tokenId);
+ ERC721Utils.checkOnERC721Received(_msgSender(), address(0), to, tokenId, data);
+ }
+
+ /**
+ * @dev Destroys `tokenId`.
+ * The approval is cleared when the token is burned.
+ * This is an internal function that does not check if the sender is authorized to operate on the token.
+ *
+ * Requirements:
+ *
+ * - `tokenId` must exist.
+ *
+ * Emits a {Transfer} event.
+ */
+ function _burn(uint256 tokenId) internal {
+ address previousOwner = _update(address(0), tokenId, address(0));
+ if (previousOwner == address(0)) {
+ revert ERC721NonexistentToken(tokenId);
+ }
+ }
+
+ /**
+ * @dev Transfers `tokenId` from `from` to `to`.
+ * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
+ *
+ * Requirements:
+ *
+ * - `to` cannot be the zero address.
+ * - `tokenId` token must be owned by `from`.
+ *
+ * Emits a {Transfer} event.
+ */
+ function _transfer(address from, address to, uint256 tokenId) internal {
+ if (to == address(0)) {
+ revert ERC721InvalidReceiver(address(0));
+ }
+ address previousOwner = _update(to, tokenId, address(0));
+ if (previousOwner == address(0)) {
+ revert ERC721NonexistentToken(tokenId);
+ } else if (previousOwner != from) {
+ revert ERC721IncorrectOwner(from, tokenId, previousOwner);
+ }
+ }
+
+ /**
+ * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
+ * are aware of the ERC-721 standard to prevent tokens from being forever locked.
+ *
+ * `data` is additional data, it has no specified format and it is sent in call to `to`.
+ *
+ * This internal function is like {safeTransferFrom} in the sense that it invokes
+ * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
+ * implement alternative mechanisms to perform token transfer, such as signature-based.
+ *
+ * Requirements:
+ *
+ * - `tokenId` token must exist and be owned by `from`.
+ * - `to` cannot be the zero address.
+ * - `from` cannot be the zero address.
+ * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
+ *
+ * Emits a {Transfer} event.
+ */
+ function _safeTransfer(address from, address to, uint256 tokenId) internal {
+ _safeTransfer(from, to, tokenId, "");
+ }
+
+ /**
+ * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
+ * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
+ */
+ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
+ _transfer(from, to, tokenId);
+ ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);
+ }
+
+ /**
+ * @dev Approve `to` to operate on `tokenId`
+ *
+ * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
+ * either the owner of the token, or approved to operate on all tokens held by this owner.
+ *
+ * Emits an {Approval} event.
+ *
+ * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
+ */
+ function _approve(address to, uint256 tokenId, address auth) internal {
+ _approve(to, tokenId, auth, true);
+ }
+
+ /**
+ * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
+ * emitted in the context of transfers.
+ */
+ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
+ ERC721Storage storage $ = _getERC721Storage();
+ // Avoid reading the owner unless necessary
+ if (emitEvent || auth != address(0)) {
+ address owner = _requireOwned(tokenId);
+
+ // We do not use _isAuthorized because single-token approvals should not be able to call approve
+ if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
+ revert ERC721InvalidApprover(auth);
+ }
+
+ if (emitEvent) {
+ emit Approval(owner, to, tokenId);
+ }
+ }
+
+ $._tokenApprovals[tokenId] = to;
+ }
+
+ /**
+ * @dev Approve `operator` to operate on all of `owner` tokens
+ *
+ * Requirements:
+ * - operator can't be the address zero.
+ *
+ * Emits an {ApprovalForAll} event.
+ */
+ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
+ ERC721Storage storage $ = _getERC721Storage();
+ if (owner == address(0)) {
+ revert ERC721InvalidApprover(address(0));
+ }
+ if (operator == address(0)) {
+ revert ERC721InvalidOperator(operator);
+ }
+ $._operatorApprovals[owner][operator] = approved;
+ emit ApprovalForAll(owner, operator, approved);
+ }
+
+ /**
+ * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
+ * Returns the owner.
+ *
+ * Overrides to ownership logic should be done to {_ownerOf}.
+ */
+ function _requireOwned(uint256 tokenId) internal view returns (address) {
+ address owner = _ownerOf(tokenId);
+ if (owner == address(0)) {
+ revert ERC721NonexistentToken(tokenId);
+ }
+ return owner;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol
new file mode 100644
index 0000000..0b1de20
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC721/extensions/ERC721Burnable.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC721Upgradeable} from "../ERC721Upgradeable.sol";
+import {ContextUpgradeable} from "../../../utils/ContextUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @title ERC-721 Burnable Token
+ * @dev ERC-721 Token that can be burned (destroyed).
+ */
+abstract contract ERC721BurnableUpgradeable is Initializable, ContextUpgradeable, ERC721Upgradeable {
+ function __ERC721Burnable_init() internal onlyInitializing {
+ }
+
+ function __ERC721Burnable_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Burns `tokenId`. See {ERC721-_burn}.
+ *
+ * Requirements:
+ *
+ * - The caller must own `tokenId` or be an approved operator.
+ */
+ function burn(uint256 tokenId) public virtual {
+ // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
+ // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
+ _update(address(0), tokenId, _msgSender());
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol
new file mode 100644
index 0000000..c6ec678
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol
@@ -0,0 +1,198 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC721/extensions/ERC721Consecutive.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC721Upgradeable} from "../ERC721Upgradeable.sol";
+import {IERC2309} from "@openzeppelin/contracts/interfaces/IERC2309.sol";
+import {BitMaps} from "@openzeppelin/contracts/utils/structs/BitMaps.sol";
+import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the ERC-2309 "Consecutive Transfer Extension" as defined in
+ * https://eips.ethereum.org/EIPS/eip-2309[ERC-2309].
+ *
+ * This extension allows the minting of large batches of tokens, during contract construction only. For upgradeable
+ * contracts this implies that batch minting is only available during proxy deployment, and not in subsequent upgrades.
+ * These batches are limited to 5000 tokens at a time by default to accommodate off-chain indexers.
+ *
+ * Using this extension removes the ability to mint single tokens during contract construction. This ability is
+ * regained after construction. During construction, only batch minting is allowed.
+ *
+ * IMPORTANT: This extension does not call the {_update} function for tokens minted in batch. Any logic added to this
+ * function through overrides will not be triggered when tokens are minted in batch. You may want to also override
+ * {_increaseBalance} or {_mintConsecutive} to account for these mints.
+ *
+ * IMPORTANT: When overriding {_mintConsecutive}, be careful about call ordering. {ownerOf} may return invalid
+ * values during the {_mintConsecutive} execution if the super call is not called first. To be safe, execute the
+ * super call before your custom logic.
+ */
+abstract contract ERC721ConsecutiveUpgradeable is Initializable, IERC2309, ERC721Upgradeable {
+ using BitMaps for BitMaps.BitMap;
+ using Checkpoints for Checkpoints.Trace160;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC721Consecutive
+ struct ERC721ConsecutiveStorage {
+ Checkpoints.Trace160 _sequentialOwnership;
+ BitMaps.BitMap _sequentialBurn;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC721Consecutive")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC721ConsecutiveStorageLocation = 0x24de1071a22e1e6f709b09cc0dadb696f919b85b456665cd36195df4bc89ff00;
+
+ function _getERC721ConsecutiveStorage() private pure returns (ERC721ConsecutiveStorage storage $) {
+ assembly {
+ $.slot := ERC721ConsecutiveStorageLocation
+ }
+ }
+
+ /**
+ * @dev Batch mint is restricted to the constructor.
+ * Any batch mint not emitting the {IERC721-Transfer} event outside of the constructor
+ * is non ERC-721 compliant.
+ */
+ error ERC721ForbiddenBatchMint();
+
+ /**
+ * @dev Exceeds the max amount of mints per batch.
+ */
+ error ERC721ExceededMaxBatchMint(uint256 batchSize, uint256 maxBatch);
+
+ /**
+ * @dev Individual minting is not allowed.
+ */
+ error ERC721ForbiddenMint();
+
+ /**
+ * @dev Batch burn is not supported.
+ */
+ error ERC721ForbiddenBatchBurn();
+
+ function __ERC721Consecutive_init() internal onlyInitializing {
+ }
+
+ function __ERC721Consecutive_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Maximum size of a batch of consecutive tokens. This is designed to limit stress on off-chain indexing
+ * services that have to record one entry per token, and have protections against "unreasonably large" batches of
+ * tokens.
+ *
+ * NOTE: Overriding the default value of 5000 will not cause on-chain issues, but may result in the asset not being
+ * correctly supported by off-chain indexing services (including marketplaces).
+ */
+ function _maxBatchSize() internal view virtual returns (uint96) {
+ return 5000;
+ }
+
+ /**
+ * @dev See {ERC721-_ownerOf}. Override that checks the sequential ownership structure for tokens that have
+ * been minted as part of a batch, and not yet transferred.
+ */
+ function _ownerOf(uint256 tokenId) internal view virtual override returns (address) {
+ ERC721ConsecutiveStorage storage $ = _getERC721ConsecutiveStorage();
+ address owner = super._ownerOf(tokenId);
+
+ // If token is owned by the core, or beyond consecutive range, return base value
+ if (owner != address(0) || tokenId > type(uint96).max || tokenId < _firstConsecutiveId()) {
+ return owner;
+ }
+
+ // Otherwise, check the token was not burned, and fetch ownership from the anchors
+ // Note: no need for safe cast, we know that tokenId <= type(uint96).max
+ return $._sequentialBurn.get(tokenId) ? address(0) : address($._sequentialOwnership.lowerLookup(uint96(tokenId)));
+ }
+
+ /**
+ * @dev Mint a batch of tokens of length `batchSize` for `to`. Returns the token id of the first token minted in the
+ * batch; if `batchSize` is 0, returns the number of consecutive ids minted so far.
+ *
+ * Requirements:
+ *
+ * - `batchSize` must not be greater than {_maxBatchSize}.
+ * - The function is called in the constructor of the contract (directly or indirectly).
+ *
+ * CAUTION: Does not emit a `Transfer` event. This is ERC-721 compliant as long as it is done inside of the
+ * constructor, which is enforced by this function.
+ *
+ * CAUTION: Does not invoke `onERC721Received` on the receiver.
+ *
+ * Emits a {IERC2309-ConsecutiveTransfer} event.
+ */
+ function _mintConsecutive(address to, uint96 batchSize) internal virtual returns (uint96) {
+ ERC721ConsecutiveStorage storage $ = _getERC721ConsecutiveStorage();
+ uint96 next = _nextConsecutiveId();
+
+ // minting a batch of size 0 is a no-op
+ if (batchSize > 0) {
+ if (address(this).code.length > 0) {
+ revert ERC721ForbiddenBatchMint();
+ }
+ if (to == address(0)) {
+ revert ERC721InvalidReceiver(address(0));
+ }
+
+ uint256 maxBatchSize = _maxBatchSize();
+ if (batchSize > maxBatchSize) {
+ revert ERC721ExceededMaxBatchMint(batchSize, maxBatchSize);
+ }
+
+ // push an ownership checkpoint & emit event
+ uint96 last = next + batchSize - 1;
+ $._sequentialOwnership.push(last, uint160(to));
+
+ // The invariant required by this function is preserved because the new sequentialOwnership checkpoint
+ // is attributing ownership of `batchSize` new tokens to account `to`.
+ _increaseBalance(to, batchSize);
+
+ emit ConsecutiveTransfer(next, last, address(0), to);
+ }
+
+ return next;
+ }
+
+ /**
+ * @dev See {ERC721-_update}. Override version that restricts normal minting to after construction.
+ *
+ * WARNING: Using {ERC721Consecutive} prevents minting during construction in favor of {_mintConsecutive}.
+ * After construction, {_mintConsecutive} is no longer available and minting through {_update} becomes available.
+ */
+ function _update(address to, uint256 tokenId, address auth) internal virtual override returns (address) {
+ ERC721ConsecutiveStorage storage $ = _getERC721ConsecutiveStorage();
+ address previousOwner = super._update(to, tokenId, auth);
+
+ // only mint after construction
+ if (previousOwner == address(0) && address(this).code.length == 0) {
+ revert ERC721ForbiddenMint();
+ }
+
+ // record burn
+ if (
+ to == address(0) && // if we burn
+ tokenId < _nextConsecutiveId() && // and the tokenId was minted in a batch
+ !$._sequentialBurn.get(tokenId) // and the token was never marked as burnt
+ ) {
+ $._sequentialBurn.set(tokenId);
+ }
+
+ return previousOwner;
+ }
+
+ /**
+ * @dev Used to offset the first token id in `_nextConsecutiveId`
+ */
+ function _firstConsecutiveId() internal view virtual returns (uint96) {
+ return 0;
+ }
+
+ /**
+ * @dev Returns the next tokenId to mint using {_mintConsecutive}. It will return {_firstConsecutiveId}
+ * if no consecutive tokenId has been minted before.
+ */
+ function _nextConsecutiveId() private view returns (uint96) {
+ ERC721ConsecutiveStorage storage $ = _getERC721ConsecutiveStorage();
+ (bool exists, uint96 latestId, ) = $._sequentialOwnership.latestCheckpoint();
+ return exists ? latestId + 1 : _firstConsecutiveId();
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol
new file mode 100644
index 0000000..51a015d
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC721/extensions/ERC721Enumerable.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC721Upgradeable} from "../ERC721Upgradeable.sol";
+import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev This implements an optional extension of {ERC721} defined in the ERC that adds enumerability
+ * of all the token ids in the contract as well as all token ids owned by each account.
+ *
+ * CAUTION: {ERC721} extensions that implement custom `balanceOf` logic, such as {ERC721Consecutive},
+ * interfere with enumerability and should not be used together with {ERC721Enumerable}.
+ */
+abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721Enumerable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC721Enumerable
+ struct ERC721EnumerableStorage {
+ mapping(address owner => mapping(uint256 index => uint256)) _ownedTokens;
+ mapping(uint256 tokenId => uint256) _ownedTokensIndex;
+
+ uint256[] _allTokens;
+ mapping(uint256 tokenId => uint256) _allTokensIndex;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC721Enumerable")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC721EnumerableStorageLocation = 0x645e039705490088daad89bae25049a34f4a9072d398537b1ab2425f24cbed00;
+
+ function _getERC721EnumerableStorage() private pure returns (ERC721EnumerableStorage storage $) {
+ assembly {
+ $.slot := ERC721EnumerableStorageLocation
+ }
+ }
+
+ /**
+ * @dev An `owner`'s token query was out of bounds for `index`.
+ *
+ * NOTE: The owner being `address(0)` indicates a global out of bounds index.
+ */
+ error ERC721OutOfBoundsIndex(address owner, uint256 index);
+
+ /**
+ * @dev Batch mint is not allowed.
+ */
+ error ERC721EnumerableForbiddenBatchMint();
+
+ function __ERC721Enumerable_init() internal onlyInitializing {
+ }
+
+ function __ERC721Enumerable_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721Upgradeable) returns (bool) {
+ return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /// @inheritdoc IERC721Enumerable
+ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) {
+ ERC721EnumerableStorage storage $ = _getERC721EnumerableStorage();
+ if (index >= balanceOf(owner)) {
+ revert ERC721OutOfBoundsIndex(owner, index);
+ }
+ return $._ownedTokens[owner][index];
+ }
+
+ /// @inheritdoc IERC721Enumerable
+ function totalSupply() public view virtual returns (uint256) {
+ ERC721EnumerableStorage storage $ = _getERC721EnumerableStorage();
+ return $._allTokens.length;
+ }
+
+ /// @inheritdoc IERC721Enumerable
+ function tokenByIndex(uint256 index) public view virtual returns (uint256) {
+ ERC721EnumerableStorage storage $ = _getERC721EnumerableStorage();
+ if (index >= totalSupply()) {
+ revert ERC721OutOfBoundsIndex(address(0), index);
+ }
+ return $._allTokens[index];
+ }
+
+ /// @inheritdoc ERC721Upgradeable
+ function _update(address to, uint256 tokenId, address auth) internal virtual override returns (address) {
+ address previousOwner = super._update(to, tokenId, auth);
+
+ if (previousOwner == address(0)) {
+ _addTokenToAllTokensEnumeration(tokenId);
+ } else if (previousOwner != to) {
+ _removeTokenFromOwnerEnumeration(previousOwner, tokenId);
+ }
+ if (to == address(0)) {
+ _removeTokenFromAllTokensEnumeration(tokenId);
+ } else if (previousOwner != to) {
+ _addTokenToOwnerEnumeration(to, tokenId);
+ }
+
+ return previousOwner;
+ }
+
+ /**
+ * @dev Private function to add a token to this extension's ownership-tracking data structures.
+ * @param to address representing the new owner of the given token ID
+ * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
+ */
+ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
+ ERC721EnumerableStorage storage $ = _getERC721EnumerableStorage();
+ uint256 length = balanceOf(to) - 1;
+ $._ownedTokens[to][length] = tokenId;
+ $._ownedTokensIndex[tokenId] = length;
+ }
+
+ /**
+ * @dev Private function to add a token to this extension's token tracking data structures.
+ * @param tokenId uint256 ID of the token to be added to the tokens list
+ */
+ function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
+ ERC721EnumerableStorage storage $ = _getERC721EnumerableStorage();
+ $._allTokensIndex[tokenId] = $._allTokens.length;
+ $._allTokens.push(tokenId);
+ }
+
+ /**
+ * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
+ * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
+ * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
+ * This has O(1) time complexity, but alters the order of the _ownedTokens array.
+ * @param from address representing the previous owner of the given token ID
+ * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
+ */
+ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
+ ERC721EnumerableStorage storage $ = _getERC721EnumerableStorage();
+ // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
+ // then delete the last slot (swap and pop).
+
+ uint256 lastTokenIndex = balanceOf(from);
+ uint256 tokenIndex = $._ownedTokensIndex[tokenId];
+
+ mapping(uint256 index => uint256) storage _ownedTokensByOwner = $._ownedTokens[from];
+
+ // When the token to delete is the last token, the swap operation is unnecessary
+ if (tokenIndex != lastTokenIndex) {
+ uint256 lastTokenId = _ownedTokensByOwner[lastTokenIndex];
+
+ _ownedTokensByOwner[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
+ $._ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
+ }
+
+ // This also deletes the contents at the last position of the array
+ delete $._ownedTokensIndex[tokenId];
+ delete _ownedTokensByOwner[lastTokenIndex];
+ }
+
+ /**
+ * @dev Private function to remove a token from this extension's token tracking data structures.
+ * This has O(1) time complexity, but alters the order of the _allTokens array.
+ * @param tokenId uint256 ID of the token to be removed from the tokens list
+ */
+ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
+ ERC721EnumerableStorage storage $ = _getERC721EnumerableStorage();
+ // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
+ // then delete the last slot (swap and pop).
+
+ uint256 lastTokenIndex = $._allTokens.length - 1;
+ uint256 tokenIndex = $._allTokensIndex[tokenId];
+
+ // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
+ // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
+ // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
+ uint256 lastTokenId = $._allTokens[lastTokenIndex];
+
+ $._allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
+ $._allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
+
+ // This also deletes the contents at the last position of the array
+ delete $._allTokensIndex[tokenId];
+ $._allTokens.pop();
+ }
+
+ /**
+ * See {ERC721-_increaseBalance}. We need to forbid batch minting because the enumeration
+ * extension does not support it.
+ */
+ function _increaseBalance(address account, uint128 amount) internal virtual override {
+ if (amount > 0) {
+ revert ERC721EnumerableForbiddenBatchMint();
+ }
+ super._increaseBalance(account, amount);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol
new file mode 100644
index 0000000..72981fe
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC721/extensions/ERC721Pausable.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC721Upgradeable} from "../ERC721Upgradeable.sol";
+import {PausableUpgradeable} from "../../../utils/PausableUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev ERC-721 token with pausable token transfers, minting and burning.
+ *
+ * Useful for scenarios such as preventing trades until the end of an evaluation
+ * period, or having an emergency switch for freezing all token transfers in the
+ * event of a large bug.
+ *
+ * IMPORTANT: This contract does not include public pause and unpause functions. In
+ * addition to inheriting this contract, you must define both functions, invoking the
+ * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate
+ * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will
+ * make the contract pause mechanism of the contract unreachable, and thus unusable.
+ */
+abstract contract ERC721PausableUpgradeable is Initializable, ERC721Upgradeable, PausableUpgradeable {
+ function __ERC721Pausable_init() internal onlyInitializing {
+ }
+
+ function __ERC721Pausable_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev See {ERC721-_update}.
+ *
+ * Requirements:
+ *
+ * - the contract must not be paused.
+ */
+ function _update(
+ address to,
+ uint256 tokenId,
+ address auth
+ ) internal virtual override whenNotPaused returns (address) {
+ return super._update(to, tokenId, auth);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721RoyaltyUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721RoyaltyUpgradeable.sol
new file mode 100644
index 0000000..7c0d9d1
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721RoyaltyUpgradeable.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC721/extensions/ERC721Royalty.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC721Upgradeable} from "../ERC721Upgradeable.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {ERC2981Upgradeable} from "../../common/ERC2981Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of ERC-721 with the ERC-2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
+ * information.
+ *
+ * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually
+ * for specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first.
+ *
+ * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
+ * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the ERC. Marketplaces are expected to
+ * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
+ */
+abstract contract ERC721RoyaltyUpgradeable is Initializable, ERC2981Upgradeable, ERC721Upgradeable {
+ function __ERC721Royalty_init() internal onlyInitializing {
+ }
+
+ function __ERC721Royalty_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable, ERC2981Upgradeable) returns (bool) {
+ return super.supportsInterface(interfaceId);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol
new file mode 100644
index 0000000..21bacf1
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC721/extensions/ERC721URIStorage.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC721Upgradeable} from "../ERC721Upgradeable.sol";
+import {IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
+import {IERC4906} from "@openzeppelin/contracts/interfaces/IERC4906.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev ERC-721 token with storage based token URI management.
+ */
+abstract contract ERC721URIStorageUpgradeable is Initializable, IERC4906, ERC721Upgradeable {
+ // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only
+ // defines events and does not include any external function.
+ bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC721URIStorage
+ struct ERC721URIStorageStorage {
+ // Optional mapping for token URIs
+ mapping(uint256 tokenId => string) _tokenURIs;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC721URIStorage")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC721URIStorageStorageLocation = 0x0542a41881ee128a365a727b282c86fa859579490b9bb45aab8503648c8e7900;
+
+ function _getERC721URIStorageStorage() private pure returns (ERC721URIStorageStorage storage $) {
+ assembly {
+ $.slot := ERC721URIStorageStorageLocation
+ }
+ }
+
+ function __ERC721URIStorage_init() internal onlyInitializing {
+ }
+
+ function __ERC721URIStorage_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable, IERC165) returns (bool) {
+ return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);
+ }
+
+ /// @inheritdoc IERC721Metadata
+ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
+ _requireOwned(tokenId);
+
+ string memory base = _baseURI();
+ string memory suffix = _suffixURI(tokenId);
+
+ // If there is no base URI, return the token URI.
+ if (bytes(base).length == 0) {
+ return suffix;
+ }
+ // If both are set, concatenate the baseURI and tokenURI (via string.concat).
+ if (bytes(suffix).length > 0) {
+ return string.concat(base, suffix);
+ }
+
+ return super.tokenURI(tokenId);
+ }
+
+ /**
+ * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
+ *
+ * Emits {IERC4906-MetadataUpdate}.
+ */
+ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
+ ERC721URIStorageStorage storage $ = _getERC721URIStorageStorage();
+ $._tokenURIs[tokenId] = _tokenURI;
+ emit MetadataUpdate(tokenId);
+ }
+
+ /**
+ * @dev Returns the suffix part of the tokenURI for `tokenId`.
+ */
+ function _suffixURI(uint256 tokenId) internal view virtual returns (string memory) {
+ ERC721URIStorageStorage storage $ = _getERC721URIStorageStorage();
+ return $._tokenURIs[tokenId];
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol
new file mode 100644
index 0000000..862f238
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC721/extensions/ERC721Votes.sol)
+
+pragma solidity ^0.8.24;
+
+import {ERC721Upgradeable} from "../ERC721Upgradeable.sol";
+import {VotesUpgradeable} from "../../../governance/utils/VotesUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of ERC-721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts
+ * as 1 vote unit.
+ *
+ * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost
+ * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of
+ * the votes in governance decisions, or they can delegate to themselves to be their own representative.
+ */
+abstract contract ERC721VotesUpgradeable is Initializable, ERC721Upgradeable, VotesUpgradeable {
+ function __ERC721Votes_init() internal onlyInitializing {
+ }
+
+ function __ERC721Votes_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev See {ERC721-_update}. Adjusts votes when tokens are transferred.
+ *
+ * Emits a {IVotes-DelegateVotesChanged} event.
+ */
+ function _update(address to, uint256 tokenId, address auth) internal virtual override returns (address) {
+ address previousOwner = super._update(to, tokenId, auth);
+
+ _transferVotingUnits(previousOwner, to, 1);
+
+ return previousOwner;
+ }
+
+ /**
+ * @dev Returns the balance of `account`.
+ *
+ * WARNING: Overriding this function will likely result in incorrect vote tracking.
+ */
+ function _getVotingUnits(address account) internal view virtual override returns (uint256) {
+ return balanceOf(account);
+ }
+
+ /**
+ * @dev See {ERC721-_increaseBalance}. We need that to account tokens that were minted in batch.
+ */
+ function _increaseBalance(address account, uint128 amount) internal virtual override {
+ super._increaseBalance(account, amount);
+ _transferVotingUnits(address(0), account, amount);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721WrapperUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721WrapperUpgradeable.sol
new file mode 100644
index 0000000..50697ca
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/ERC721/extensions/ERC721WrapperUpgradeable.sol
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC721/extensions/ERC721Wrapper.sol)
+
+pragma solidity ^0.8.24;
+
+import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
+import {ERC721Upgradeable} from "../ERC721Upgradeable.sol";
+import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of the ERC-721 token contract to support token wrapping.
+ *
+ * Users can deposit and withdraw an "underlying token" and receive a "wrapped token" with a matching tokenId. This is
+ * useful in conjunction with other modules. For example, combining this wrapping mechanism with {ERC721Votes} will allow
+ * the wrapping of an existing "basic" ERC-721 into a governance token.
+ */
+abstract contract ERC721WrapperUpgradeable is Initializable, ERC721Upgradeable, IERC721Receiver {
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC721Wrapper
+ struct ERC721WrapperStorage {
+ IERC721 _underlying;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC721Wrapper")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC721WrapperStorageLocation = 0xa27ade666fc2e768f0cfbad659dfd6a7039cae52f9274d2ab808f70dce364400;
+
+ function _getERC721WrapperStorage() private pure returns (ERC721WrapperStorage storage $) {
+ assembly {
+ $.slot := ERC721WrapperStorageLocation
+ }
+ }
+
+ /**
+ * @dev The received ERC-721 token couldn't be wrapped.
+ */
+ error ERC721UnsupportedToken(address token);
+
+ function __ERC721Wrapper_init(IERC721 underlyingToken) internal onlyInitializing {
+ __ERC721Wrapper_init_unchained(underlyingToken);
+ }
+
+ function __ERC721Wrapper_init_unchained(IERC721 underlyingToken) internal onlyInitializing {
+ ERC721WrapperStorage storage $ = _getERC721WrapperStorage();
+ $._underlying = underlyingToken;
+ }
+
+ /**
+ * @dev Allow a user to deposit underlying tokens and mint the corresponding tokenIds.
+ */
+ function depositFor(address account, uint256[] memory tokenIds) public virtual returns (bool) {
+ uint256 length = tokenIds.length;
+ for (uint256 i = 0; i < length; ++i) {
+ uint256 tokenId = tokenIds[i];
+
+ // This is an "unsafe" transfer that doesn't call any hook on the receiver. With underlying() being trusted
+ // (by design of this contract) and no other contracts expected to be called from there, we are safe.
+ // slither-disable-next-line reentrancy-no-eth
+ underlying().transferFrom(_msgSender(), address(this), tokenId); // forge-lint: disable-line(erc20-unchecked-transfer)
+ _safeMint(account, tokenId);
+ }
+
+ return true;
+ }
+
+ /**
+ * @dev Allow a user to burn wrapped tokens and withdraw the corresponding tokenIds of the underlying tokens.
+ */
+ function withdrawTo(address account, uint256[] memory tokenIds) public virtual returns (bool) {
+ uint256 length = tokenIds.length;
+ for (uint256 i = 0; i < length; ++i) {
+ uint256 tokenId = tokenIds[i];
+ // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
+ // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
+ _update(address(0), tokenId, _msgSender());
+ // Checks were already performed at this point, and there's no way to retake ownership or approval from
+ // the wrapped tokenId after this point, so it's safe to remove the reentrancy check for the next line.
+ // slither-disable-next-line reentrancy-no-eth
+ underlying().safeTransferFrom(address(this), account, tokenId);
+ }
+
+ return true;
+ }
+
+ /**
+ * @dev Overrides {IERC721Receiver-onERC721Received} to allow minting on direct ERC-721 transfers to
+ * this contract.
+ *
+ * In case there's data attached, it validates that the operator is this contract, so only trusted data
+ * is accepted from {depositFor}.
+ *
+ * WARNING: Doesn't work with unsafe transfers (eg. {IERC721-transferFrom}). Use {ERC721Wrapper-_recover}
+ * for recovering in that scenario.
+ */
+ function onERC721Received(address, address from, uint256 tokenId, bytes memory) public virtual returns (bytes4) {
+ if (address(underlying()) != _msgSender()) {
+ revert ERC721UnsupportedToken(_msgSender());
+ }
+ _safeMint(from, tokenId);
+ return IERC721Receiver.onERC721Received.selector;
+ }
+
+ /**
+ * @dev Mint a wrapped token to cover any underlyingToken that would have been transferred by mistake. Internal
+ * function that can be exposed with access control if desired.
+ */
+ function _recover(address account, uint256 tokenId) internal virtual returns (uint256) {
+ address owner = underlying().ownerOf(tokenId);
+ if (owner != address(this)) {
+ revert ERC721IncorrectOwner(address(this), tokenId, owner);
+ }
+ _safeMint(account, tokenId);
+ return tokenId;
+ }
+
+ /**
+ * @dev Returns the underlying token.
+ */
+ function underlying() public view virtual returns (IERC721) {
+ ERC721WrapperStorage storage $ = _getERC721WrapperStorage();
+ return $._underlying;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/token/common/ERC2981Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/token/common/ERC2981Upgradeable.sol
new file mode 100644
index 0000000..f3aed89
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/token/common/ERC2981Upgradeable.sol
@@ -0,0 +1,163 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (token/common/ERC2981.sol)
+
+pragma solidity ^0.8.20;
+
+import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol";
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {ERC165Upgradeable} from "../../utils/introspection/ERC165Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
+ *
+ * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
+ * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
+ *
+ * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
+ * fee is specified in basis points by default.
+ *
+ * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
+ * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the ERC. Marketplaces are expected to
+ * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
+ */
+abstract contract ERC2981Upgradeable is Initializable, IERC2981, ERC165Upgradeable {
+ struct RoyaltyInfo {
+ address receiver;
+ uint96 royaltyFraction;
+ }
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.ERC2981
+ struct ERC2981Storage {
+ RoyaltyInfo _defaultRoyaltyInfo;
+ mapping(uint256 tokenId => RoyaltyInfo) _tokenRoyaltyInfo;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC2981")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant ERC2981StorageLocation = 0xdaedc9ab023613a7caf35e703657e986ccfad7e3eb0af93a2853f8d65dd86b00;
+
+ function _getERC2981Storage() private pure returns (ERC2981Storage storage $) {
+ assembly {
+ $.slot := ERC2981StorageLocation
+ }
+ }
+
+ /**
+ * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1).
+ */
+ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator);
+
+ /**
+ * @dev The default royalty receiver is invalid.
+ */
+ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver);
+
+ /**
+ * @dev The royalty set for a specific `tokenId` is invalid (eg. (numerator / denominator) >= 1).
+ */
+ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator);
+
+ /**
+ * @dev The royalty receiver for `tokenId` is invalid.
+ */
+ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver);
+
+ function __ERC2981_init() internal onlyInitializing {
+ }
+
+ function __ERC2981_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165Upgradeable) returns (bool) {
+ return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
+ }
+
+ /// @inheritdoc IERC2981
+ function royaltyInfo(
+ uint256 tokenId,
+ uint256 salePrice
+ ) public view virtual returns (address receiver, uint256 amount) {
+ ERC2981Storage storage $ = _getERC2981Storage();
+ RoyaltyInfo storage _royaltyInfo = $._tokenRoyaltyInfo[tokenId];
+ address royaltyReceiver = _royaltyInfo.receiver;
+ uint96 royaltyFraction = _royaltyInfo.royaltyFraction;
+
+ if (royaltyReceiver == address(0)) {
+ royaltyReceiver = $._defaultRoyaltyInfo.receiver;
+ royaltyFraction = $._defaultRoyaltyInfo.royaltyFraction;
+ }
+
+ uint256 royaltyAmount = (salePrice * royaltyFraction) / _feeDenominator();
+
+ return (royaltyReceiver, royaltyAmount);
+ }
+
+ /**
+ * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
+ * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
+ * override.
+ */
+ function _feeDenominator() internal pure virtual returns (uint96) {
+ return 10000;
+ }
+
+ /**
+ * @dev Sets the royalty information that all ids in this contract will default to.
+ *
+ * Requirements:
+ *
+ * - `receiver` cannot be the zero address.
+ * - `feeNumerator` cannot be greater than the fee denominator.
+ */
+ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
+ ERC2981Storage storage $ = _getERC2981Storage();
+ uint256 denominator = _feeDenominator();
+ if (feeNumerator > denominator) {
+ // Royalty fee will exceed the sale price
+ revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator);
+ }
+ if (receiver == address(0)) {
+ revert ERC2981InvalidDefaultRoyaltyReceiver(address(0));
+ }
+
+ $._defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
+ }
+
+ /**
+ * @dev Removes default royalty information.
+ */
+ function _deleteDefaultRoyalty() internal virtual {
+ ERC2981Storage storage $ = _getERC2981Storage();
+ delete $._defaultRoyaltyInfo;
+ }
+
+ /**
+ * @dev Sets the royalty information for a specific token id, overriding the global default.
+ *
+ * Requirements:
+ *
+ * - `receiver` cannot be the zero address.
+ * - `feeNumerator` cannot be greater than the fee denominator.
+ */
+ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
+ ERC2981Storage storage $ = _getERC2981Storage();
+ uint256 denominator = _feeDenominator();
+ if (feeNumerator > denominator) {
+ // Royalty fee will exceed the sale price
+ revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator);
+ }
+ if (receiver == address(0)) {
+ revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0));
+ }
+
+ $._tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
+ }
+
+ /**
+ * @dev Resets royalty information for the token id back to the global default.
+ */
+ function _resetTokenRoyalty(uint256 tokenId) internal virtual {
+ ERC2981Storage storage $ = _getERC2981Storage();
+ delete $._tokenRoyaltyInfo[tokenId];
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/ContextUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/ContextUpgradeable.sol
new file mode 100644
index 0000000..d6a4a1f
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/ContextUpgradeable.sol
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
+
+pragma solidity ^0.8.20;
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Provides information about the current execution context, including the
+ * sender of the transaction and its data. While these are generally available
+ * via msg.sender and msg.data, they should not be accessed in such a direct
+ * manner, since when dealing with meta-transactions the account sending and
+ * paying for execution may not be the actual sender (as far as an application
+ * is concerned).
+ *
+ * This contract is only required for intermediate, library-like contracts.
+ */
+abstract contract ContextUpgradeable is Initializable {
+ function __Context_init() internal onlyInitializing {
+ }
+
+ function __Context_init_unchained() internal onlyInitializing {
+ }
+ function _msgSender() internal view virtual returns (address) {
+ return msg.sender;
+ }
+
+ function _msgData() internal view virtual returns (bytes calldata) {
+ return msg.data;
+ }
+
+ function _contextSuffixLength() internal view virtual returns (uint256) {
+ return 0;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/MulticallUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/MulticallUpgradeable.sol
new file mode 100644
index 0000000..dbdf3fb
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/MulticallUpgradeable.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (utils/Multicall.sol)
+
+pragma solidity ^0.8.20;
+
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {ContextUpgradeable} from "./ContextUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Provides a function to batch together multiple calls in a single external call.
+ *
+ * Consider any assumption about calldata validation performed by the sender may be violated if it's not especially
+ * careful about sending transactions invoking {multicall}. For example, a relay address that filters function
+ * selectors won't filter calls nested within a {multicall} operation.
+ *
+ * NOTE: Since 5.0.1 and 4.9.4, this contract identifies non-canonical contexts (i.e. `msg.sender` is not {Context-_msgSender}).
+ * If a non-canonical context is identified, the following self `delegatecall` appends the last bytes of `msg.data`
+ * to the subcall. This makes it safe to use with {ERC2771Context}. Contexts that don't affect the resolution of
+ * {Context-_msgSender} are not propagated to subcalls.
+ */
+abstract contract MulticallUpgradeable is Initializable, ContextUpgradeable {
+ function __Multicall_init() internal onlyInitializing {
+ }
+
+ function __Multicall_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Receives and executes a batch of function calls on this contract.
+ * @custom:oz-upgrades-unsafe-allow-reachable delegatecall
+ */
+ function multicall(bytes[] calldata data) public virtual returns (bytes[] memory results) {
+ bytes memory context = msg.sender == _msgSender()
+ ? new bytes(0)
+ : msg.data[msg.data.length - _contextSuffixLength():];
+
+ results = new bytes[](data.length);
+ for (uint256 i = 0; i < data.length; i++) {
+ results[i] = Address.functionDelegateCall(address(this), bytes.concat(data[i], context));
+ }
+ return results;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/NoncesKeyedUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/NoncesKeyedUpgradeable.sol
new file mode 100644
index 0000000..6181c0b
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/NoncesKeyedUpgradeable.sol
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.2.0) (utils/NoncesKeyed.sol)
+pragma solidity ^0.8.20;
+
+import {NoncesUpgradeable} from "./NoncesUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Alternative to {Nonces}, that supports key-ed nonces.
+ *
+ * Follows the https://eips.ethereum.org/EIPS/eip-4337#semi-abstracted-nonce-support[ERC-4337's semi-abstracted nonce system].
+ *
+ * NOTE: This contract inherits from {Nonces} and reuses its storage for the first nonce key (i.e. `0`). This
+ * makes upgrading from {Nonces} to {NoncesKeyed} safe when using their upgradeable versions (e.g. `NoncesKeyedUpgradeable`).
+ * Doing so will NOT reset the current state of nonces, avoiding replay attacks where a nonce is reused after the upgrade.
+ */
+abstract contract NoncesKeyedUpgradeable is Initializable, NoncesUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.NoncesKeyed
+ struct NoncesKeyedStorage {
+ mapping(address owner => mapping(uint192 key => uint64)) _nonces;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.NoncesKeyed")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant NoncesKeyedStorageLocation = 0x06e302b11020b9cca26edb75da0d4c952e2c49f7ac00d8954230e81bd5769c00;
+
+ function _getNoncesKeyedStorage() private pure returns (NoncesKeyedStorage storage $) {
+ assembly {
+ $.slot := NoncesKeyedStorageLocation
+ }
+ }
+
+ function __NoncesKeyed_init() internal onlyInitializing {
+ }
+
+ function __NoncesKeyed_init_unchained() internal onlyInitializing {
+ }
+ /// @dev Returns the next unused nonce for an address and key. Result contains the key prefix.
+ function nonces(address owner, uint192 key) public view virtual returns (uint256) {
+ NoncesKeyedStorage storage $ = _getNoncesKeyedStorage();
+ return key == 0 ? nonces(owner) : _pack(key, $._nonces[owner][key]);
+ }
+
+ /**
+ * @dev Consumes the next unused nonce for an address and key.
+ *
+ * Returns the current value without the key prefix. Consumed nonce is increased, so calling this function twice
+ * with the same arguments will return different (sequential) results.
+ */
+ function _useNonce(address owner, uint192 key) internal virtual returns (uint256) {
+ NoncesKeyedStorage storage $ = _getNoncesKeyedStorage();
+ // For each account, the nonce has an initial value of 0, can only be incremented by one, and cannot be
+ // decremented or reset. This guarantees that the nonce never overflows.
+ unchecked {
+ // It is important to do x++ and not ++x here.
+ return key == 0 ? _useNonce(owner) : _pack(key, $._nonces[owner][key]++);
+ }
+ }
+
+ /**
+ * @dev Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.
+ *
+ * This version takes the key and the nonce in a single uint256 parameter:
+ * - use the first 24 bytes for the key
+ * - use the last 8 bytes for the nonce
+ */
+ function _useCheckedNonce(address owner, uint256 keyNonce) internal virtual override {
+ (uint192 key, ) = _unpack(keyNonce);
+ if (key == 0) {
+ super._useCheckedNonce(owner, keyNonce);
+ } else {
+ uint256 current = _useNonce(owner, key);
+ if (keyNonce != current) revert InvalidAccountNonce(owner, current);
+ }
+ }
+
+ /**
+ * @dev Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.
+ *
+ * This version takes the key and the nonce as two different parameters.
+ */
+ function _useCheckedNonce(address owner, uint192 key, uint64 nonce) internal virtual {
+ _useCheckedNonce(owner, _pack(key, nonce));
+ }
+
+ /// @dev Pack key and nonce into a keyNonce
+ function _pack(uint192 key, uint64 nonce) private pure returns (uint256) {
+ return (uint256(key) << 64) | nonce;
+ }
+
+ /// @dev Unpack a keyNonce into its key and nonce components
+ function _unpack(uint256 keyNonce) private pure returns (uint192 key, uint64 nonce) {
+ return (uint192(keyNonce >> 64), uint64(keyNonce));
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/NoncesUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/NoncesUpgradeable.sol
new file mode 100644
index 0000000..a2924a6
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/NoncesUpgradeable.sol
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.0.0) (utils/Nonces.sol)
+pragma solidity ^0.8.20;
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Provides tracking nonces for addresses. Nonces will only increment.
+ */
+abstract contract NoncesUpgradeable is Initializable {
+ /**
+ * @dev The nonce used for an `account` is not the expected current nonce.
+ */
+ error InvalidAccountNonce(address account, uint256 currentNonce);
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.Nonces
+ struct NoncesStorage {
+ mapping(address account => uint256) _nonces;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Nonces")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant NoncesStorageLocation = 0x5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00;
+
+ function _getNoncesStorage() private pure returns (NoncesStorage storage $) {
+ assembly {
+ $.slot := NoncesStorageLocation
+ }
+ }
+
+ function __Nonces_init() internal onlyInitializing {
+ }
+
+ function __Nonces_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Returns the next unused nonce for an address.
+ */
+ function nonces(address owner) public view virtual returns (uint256) {
+ NoncesStorage storage $ = _getNoncesStorage();
+ return $._nonces[owner];
+ }
+
+ /**
+ * @dev Consumes a nonce.
+ *
+ * Returns the current value and increments nonce.
+ */
+ function _useNonce(address owner) internal virtual returns (uint256) {
+ NoncesStorage storage $ = _getNoncesStorage();
+ // For each account, the nonce has an initial value of 0, can only be incremented by one, and cannot be
+ // decremented or reset. This guarantees that the nonce never overflows.
+ unchecked {
+ // It is important to do x++ and not ++x here.
+ return $._nonces[owner]++;
+ }
+ }
+
+ /**
+ * @dev Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.
+ */
+ function _useCheckedNonce(address owner, uint256 nonce) internal virtual {
+ uint256 current = _useNonce(owner);
+ if (nonce != current) {
+ revert InvalidAccountNonce(owner, current);
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/PausableUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/PausableUpgradeable.sol
new file mode 100644
index 0000000..f3d904b
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/PausableUpgradeable.sol
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)
+
+pragma solidity ^0.8.20;
+
+import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Contract module which allows children to implement an emergency stop
+ * mechanism that can be triggered by an authorized account.
+ *
+ * This module is used through inheritance. It will make available the
+ * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
+ * the functions of your contract. Note that they will not be pausable by
+ * simply including this module, only once the modifiers are put in place.
+ */
+abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
+ /// @custom:storage-location erc7201:openzeppelin.storage.Pausable
+ struct PausableStorage {
+ bool _paused;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;
+
+ function _getPausableStorage() private pure returns (PausableStorage storage $) {
+ assembly {
+ $.slot := PausableStorageLocation
+ }
+ }
+
+ /**
+ * @dev Emitted when the pause is triggered by `account`.
+ */
+ event Paused(address account);
+
+ /**
+ * @dev Emitted when the pause is lifted by `account`.
+ */
+ event Unpaused(address account);
+
+ /**
+ * @dev The operation failed because the contract is paused.
+ */
+ error EnforcedPause();
+
+ /**
+ * @dev The operation failed because the contract is not paused.
+ */
+ error ExpectedPause();
+
+ /**
+ * @dev Modifier to make a function callable only when the contract is not paused.
+ *
+ * Requirements:
+ *
+ * - The contract must not be paused.
+ */
+ modifier whenNotPaused() {
+ _requireNotPaused();
+ _;
+ }
+
+ /**
+ * @dev Modifier to make a function callable only when the contract is paused.
+ *
+ * Requirements:
+ *
+ * - The contract must be paused.
+ */
+ modifier whenPaused() {
+ _requirePaused();
+ _;
+ }
+
+ function __Pausable_init() internal onlyInitializing {
+ }
+
+ function __Pausable_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Returns true if the contract is paused, and false otherwise.
+ */
+ function paused() public view virtual returns (bool) {
+ PausableStorage storage $ = _getPausableStorage();
+ return $._paused;
+ }
+
+ /**
+ * @dev Throws if the contract is paused.
+ */
+ function _requireNotPaused() internal view virtual {
+ if (paused()) {
+ revert EnforcedPause();
+ }
+ }
+
+ /**
+ * @dev Throws if the contract is not paused.
+ */
+ function _requirePaused() internal view virtual {
+ if (!paused()) {
+ revert ExpectedPause();
+ }
+ }
+
+ /**
+ * @dev Triggers stopped state.
+ *
+ * Requirements:
+ *
+ * - The contract must not be paused.
+ */
+ function _pause() internal virtual whenNotPaused {
+ PausableStorage storage $ = _getPausableStorage();
+ $._paused = true;
+ emit Paused(_msgSender());
+ }
+
+ /**
+ * @dev Returns to normal state.
+ *
+ * Requirements:
+ *
+ * - The contract must be paused.
+ */
+ function _unpause() internal virtual whenPaused {
+ PausableStorage storage $ = _getPausableStorage();
+ $._paused = false;
+ emit Unpaused(_msgSender());
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol
new file mode 100644
index 0000000..1ce5aec
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol
@@ -0,0 +1,170 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (utils/cryptography/EIP712.sol)
+
+pragma solidity ^0.8.24;
+
+import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
+import {IERC5267} from "@openzeppelin/contracts/interfaces/IERC5267.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.
+ *
+ * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose
+ * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract
+ * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to
+ * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.
+ *
+ * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
+ * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
+ * ({_hashTypedDataV4}).
+ *
+ * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
+ * the chain id to protect against replay attacks on an eventual fork of the chain.
+ *
+ * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
+ * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
+ *
+ * NOTE: The upgradeable version of this contract does not use an immutable cache and recomputes the domain separator
+ * each time {_domainSeparatorV4} is called. This is cheaper than accessing a cached version in cold storage.
+ */
+abstract contract EIP712Upgradeable is Initializable, IERC5267 {
+ bytes32 private constant TYPE_HASH =
+ keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.EIP712
+ struct EIP712Storage {
+ bytes32 _hashedName;
+ bytes32 _hashedVersion;
+
+ string _name;
+ string _version;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.EIP712")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;
+
+ function _getEIP712Storage() private pure returns (EIP712Storage storage $) {
+ assembly {
+ $.slot := EIP712StorageLocation
+ }
+ }
+
+ /**
+ * @dev Initializes the domain separator and parameter caches.
+ *
+ * The meaning of `name` and `version` is specified in
+ * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:
+ *
+ * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
+ * - `version`: the current major version of the signing domain.
+ *
+ * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
+ * contract upgrade].
+ */
+ function __EIP712_init(string memory name, string memory version) internal onlyInitializing {
+ __EIP712_init_unchained(name, version);
+ }
+
+ function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {
+ EIP712Storage storage $ = _getEIP712Storage();
+ $._name = name;
+ $._version = version;
+ }
+
+ /**
+ * @dev Returns the domain separator for the current chain.
+ */
+ function _domainSeparatorV4() internal view returns (bytes32) {
+ return _buildDomainSeparator();
+ }
+
+ function _buildDomainSeparator() private view returns (bytes32) {
+ return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));
+ }
+
+ /**
+ * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
+ * function returns the hash of the fully encoded EIP712 message for this domain.
+ *
+ * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
+ *
+ * ```solidity
+ * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
+ * keccak256("Mail(address to,string contents)"),
+ * mailTo,
+ * keccak256(bytes(mailContents))
+ * )));
+ * address signer = ECDSA.recover(digest, signature);
+ * ```
+ */
+ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
+ return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);
+ }
+
+ /// @inheritdoc IERC5267
+ function eip712Domain()
+ public
+ view
+ virtual
+ returns (
+ bytes1 fields,
+ string memory name,
+ string memory version,
+ uint256 chainId,
+ address verifyingContract,
+ bytes32 salt,
+ uint256[] memory extensions
+ )
+ {
+ return (
+ hex"0f", // 01111
+ _EIP712Name(),
+ _EIP712Version(),
+ block.chainid,
+ address(this),
+ bytes32(0),
+ new uint256[](0)
+ );
+ }
+
+ /**
+ * @dev The name parameter for the EIP712 domain.
+ *
+ * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
+ * are a concern.
+ */
+ function _EIP712Name() internal view virtual returns (string memory) {
+ EIP712Storage storage $ = _getEIP712Storage();
+ return $._name;
+ }
+
+ /**
+ * @dev The version parameter for the EIP712 domain.
+ *
+ * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
+ * are a concern.
+ */
+ function _EIP712Version() internal view virtual returns (string memory) {
+ EIP712Storage storage $ = _getEIP712Storage();
+ return $._version;
+ }
+
+ /**
+ * @dev The hash of the name parameter for the EIP712 domain.
+ *
+ * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.
+ */
+ function _EIP712NameHash() internal view returns (bytes32) {
+ return keccak256(bytes(_EIP712Name()));
+ }
+
+ /**
+ * @dev The hash of the version parameter for the EIP712 domain.
+ *
+ * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.
+ */
+ function _EIP712VersionHash() internal view returns (bytes32) {
+ return keccak256(bytes(_EIP712Version()));
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol
new file mode 100644
index 0000000..42be339
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol
@@ -0,0 +1,284 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (utils/cryptography/signers/MultiSignerERC7913.sol)
+
+pragma solidity ^0.8.26;
+
+import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";
+import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
+import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of {AbstractSigner} using multiple ERC-7913 signers with a threshold-based
+ * signature verification system.
+ *
+ * This contract allows managing a set of authorized signers and requires a minimum number of
+ * signatures (threshold) to approve operations. It uses ERC-7913 formatted signers, which
+ * makes it natively compatible with ECDSA and ERC-1271 signers.
+ *
+ * Example of usage:
+ *
+ * ```solidity
+ * contract MyMultiSignerAccount is Account, MultiSignerERC7913, Initializable {
+ * function initialize(bytes[] memory signers, uint64 threshold) public initializer {
+ * _addSigners(signers);
+ * _setThreshold(threshold);
+ * }
+ *
+ * function addSigners(bytes[] memory signers) public onlyEntryPointOrSelf {
+ * _addSigners(signers);
+ * }
+ *
+ * function removeSigners(bytes[] memory signers) public onlyEntryPointOrSelf {
+ * _removeSigners(signers);
+ * }
+ *
+ * function setThreshold(uint64 threshold) public onlyEntryPointOrSelf {
+ * _setThreshold(threshold);
+ * }
+ * }
+ * ```
+ *
+ * IMPORTANT: Failing to properly initialize the signers and threshold either during construction
+ * (if used standalone) or during initialization (if used as a clone) may leave the contract
+ * either front-runnable or unusable.
+ */
+abstract contract MultiSignerERC7913Upgradeable is Initializable, AbstractSigner {
+ using EnumerableSet for EnumerableSet.BytesSet;
+ using SignatureChecker for *;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.MultiSignerERC7913
+ struct MultiSignerERC7913Storage {
+ EnumerableSet.BytesSet _signers;
+ uint64 _threshold;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.MultiSignerERC7913")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant MultiSignerERC7913StorageLocation = 0xdfe169305a533e288e0557da8d289146d3cc75fa6e04c87599b048a60a4e5600;
+
+ function _getMultiSignerERC7913Storage() private pure returns (MultiSignerERC7913Storage storage $) {
+ assembly {
+ $.slot := MultiSignerERC7913StorageLocation
+ }
+ }
+
+ /// @dev Emitted when a signer is added.
+ event ERC7913SignerAdded(bytes indexed signers);
+
+ /// @dev Emitted when a signers is removed.
+ event ERC7913SignerRemoved(bytes indexed signers);
+
+ /// @dev Emitted when the threshold is updated.
+ event ERC7913ThresholdSet(uint64 threshold);
+
+ /// @dev The `signer` already exists.
+ error MultiSignerERC7913AlreadyExists(bytes signer);
+
+ /// @dev The `signer` does not exist.
+ error MultiSignerERC7913NonexistentSigner(bytes signer);
+
+ /// @dev The `signer` is less than 20 bytes long.
+ error MultiSignerERC7913InvalidSigner(bytes signer);
+
+ /// @dev The `threshold` is zero.
+ error MultiSignerERC7913ZeroThreshold();
+
+ /// @dev The `threshold` is unreachable given the number of `signers`.
+ error MultiSignerERC7913UnreachableThreshold(uint64 signers, uint64 threshold);
+
+ function __MultiSignerERC7913_init(bytes[] memory signers_, uint64 threshold_) internal onlyInitializing {
+ __MultiSignerERC7913_init_unchained(signers_, threshold_);
+ }
+
+ function __MultiSignerERC7913_init_unchained(bytes[] memory signers_, uint64 threshold_) internal onlyInitializing {
+ _addSigners(signers_);
+ _setThreshold(threshold_);
+ }
+
+ /**
+ * @dev Returns a slice of the set of authorized signers.
+ *
+ * Using `start = 0` and `end = type(uint64).max` will return the entire set of signers.
+ *
+ * WARNING: Depending on the `start` and `end`, this operation can copy a large amount of data to memory, which
+ * can be expensive. This is designed for view accessors queried without gas fees. Using it in state-changing
+ * functions may become uncallable if the slice grows too large.
+ */
+ function getSigners(uint64 start, uint64 end) public view virtual returns (bytes[] memory) {
+ MultiSignerERC7913Storage storage $ = _getMultiSignerERC7913Storage();
+ return $._signers.values(start, end);
+ }
+
+ /// @dev Returns the number of authorized signers
+ function getSignerCount() public view virtual returns (uint256) {
+ MultiSignerERC7913Storage storage $ = _getMultiSignerERC7913Storage();
+ return $._signers.length();
+ }
+
+ /// @dev Returns whether the `signer` is an authorized signer.
+ function isSigner(bytes memory signer) public view virtual returns (bool) {
+ MultiSignerERC7913Storage storage $ = _getMultiSignerERC7913Storage();
+ return $._signers.contains(signer);
+ }
+
+ /// @dev Returns the minimum number of signers required to approve a multisignature operation.
+ function threshold() public view virtual returns (uint64) {
+ MultiSignerERC7913Storage storage $ = _getMultiSignerERC7913Storage();
+ return $._threshold;
+ }
+
+ /**
+ * @dev Adds the `newSigners` to those allowed to sign on behalf of this contract.
+ * Internal version without access control.
+ *
+ * Requirements:
+ *
+ * * Each of `newSigners` must be at least 20 bytes long. Reverts with {MultiSignerERC7913InvalidSigner} if not.
+ * * Each of `newSigners` must not be authorized. See {isSigner}. Reverts with {MultiSignerERC7913AlreadyExists} if so.
+ *
+ * NOTE: This function does not validate that signers are controlled or represent appropriate entities. Integrators
+ * must ensure signers are properly validated before adding them. Problematic signers can compromise
+ * the multisig's security or functionality. Examples include uncontrolled addresses (e.g., `address(0)`),
+ * the account's own address (which may cause recursive validation loops), or contracts that may unintentionally
+ * allow arbitrary validation (e.g. using the identity precompile at `address(0x04)`, which would return the
+ * ERC-1271 magic value for any `isValidSignature` call).
+ */
+ function _addSigners(bytes[] memory newSigners) internal virtual {
+ MultiSignerERC7913Storage storage $ = _getMultiSignerERC7913Storage();
+ for (uint256 i = 0; i < newSigners.length; ++i) {
+ bytes memory signer = newSigners[i];
+ require(signer.length >= 20, MultiSignerERC7913InvalidSigner(signer));
+ require($._signers.add(signer), MultiSignerERC7913AlreadyExists(signer));
+ emit ERC7913SignerAdded(signer);
+ }
+ }
+
+ /**
+ * @dev Removes the `oldSigners` from the authorized signers. Internal version without access control.
+ *
+ * Requirements:
+ *
+ * * Each of `oldSigners` must be authorized. See {isSigner}. Otherwise {MultiSignerERC7913NonexistentSigner} is thrown.
+ * * See {_validateReachableThreshold} for the threshold validation.
+ */
+ function _removeSigners(bytes[] memory oldSigners) internal virtual {
+ MultiSignerERC7913Storage storage $ = _getMultiSignerERC7913Storage();
+ for (uint256 i = 0; i < oldSigners.length; ++i) {
+ bytes memory signer = oldSigners[i];
+ require($._signers.remove(signer), MultiSignerERC7913NonexistentSigner(signer));
+ emit ERC7913SignerRemoved(signer);
+ }
+ _validateReachableThreshold();
+ }
+
+ /**
+ * @dev Sets the signatures `threshold` required to approve a multisignature operation.
+ * Internal version without access control.
+ *
+ * Requirements:
+ *
+ * * See {_validateReachableThreshold} for the threshold validation.
+ */
+ function _setThreshold(uint64 newThreshold) internal virtual {
+ MultiSignerERC7913Storage storage $ = _getMultiSignerERC7913Storage();
+ require(newThreshold > 0, MultiSignerERC7913ZeroThreshold());
+ $._threshold = newThreshold;
+ _validateReachableThreshold();
+ emit ERC7913ThresholdSet(newThreshold);
+ }
+
+ /**
+ * @dev Validates the current threshold is reachable.
+ *
+ * Requirements:
+ *
+ * * The {getSignerCount} must be greater or equal than to the {threshold}. Throws
+ * {MultiSignerERC7913UnreachableThreshold} if not.
+ */
+ function _validateReachableThreshold() internal view virtual {
+ MultiSignerERC7913Storage storage $ = _getMultiSignerERC7913Storage();
+ uint256 signersLength = $._signers.length();
+ uint64 currentThreshold = threshold();
+ require(
+ signersLength >= currentThreshold,
+ MultiSignerERC7913UnreachableThreshold(
+ uint64(signersLength), // Safe cast. Economically impossible to overflow.
+ currentThreshold
+ )
+ );
+ }
+
+ /**
+ * @dev Decodes, validates the signature and checks the signers are authorized.
+ * See {_validateSignatures} and {_validateThreshold} for more details.
+ *
+ * Example of signature encoding:
+ *
+ * ```solidity
+ * // Encode signers (verifier || key)
+ * bytes memory signer1 = abi.encodePacked(verifier1, key1);
+ * bytes memory signer2 = abi.encodePacked(verifier2, key2);
+ *
+ * // Order signers by their id
+ * if (keccak256(signer1) > keccak256(signer2)) {
+ * (signer1, signer2) = (signer2, signer1);
+ * (signature1, signature2) = (signature2, signature1);
+ * }
+ *
+ * // Assign ordered signers and signatures
+ * bytes[] memory signers = new bytes[](2);
+ * bytes[] memory signatures = new bytes[](2);
+ * signers[0] = signer1;
+ * signatures[0] = signature1;
+ * signers[1] = signer2;
+ * signatures[1] = signature2;
+ *
+ * // Encode the multi signature
+ * bytes memory signature = abi.encode(signers, signatures);
+ * ```
+ *
+ * Requirements:
+ *
+ * * The `signature` must be encoded as `abi.encode(signers, signatures)`.
+ */
+ function _rawSignatureValidation(
+ bytes32 hash,
+ bytes calldata signature
+ ) internal view virtual override returns (bool) {
+ if (signature.length == 0) return false; // For ERC-7739 compatibility
+ (bytes[] memory signers, bytes[] memory signatures) = abi.decode(signature, (bytes[], bytes[]));
+ return _validateThreshold(signers) && _validateSignatures(hash, signers, signatures);
+ }
+
+ /**
+ * @dev Validates the signatures using the signers and their corresponding signatures.
+ * Returns whether the signers are authorized and the signatures are valid for the given hash.
+ *
+ * IMPORTANT: Sorting the signers by their `keccak256` hash will improve the gas efficiency of this function.
+ * See {SignatureChecker-areValidSignaturesNow-bytes32-bytes[]-bytes[]} for more details.
+ *
+ * Requirements:
+ *
+ * * The `signatures` and `signers` arrays must be equal in length. Returns false otherwise.
+ */
+ function _validateSignatures(
+ bytes32 hash,
+ bytes[] memory signers,
+ bytes[] memory signatures
+ ) internal view virtual returns (bool valid) {
+ for (uint256 i = 0; i < signers.length; ++i) {
+ if (!isSigner(signers[i])) {
+ return false;
+ }
+ }
+ return hash.areValidSignaturesNow(signers, signatures);
+ }
+
+ /**
+ * @dev Validates that the number of signers meets the {threshold} requirement.
+ * Assumes the signers were already validated. See {_validateSignatures} for more details.
+ */
+ function _validateThreshold(bytes[] memory validatingSigners) internal view virtual returns (bool) {
+ return validatingSigners.length >= threshold();
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol
new file mode 100644
index 0000000..a505327
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol
@@ -0,0 +1,230 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (utils/cryptography/signers/MultiSignerERC7913Weighted.sol)
+
+pragma solidity ^0.8.26;
+
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {MultiSignerERC7913Upgradeable} from "./MultiSignerERC7913Upgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Extension of {MultiSignerERC7913} that supports weighted signatures.
+ *
+ * This contract allows assigning different weights to each signer, enabling more
+ * flexible governance schemes. For example, some signers could have higher weight
+ * than others, allowing for weighted voting or prioritized authorization.
+ *
+ * Example of usage:
+ *
+ * ```solidity
+ * contract MyWeightedMultiSignerAccount is Account, MultiSignerERC7913Weighted, Initializable {
+ * function initialize(bytes[] memory signers, uint64[] memory weights, uint64 threshold) public initializer {
+ * _addSigners(signers);
+ * _setSignerWeights(signers, weights);
+ * _setThreshold(threshold);
+ * }
+ *
+ * function addSigners(bytes[] memory signers) public onlyEntryPointOrSelf {
+ * _addSigners(signers);
+ * }
+ *
+ * function removeSigners(bytes[] memory signers) public onlyEntryPointOrSelf {
+ * _removeSigners(signers);
+ * }
+ *
+ * function setThreshold(uint64 threshold) public onlyEntryPointOrSelf {
+ * _setThreshold(threshold);
+ * }
+ *
+ * function setSignerWeights(bytes[] memory signers, uint64[] memory weights) public onlyEntryPointOrSelf {
+ * _setSignerWeights(signers, weights);
+ * }
+ * }
+ * ```
+ *
+ * IMPORTANT: When setting a threshold value, ensure it matches the scale used for signer weights.
+ * For example, if signers have weights like 1, 2, or 3, then a threshold of 4 would require at
+ * least two signers (e.g., one with weight 1 and one with weight 3). See {signerWeight}.
+ */
+abstract contract MultiSignerERC7913WeightedUpgradeable is Initializable, MultiSignerERC7913Upgradeable {
+ using SafeCast for *;
+
+ /// @custom:storage-location erc7201:openzeppelin.storage.MultiSignerERC7913Weighted
+ struct MultiSignerERC7913WeightedStorage {
+ // Sum of all the extra weights of all signers. Storage packed with `MultiSignerERC7913._threshold`
+ uint64 _totalExtraWeight;
+
+ // Mapping from signer to extraWeight (in addition to all authorized signers having weight 1)
+ mapping(bytes signer => uint64) _extraWeights;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.MultiSignerERC7913Weighted")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant MultiSignerERC7913WeightedStorageLocation = 0x5ec62f110612a7ff5e720b9a2f4970583e308ad11d9cde77cb7db3ea251b1f00;
+
+ function _getMultiSignerERC7913WeightedStorage() private pure returns (MultiSignerERC7913WeightedStorage storage $) {
+ assembly {
+ $.slot := MultiSignerERC7913WeightedStorageLocation
+ }
+ }
+
+ /**
+ * @dev Emitted when a signer's weight is changed.
+ *
+ * NOTE: Not emitted in {_addSigners} or {_removeSigners}. Indexers must rely on {ERC7913SignerAdded}
+ * and {ERC7913SignerRemoved} to index a default weight of 1. See {signerWeight}.
+ */
+ event ERC7913SignerWeightChanged(bytes indexed signer, uint64 weight);
+
+ /// @dev Thrown when a signer's weight is invalid.
+ error MultiSignerERC7913WeightedInvalidWeight(bytes signer, uint64 weight);
+
+ /// @dev Thrown when the arrays lengths don't match. See {_setSignerWeights}.
+ error MultiSignerERC7913WeightedMismatchedLength();
+
+ function __MultiSignerERC7913Weighted_init(bytes[] memory signers_, uint64[] memory weights_, uint64 threshold_) internal onlyInitializing {
+ __MultiSignerERC7913_init_unchained(signers_, 1);
+ __MultiSignerERC7913Weighted_init_unchained(signers_, weights_, threshold_);
+ }
+
+ function __MultiSignerERC7913Weighted_init_unchained(bytes[] memory signers_, uint64[] memory weights_, uint64 threshold_) internal onlyInitializing {
+ _setSignerWeights(signers_, weights_);
+ _setThreshold(threshold_);
+ }
+
+ /// @dev Gets the weight of a signer. Returns 0 if the signer is not authorized.
+ function signerWeight(bytes memory signer) public view virtual returns (uint64) {
+ MultiSignerERC7913WeightedStorage storage $ = _getMultiSignerERC7913WeightedStorage();
+ unchecked {
+ // Safe cast, _setSignerWeights guarantees 1+_extraWeights is a uint64
+ return uint64(isSigner(signer).toUint() * (1 + $._extraWeights[signer]));
+ }
+ }
+
+ /// @dev Gets the total weight of all signers.
+ function totalWeight() public view virtual returns (uint64) {
+ MultiSignerERC7913WeightedStorage storage $ = _getMultiSignerERC7913WeightedStorage();
+ return (getSignerCount() + $._totalExtraWeight).toUint64();
+ }
+
+ /**
+ * @dev Sets weights for multiple signers at once. Internal version without access control.
+ *
+ * Requirements:
+ *
+ * * `signers` and `weights` arrays must have the same length. Reverts with {MultiSignerERC7913WeightedMismatchedLength} on mismatch.
+ * * Each signer must exist in the set of authorized signers. Otherwise reverts with {MultiSignerERC7913NonexistentSigner}
+ * * Each weight must be greater than 0. Otherwise reverts with {MultiSignerERC7913WeightedInvalidWeight}
+ * * See {_validateReachableThreshold} for the threshold validation.
+ *
+ * Emits {ERC7913SignerWeightChanged} for each signer.
+ */
+ function _setSignerWeights(bytes[] memory signers, uint64[] memory weights) internal virtual {
+ MultiSignerERC7913WeightedStorage storage $ = _getMultiSignerERC7913WeightedStorage();
+ require(signers.length == weights.length, MultiSignerERC7913WeightedMismatchedLength());
+
+ uint256 extraWeightAdded = 0;
+ uint256 extraWeightRemoved = 0;
+ for (uint256 i = 0; i < signers.length; ++i) {
+ bytes memory signer = signers[i];
+ require(isSigner(signer), MultiSignerERC7913NonexistentSigner(signer));
+
+ uint64 weight = weights[i];
+ require(weight > 0, MultiSignerERC7913WeightedInvalidWeight(signer, weight));
+
+ unchecked {
+ uint64 oldExtraWeight = $._extraWeights[signer];
+ uint64 newExtraWeight = weight - 1;
+
+ if (oldExtraWeight != newExtraWeight) {
+ // Overflow impossible: weight values are bounded by uint64 and economic constraints
+ extraWeightRemoved += oldExtraWeight;
+ extraWeightAdded += $._extraWeights[signer] = newExtraWeight;
+ emit ERC7913SignerWeightChanged(signer, weight);
+ }
+ }
+ }
+ unchecked {
+ // Safe from underflow: `extraWeightRemoved` is bounded by `_totalExtraWeight` by construction
+ // and weight values are bounded by uint64 and economic constraints
+ $._totalExtraWeight = (uint256($._totalExtraWeight) + extraWeightAdded - extraWeightRemoved).toUint64();
+ }
+ _validateReachableThreshold();
+ }
+
+ /**
+ * @dev See {MultiSignerERC7913-_addSigners}.
+ *
+ * In cases where {totalWeight} is almost `type(uint64).max` (due to a large `_totalExtraWeight`), adding new
+ * signers could cause the {totalWeight} computation to overflow. Adding a {totalWeight} calls after the new
+ * signers are added ensures no such overflow happens.
+ */
+ function _addSigners(bytes[] memory newSigners) internal virtual override {
+ super._addSigners(newSigners);
+
+ // This will revert if the new signers cause an overflow
+ _validateReachableThreshold();
+ }
+
+ /**
+ * @dev See {MultiSignerERC7913-_removeSigners}.
+ *
+ * Just like {_addSigners}, this function does not emit {ERC7913SignerWeightChanged} events. The
+ * {ERC7913SignerRemoved} event emitted by {MultiSignerERC7913-_removeSigners} is enough to track weights here.
+ */
+ function _removeSigners(bytes[] memory signers) internal virtual override {
+ MultiSignerERC7913WeightedStorage storage $ = _getMultiSignerERC7913WeightedStorage();
+ // Clean up weights for removed signers
+ //
+ // The `extraWeightRemoved` is bounded by `_totalExtraWeight`. The `super._removeSigners` function will revert
+ // if the signers array contains any duplicates, ensuring each signer's weight is only counted once. Since
+ // `_totalExtraWeight` is stored as a `uint64`, the final subtraction operation is also safe.
+ unchecked {
+ uint64 extraWeightRemoved = 0;
+ for (uint256 i = 0; i < signers.length; ++i) {
+ bytes memory signer = signers[i];
+
+ extraWeightRemoved += $._extraWeights[signer];
+ delete $._extraWeights[signer];
+ }
+ $._totalExtraWeight -= extraWeightRemoved;
+ }
+ super._removeSigners(signers);
+ }
+
+ /**
+ * @dev Sets the threshold for the multisignature operation. Internal version without access control.
+ *
+ * Requirements:
+ *
+ * * The {totalWeight} must be `>=` the {threshold}. Otherwise reverts with {MultiSignerERC7913UnreachableThreshold}
+ *
+ * NOTE: This function intentionally does not call `super._validateReachableThreshold` because the base implementation
+ * assumes each signer has a weight of 1, which is a subset of this weighted implementation. Consider that multiple
+ * implementations of this function may exist in the contract, so important side effects may be missed
+ * depending on the linearization order.
+ */
+ function _validateReachableThreshold() internal view virtual override {
+ uint64 weight = totalWeight();
+ uint64 currentThreshold = threshold();
+ require(weight >= currentThreshold, MultiSignerERC7913UnreachableThreshold(weight, currentThreshold));
+ }
+
+ /**
+ * @dev Validates that the total weight of signers meets the threshold requirement.
+ *
+ * NOTE: This function intentionally does not call `super._validateThreshold` because the base implementation
+ * assumes each signer has a weight of 1, which is a subset of this weighted implementation. Consider that multiple
+ * implementations of this function may exist in the contract, so important side effects may be missed
+ * depending on the linearization order.
+ */
+ function _validateThreshold(bytes[] memory signers) internal view virtual override returns (bool) {
+ unchecked {
+ uint64 weight = 0;
+ for (uint256 i = 0; i < signers.length; ++i) {
+ // Overflow impossible: weight values are bounded by uint64 and economic constraints
+ weight += signerWeight(signers[i]);
+ }
+ return weight >= threshold();
+ }
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol
new file mode 100644
index 0000000..dd8a625
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol
@@ -0,0 +1,75 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (utils/cryptography/signers/SignerECDSA.sol)
+
+pragma solidity ^0.8.20;
+
+import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";
+import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of {AbstractSigner} using xref:api:utils/cryptography#ECDSA[ECDSA] signatures.
+ *
+ * For {Account} usage, a {_setSigner} function is provided to set the {signer} address.
+ * Doing so is easier for a factory, who is likely to use initializable clones of this contract.
+ *
+ * Example of usage:
+ *
+ * ```solidity
+ * contract MyAccountECDSA is Account, SignerECDSA, Initializable {
+ * function initialize(address signerAddr) public initializer {
+ * _setSigner(signerAddr);
+ * }
+ * }
+ * ```
+ *
+ * IMPORTANT: Failing to call {_setSigner} either during construction (if used standalone)
+ * or during initialization (if used as a clone) may leave the signer either front-runnable or unusable.
+ */
+abstract contract SignerECDSAUpgradeable is Initializable, AbstractSigner {
+ /// @custom:storage-location erc7201:openzeppelin.storage.SignerECDSA
+ struct SignerECDSAStorage {
+ address _signer;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.SignerECDSA")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant SignerECDSAStorageLocation = 0x21a2a8bb424898f7a6033d112ec6057811f27c903c45eccf7ad7cefcbbc0d200;
+
+ function _getSignerECDSAStorage() private pure returns (SignerECDSAStorage storage $) {
+ assembly {
+ $.slot := SignerECDSAStorageLocation
+ }
+ }
+
+ function __SignerECDSA_init(address signerAddr) internal onlyInitializing {
+ __SignerECDSA_init_unchained(signerAddr);
+ }
+
+ function __SignerECDSA_init_unchained(address signerAddr) internal onlyInitializing {
+ _setSigner(signerAddr);
+ }
+
+ /**
+ * @dev Sets the signer with the address of the native signer. This function should be called during construction
+ * or through an initializer.
+ */
+ function _setSigner(address signerAddr) internal {
+ SignerECDSAStorage storage $ = _getSignerECDSAStorage();
+ $._signer = signerAddr;
+ }
+
+ /// @dev Return the signer's address.
+ function signer() public view virtual returns (address) {
+ SignerECDSAStorage storage $ = _getSignerECDSAStorage();
+ return $._signer;
+ }
+
+ /// @inheritdoc AbstractSigner
+ function _rawSignatureValidation(
+ bytes32 hash,
+ bytes calldata signature
+ ) internal view virtual override returns (bool) {
+ (address recovered, ECDSA.RecoverError err, ) = ECDSA.tryRecoverCalldata(hash, signature);
+ return signer() == recovered && err == ECDSA.RecoverError.NoError;
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerERC7913Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerERC7913Upgradeable.sol
new file mode 100644
index 0000000..d5ec072
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerERC7913Upgradeable.sol
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (utils/cryptography/signers/SignerERC7913.sol)
+
+pragma solidity ^0.8.24;
+
+import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";
+import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of {AbstractSigner} using
+ * https://eips.ethereum.org/EIPS/eip-7913[ERC-7913] signature verification.
+ *
+ * For {Account} usage, a {_setSigner} function is provided to set the ERC-7913 formatted {signer}.
+ * Doing so is easier for a factory, who is likely to use initializable clones of this contract.
+ *
+ * The signer is a `bytes` object that concatenates a verifier address and a key: `verifier || key`.
+ *
+ * Example of usage:
+ *
+ * ```solidity
+ * contract MyAccountERC7913 is Account, SignerERC7913, Initializable {
+ * function initialize(bytes memory signer_) public initializer {
+ * _setSigner(signer_);
+ * }
+ *
+ * function setSigner(bytes memory signer_) public onlyEntryPointOrSelf {
+ * _setSigner(signer_);
+ * }
+ * }
+ * ```
+ *
+ * IMPORTANT: Failing to call {_setSigner} either during construction (if used standalone)
+ * or during initialization (if used as a clone) may leave the signer either front-runnable or unusable.
+ */
+
+abstract contract SignerERC7913Upgradeable is Initializable, AbstractSigner {
+ /// @custom:storage-location erc7201:openzeppelin.storage.SignerERC7913
+ struct SignerERC7913Storage {
+ bytes _signer;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.SignerERC7913")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant SignerERC7913StorageLocation = 0x170786af7cf7b78916dca5a937f25e3b9b70ae3faee6f0db68cda91b7e818e00;
+
+ function _getSignerERC7913Storage() private pure returns (SignerERC7913Storage storage $) {
+ assembly {
+ $.slot := SignerERC7913StorageLocation
+ }
+ }
+
+ function __SignerERC7913_init(bytes memory signer_) internal onlyInitializing {
+ __SignerERC7913_init_unchained(signer_);
+ }
+
+ function __SignerERC7913_init_unchained(bytes memory signer_) internal onlyInitializing {
+ _setSigner(signer_);
+ }
+
+ /// @dev Return the ERC-7913 signer (i.e. `verifier || key`).
+ function signer() public view virtual returns (bytes memory) {
+ SignerERC7913Storage storage $ = _getSignerERC7913Storage();
+ return $._signer;
+ }
+
+ /// @dev Sets the signer (i.e. `verifier || key`) with an ERC-7913 formatted signer.
+ function _setSigner(bytes memory signer_) internal {
+ SignerERC7913Storage storage $ = _getSignerERC7913Storage();
+ $._signer = signer_;
+ }
+
+ /**
+ * @dev Verifies a signature using {SignatureChecker-isValidSignatureNow-bytes-bytes32-bytes-}
+ * with {signer}, `hash` and `signature`.
+ */
+ function _rawSignatureValidation(
+ bytes32 hash,
+ bytes calldata signature
+ ) internal view virtual override returns (bool) {
+ return SignatureChecker.isValidSignatureNow(signer(), hash, signature);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol
new file mode 100644
index 0000000..7263883
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol
@@ -0,0 +1,83 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (utils/cryptography/signers/SignerP256.sol)
+
+pragma solidity ^0.8.20;
+
+import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";
+import {P256} from "@openzeppelin/contracts/utils/cryptography/P256.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of {AbstractSigner} using xref:api:utils/cryptography#P256[P256] signatures.
+ *
+ * For {Account} usage, a {_setSigner} function is provided to set the {signer} public key.
+ * Doing so is easier for a factory, who is likely to use initializable clones of this contract.
+ *
+ * Example of usage:
+ *
+ * ```solidity
+ * contract MyAccountP256 is Account, SignerP256, Initializable {
+ * function initialize(bytes32 qx, bytes32 qy) public initializer {
+ * _setSigner(qx, qy);
+ * }
+ * }
+ * ```
+ *
+ * IMPORTANT: Failing to call {_setSigner} either during construction (if used standalone)
+ * or during initialization (if used as a clone) may leave the signer either front-runnable or unusable.
+ */
+abstract contract SignerP256Upgradeable is Initializable, AbstractSigner {
+ /// @custom:storage-location erc7201:openzeppelin.storage.SignerP256
+ struct SignerP256Storage {
+ bytes32 _qx;
+ bytes32 _qy;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.SignerP256")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant SignerP256StorageLocation = 0x6c6e681eb9c9937bb0e9a845af882a34f03801b1b670c4e5431f8b41c16a2700;
+
+ function _getSignerP256Storage() private pure returns (SignerP256Storage storage $) {
+ assembly {
+ $.slot := SignerP256StorageLocation
+ }
+ }
+
+ error SignerP256InvalidPublicKey(bytes32 qx, bytes32 qy);
+
+ function __SignerP256_init(bytes32 qx, bytes32 qy) internal onlyInitializing {
+ __SignerP256_init_unchained(qx, qy);
+ }
+
+ function __SignerP256_init_unchained(bytes32 qx, bytes32 qy) internal onlyInitializing {
+ _setSigner(qx, qy);
+ }
+
+ /**
+ * @dev Sets the signer with a P256 public key. This function should be called during construction
+ * or through an initializer.
+ */
+ function _setSigner(bytes32 qx, bytes32 qy) internal {
+ SignerP256Storage storage $ = _getSignerP256Storage();
+ if (!P256.isValidPublicKey(qx, qy)) revert SignerP256InvalidPublicKey(qx, qy);
+ $._qx = qx;
+ $._qy = qy;
+ }
+
+ /// @dev Return the signer's P256 public key.
+ function signer() public view virtual returns (bytes32 qx, bytes32 qy) {
+ SignerP256Storage storage $ = _getSignerP256Storage();
+ return ($._qx, $._qy);
+ }
+
+ /// @inheritdoc AbstractSigner
+ function _rawSignatureValidation(
+ bytes32 hash,
+ bytes calldata signature
+ ) internal view virtual override returns (bool) {
+ if (signature.length < 0x40) return false;
+ bytes32 r = bytes32(signature[0x00:0x20]);
+ bytes32 s = bytes32(signature[0x20:0x40]);
+ (bytes32 qx, bytes32 qy) = signer();
+ return P256.verify(hash, r, s, qx, qy);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol
new file mode 100644
index 0000000..a52a023
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (utils/cryptography/signers/SignerRSA.sol)
+
+pragma solidity ^0.8.20;
+
+import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";
+import {RSA} from "@openzeppelin/contracts/utils/cryptography/RSA.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of {AbstractSigner} using xref:api:utils/cryptography#RSA[RSA] signatures.
+ *
+ * For {Account} usage, a {_setSigner} function is provided to set the {signer} public key.
+ * Doing so is easier for a factory, who is likely to use initializable clones of this contract.
+ *
+ * Example of usage:
+ *
+ * ```solidity
+ * contract MyAccountRSA is Account, SignerRSA, Initializable {
+ * function initialize(bytes memory e, bytes memory n) public initializer {
+ * _setSigner(e, n);
+ * }
+ * }
+ * ```
+ *
+ * IMPORTANT: Failing to call {_setSigner} either during construction (if used standalone)
+ * or during initialization (if used as a clone) may leave the signer either front-runnable or unusable.
+ */
+abstract contract SignerRSAUpgradeable is Initializable, AbstractSigner {
+ /// @custom:storage-location erc7201:openzeppelin.storage.SignerRSA
+ struct SignerRSAStorage {
+ bytes _e;
+ bytes _n;
+ }
+
+ // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.SignerRSA")) - 1)) & ~bytes32(uint256(0xff))
+ bytes32 private constant SignerRSAStorageLocation = 0x8bf15870295cd9a811d81afc339672ef68c88b80db19b9fcfad708cc10d31600;
+
+ function _getSignerRSAStorage() private pure returns (SignerRSAStorage storage $) {
+ assembly {
+ $.slot := SignerRSAStorageLocation
+ }
+ }
+
+ function __SignerRSA_init(bytes memory e, bytes memory n) internal onlyInitializing {
+ __SignerRSA_init_unchained(e, n);
+ }
+
+ function __SignerRSA_init_unchained(bytes memory e, bytes memory n) internal onlyInitializing {
+ _setSigner(e, n);
+ }
+
+ /**
+ * @dev Sets the signer with a RSA public key. This function should be called during construction
+ * or through an initializer.
+ */
+ function _setSigner(bytes memory e, bytes memory n) internal {
+ SignerRSAStorage storage $ = _getSignerRSAStorage();
+ $._e = e;
+ $._n = n;
+ }
+
+ /// @dev Return the signer's RSA public key.
+ function signer() public view virtual returns (bytes memory e, bytes memory n) {
+ SignerRSAStorage storage $ = _getSignerRSAStorage();
+ return ($._e, $._n);
+ }
+
+ /**
+ * @dev See {AbstractSigner-_rawSignatureValidation}. Verifies a PKCSv1.5 signature by calling
+ * xref:api:utils/cryptography.adoc#RSA-pkcs1Sha256-bytes-bytes-bytes-bytes-[RSA.pkcs1Sha256].
+ *
+ * IMPORTANT: Following the RSASSA-PKCS1-V1_5-VERIFY procedure outlined in RFC8017 (section 8.2.2), the
+ * provided `hash` is used as the `M` (message) and rehashed using SHA256 according to EMSA-PKCS1-v1_5
+ * encoding as per section 9.2 (step 1) of the RFC.
+ */
+ function _rawSignatureValidation(
+ bytes32 hash,
+ bytes calldata signature
+ ) internal view virtual override returns (bool) {
+ (bytes memory e, bytes memory n) = signer();
+ return RSA.pkcs1Sha256(abi.encodePacked(hash), signature, e, n);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol
new file mode 100644
index 0000000..03acede
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.6.0) (utils/cryptography/signers/SignerWebAuthn.sol)
+
+pragma solidity ^0.8.24;
+
+import {SignerP256Upgradeable} from "./SignerP256Upgradeable.sol";
+import {WebAuthn} from "@openzeppelin/contracts/utils/cryptography/WebAuthn.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of {SignerP256} that supports WebAuthn authentication assertions.
+ *
+ * This contract enables signature validation using WebAuthn authentication assertions,
+ * leveraging the P256 public key stored in the contract. It allows for both WebAuthn
+ * and raw P256 signature validation, providing compatibility with both signature types.
+ *
+ * The signature is expected to be an abi-encoded {WebAuthn-WebAuthnAuth} struct.
+ *
+ * Example usage:
+ *
+ * ```solidity
+ * contract MyAccountWebAuthn is Account, SignerWebAuthn, Initializable {
+ * function initialize(bytes32 qx, bytes32 qy) public initializer {
+ * _setSigner(qx, qy);
+ * }
+ * }
+ * ```
+ *
+ * IMPORTANT: Failing to call {_setSigner} either during construction (if used standalone)
+ * or during initialization (if used as a clone) may leave the signer either front-runnable or unusable.
+ */
+abstract contract SignerWebAuthnUpgradeable is Initializable, SignerP256Upgradeable {
+ function __SignerWebAuthn_init() internal onlyInitializing {
+ }
+
+ function __SignerWebAuthn_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Validates a raw signature using the WebAuthn authentication assertion.
+ *
+ * Returns `false` if the signature is not a valid WebAuthn authentication assertion.
+ */
+ function _rawSignatureValidation(
+ bytes32 hash,
+ bytes calldata signature
+ ) internal view virtual override returns (bool) {
+ (bool decodeSuccess, WebAuthn.WebAuthnAuth calldata auth) = WebAuthn.tryDecodeAuth(signature);
+ if (!decodeSuccess) return false;
+ (bytes32 qx, bytes32 qy) = signer();
+ return WebAuthn.verify(abi.encodePacked(hash), auth, qx, qy);
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/draft-ERC7739Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/draft-ERC7739Upgradeable.sol
new file mode 100644
index 0000000..7f6a1a4
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/cryptography/signers/draft-ERC7739Upgradeable.sol
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.5.0) (utils/cryptography/signers/draft-ERC7739.sol)
+
+pragma solidity ^0.8.24;
+
+import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";
+import {EIP712Upgradeable} from "../EIP712Upgradeable.sol";
+import {ERC7739Utils} from "@openzeppelin/contracts/utils/cryptography/draft-ERC7739Utils.sol";
+import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";
+import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Validates signatures wrapping the message hash in a nested EIP712 type. See {ERC7739Utils}.
+ *
+ * Linking the signature to the EIP-712 domain separator is a security measure to prevent signature replay across different
+ * EIP-712 domains (e.g. a single offchain owner of multiple contracts).
+ *
+ * This contract requires implementing the {_rawSignatureValidation} function, which passes the wrapped message hash,
+ * which may be either an typed data or a personal sign nested type.
+ *
+ * NOTE: xref:api:utils/cryptography#EIP712[EIP-712] uses xref:api:utils/cryptography#ShortStrings[ShortStrings] to
+ * optimize gas costs for short strings (up to 31 characters). Consider that strings longer than that will use storage,
+ * which may limit the ability of the signer to be used within the ERC-4337 validation phase (due to
+ * https://eips.ethereum.org/EIPS/eip-7562#storage-rules[ERC-7562 storage access rules]).
+ */
+abstract contract ERC7739Upgradeable is Initializable, AbstractSigner, EIP712Upgradeable, IERC1271 {
+ using ERC7739Utils for *;
+ using MessageHashUtils for bytes32;
+
+ function __ERC7739_init() internal onlyInitializing {
+ }
+
+ function __ERC7739_init_unchained() internal onlyInitializing {
+ }
+ /**
+ * @dev Attempts validating the signature in a nested EIP-712 type.
+ *
+ * A nested EIP-712 type might be presented in 2 different ways:
+ *
+ * - As a nested EIP-712 typed data
+ * - As a _personal_ signature (an EIP-712 mimic of the `eth_personalSign` for a smart contract)
+ */
+ function isValidSignature(bytes32 hash, bytes calldata signature) public view virtual returns (bytes4 result) {
+ // For the hash `0x7739773977397739773977397739773977397739773977397739773977397739` and an empty signature,
+ // we return the magic value `0x77390001` as it's assumed impossible to find a preimage for it that can be used
+ // maliciously. Useful for simulation purposes and to validate whether the contract supports ERC-7739.
+ return
+ (_isValidNestedTypedDataSignature(hash, signature) || _isValidNestedPersonalSignSignature(hash, signature))
+ ? IERC1271.isValidSignature.selector
+ : (hash == 0x7739773977397739773977397739773977397739773977397739773977397739 && signature.length == 0)
+ ? bytes4(0x77390001)
+ : bytes4(0xffffffff);
+ }
+
+ /**
+ * @dev Nested personal signature verification.
+ */
+ function _isValidNestedPersonalSignSignature(bytes32 hash, bytes calldata signature) private view returns (bool) {
+ return _rawSignatureValidation(_domainSeparatorV4().toTypedDataHash(hash.personalSignStructHash()), signature);
+ }
+
+ /**
+ * @dev Nested EIP-712 typed data verification.
+ */
+ function _isValidNestedTypedDataSignature(
+ bytes32 hash,
+ bytes calldata encodedSignature
+ ) private view returns (bool) {
+ // decode signature
+ (
+ bytes calldata signature,
+ bytes32 appSeparator,
+ bytes32 contentsHash,
+ string calldata contentsDescr
+ ) = encodedSignature.decodeTypedDataSig();
+
+ (
+ ,
+ string memory name,
+ string memory version,
+ uint256 chainId,
+ address verifyingContract,
+ bytes32 salt,
+
+ ) = eip712Domain();
+
+ // Check that contentHash and separator are correct
+ // Rebuild nested hash
+ return
+ hash == appSeparator.toTypedDataHash(contentsHash) &&
+ bytes(contentsDescr).length != 0 &&
+ _rawSignatureValidation(
+ appSeparator.toTypedDataHash(
+ ERC7739Utils.typedDataSignStructHash(
+ contentsDescr,
+ contentsHash,
+ abi.encode(keccak256(bytes(name)), keccak256(bytes(version)), chainId, verifyingContract, salt)
+ )
+ ),
+ signature
+ );
+ }
+}
diff --git a/lib/openzeppelin-contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol b/lib/openzeppelin-contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol
new file mode 100644
index 0000000..6906fb3
--- /dev/null
+++ b/lib/openzeppelin-contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: MIT
+// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)
+
+pragma solidity ^0.8.20;
+
+import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+
+/**
+ * @dev Implementation of the {IERC165} interface.
+ *
+ * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
+ * for the additional interface id that will be supported. For example:
+ *
+ * ```solidity
+ * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
+ * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
+ * }
+ * ```
+ */
+abstract contract ERC165Upgradeable is Initializable, IERC165 {
+ function __ERC165_init() internal onlyInitializing {
+ }
+
+ function __ERC165_init_unchained() internal onlyInitializing {
+ }
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
+ return interfaceId == type(IERC165).interfaceId;
+ }
+}
diff --git a/test/fuzz/DoubleSlashPrevention.fuzz.sol b/test/fuzz/DoubleSlashPrevention.fuzz.sol
index 918573f..7b67b2c 100644
--- a/test/fuzz/DoubleSlashPrevention.fuzz.sol
+++ b/test/fuzz/DoubleSlashPrevention.fuzz.sol
@@ -269,4 +269,43 @@ contract DoubleSlashPreventionFuzzTest is Test {
"Contract totalSlashed should equal sum of all settlement slashes"
);
}
+
+ function test_SlashedAmountDoesNotOverflowWithLargeStake() public {
+ // Create a fresh contract and token to isolate the overflow scenario
+ MockTokenForTest overflowToken = new MockTokenForTest();
+ MockReputationOracle overflowOracle = new MockReputationOracle();
+ TruthBountyWeighted overflowTruthBounty = new TruthBountyWeighted(
+ address(overflowToken),
+ address(overflowOracle),
+ admin
+ );
+
+ address verifier = address(uint160(0x999));
+ uint256 stakeAmount = (type(uint256).max / 20) + 1;
+
+ overflowToken.mint(verifier, stakeAmount);
+
+ vm.prank(verifier);
+ overflowToken.approve(address(overflowTruthBounty), type(uint256).max);
+
+ vm.prank(verifier);
+ overflowTruthBounty.stake(stakeAmount);
+
+ vm.prank(admin);
+ uint256 claimId = overflowTruthBounty.createClaim("Overflow claim");
+
+ vm.prank(verifier);
+ overflowTruthBounty.vote(claimId, false, stakeAmount);
+
+ vm.warp(block.timestamp + VERIFICATION_WINDOW + 1);
+
+ vm.prank(admin);
+ overflowTruthBounty.settleClaim(claimId);
+
+ (, , uint256 totalSlashed, , ) = overflowTruthBounty.settlementResults(claimId);
+ uint256 expectedSlash = stakeAmount / 5; // 20% of the stake
+
+ assertEq(totalSlashed, expectedSlash, "Large slash amount should calculate correctly");
+ assertEq(overflowTruthBounty.totalSlashed(), expectedSlash, "Contract totalSlashed should reflect large slash amount");
+ }
}