Skip to content

Instantly share code, notes, and snippets.

@pythonpete32
Created March 29, 2023 11:14
Show Gist options
  • Save pythonpete32/60661d13fc2f2c137f9be31e5861f064 to your computer and use it in GitHub Desktop.
Save pythonpete32/60661d13fc2f2c137f9be31e5861f064 to your computer and use it in GitHub Desktop.
{
"address": "0xD2587c781c4bFE196fbb09060109F4558D3e8da4",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "dao",
"type": "address"
},
{
"internalType": "address",
"name": "where",
"type": "address"
},
{
"internalType": "address",
"name": "who",
"type": "address"
},
{
"internalType": "bytes32",
"name": "permissionId",
"type": "bytes32"
}
],
"name": "DaoUnauthorized",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "limit",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "actual",
"type": "uint64"
}
],
"name": "DateOutOfBounds",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "limit",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "actual",
"type": "uint64"
}
],
"name": "MinDurationOutOfBounds",
"type": "error"
},
{
"inputs": [],
"name": "NoVotingPower",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ProposalCreationForbidden",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "ProposalExecutionForbidden",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "limit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "actual",
"type": "uint256"
}
],
"name": "RatioOutOfBounds",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "limit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "actual",
"type": "uint256"
}
],
"name": "RatioOutOfBounds",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "enum IMajorityVoting.VoteOption",
"name": "voteOption",
"type": "uint8"
}
],
"name": "VoteCastForbidden",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "previousAdmin",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "AdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "beacon",
"type": "address"
}
],
"name": "BeaconUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address[]",
"name": "members",
"type": "address[]"
}
],
"name": "MembersAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address[]",
"name": "members",
"type": "address[]"
}
],
"name": "MembersRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "definingContract",
"type": "address"
}
],
"name": "MembershipContractAnnounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "creator",
"type": "address"
},
{
"indexed": false,
"internalType": "uint64",
"name": "startDate",
"type": "uint64"
},
{
"indexed": false,
"internalType": "uint64",
"name": "endDate",
"type": "uint64"
},
{
"indexed": false,
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
},
{
"components": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"indexed": false,
"internalType": "struct IDAO.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"indexed": false,
"internalType": "uint256",
"name": "allowFailureMap",
"type": "uint256"
}
],
"name": "ProposalCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "ProposalExecuted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "voter",
"type": "address"
},
{
"indexed": false,
"internalType": "enum IMajorityVoting.VoteOption",
"name": "voteOption",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint256",
"name": "votingPower",
"type": "uint256"
}
],
"name": "VoteCast",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "enum MajorityVotingBase.VotingMode",
"name": "votingMode",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint32",
"name": "supportThreshold",
"type": "uint32"
},
{
"indexed": false,
"internalType": "uint32",
"name": "minParticipation",
"type": "uint32"
},
{
"indexed": false,
"internalType": "uint64",
"name": "minDuration",
"type": "uint64"
},
{
"indexed": false,
"internalType": "uint256",
"name": "minProposerVotingPower",
"type": "uint256"
}
],
"name": "VotingSettingsUpdated",
"type": "event"
},
{
"inputs": [],
"name": "UPDATE_VOTING_SETTINGS_PERMISSION_ID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "UPGRADE_PLUGIN_PERMISSION_ID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
}
],
"name": "canExecute",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
},
{
"internalType": "address",
"name": "_voter",
"type": "address"
},
{
"internalType": "enum IMajorityVoting.VoteOption",
"name": "_voteOption",
"type": "uint8"
}
],
"name": "canVote",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "_metadata",
"type": "bytes"
},
{
"components": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"internalType": "struct IDAO.Action[]",
"name": "_actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "_allowFailureMap",
"type": "uint256"
},
{
"internalType": "uint64",
"name": "_startDate",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "_endDate",
"type": "uint64"
},
{
"internalType": "enum IMajorityVoting.VoteOption",
"name": "_voteOption",
"type": "uint8"
},
{
"internalType": "bool",
"name": "_tryEarlyExecution",
"type": "bool"
}
],
"name": "createProposal",
"outputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "dao",
"outputs": [
{
"internalType": "contract IDAO",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
}
],
"name": "execute",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
}
],
"name": "getProposal",
"outputs": [
{
"internalType": "bool",
"name": "open",
"type": "bool"
},
{
"internalType": "bool",
"name": "executed",
"type": "bool"
},
{
"components": [
{
"internalType": "enum MajorityVotingBase.VotingMode",
"name": "votingMode",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "supportThreshold",
"type": "uint32"
},
{
"internalType": "uint64",
"name": "startDate",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "endDate",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "snapshotBlock",
"type": "uint64"
},
{
"internalType": "uint256",
"name": "minVotingPower",
"type": "uint256"
}
],
"internalType": "struct MajorityVotingBase.ProposalParameters",
"name": "parameters",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "abstain",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "yes",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "no",
"type": "uint256"
}
],
"internalType": "struct MajorityVotingBase.Tally",
"name": "tally",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"internalType": "struct IDAO.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "allowFailureMap",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
},
{
"internalType": "address",
"name": "_voter",
"type": "address"
}
],
"name": "getVoteOption",
"outputs": [
{
"internalType": "enum IMajorityVoting.VoteOption",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getVotingToken",
"outputs": [
{
"internalType": "contract IFollowNFT",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "implementation",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDAO",
"name": "_dao",
"type": "address"
},
{
"components": [
{
"internalType": "enum MajorityVotingBase.VotingMode",
"name": "votingMode",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "supportThreshold",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "minParticipation",
"type": "uint32"
},
{
"internalType": "uint64",
"name": "minDuration",
"type": "uint64"
},
{
"internalType": "uint256",
"name": "minProposerVotingPower",
"type": "uint256"
}
],
"internalType": "struct MajorityVotingBase.VotingSettings",
"name": "_votingSettings",
"type": "tuple"
},
{
"internalType": "contract IFollowNFT",
"name": "_token",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
}
],
"name": "isMember",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
}
],
"name": "isMinParticipationReached",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
}
],
"name": "isSupportThresholdReached",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
}
],
"name": "isSupportThresholdReachedEarly",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "minDuration",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "minParticipation",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "minProposerVotingPower",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pluginType",
"outputs": [
{
"internalType": "enum IPlugin.PluginType",
"name": "",
"type": "uint8"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "proposalCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "supportThreshold",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"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": "_blockNumber",
"type": "uint256"
}
],
"name": "totalVotingPower",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "enum MajorityVotingBase.VotingMode",
"name": "votingMode",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "supportThreshold",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "minParticipation",
"type": "uint32"
},
{
"internalType": "uint64",
"name": "minDuration",
"type": "uint64"
},
{
"internalType": "uint256",
"name": "minProposerVotingPower",
"type": "uint256"
}
],
"internalType": "struct MajorityVotingBase.VotingSettings",
"name": "_votingSettings",
"type": "tuple"
}
],
"name": "updateVotingSettings",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
}
],
"name": "upgradeTo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeToAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_proposalId",
"type": "uint256"
},
{
"internalType": "enum IMajorityVoting.VoteOption",
"name": "_voteOption",
"type": "uint8"
},
{
"internalType": "bool",
"name": "_tryEarlyExecution",
"type": "bool"
}
],
"name": "vote",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "votingMode",
"outputs": [
{
"internalType": "enum MajorityVotingBase.VotingMode",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
}
],
"transactionHash": "0xec17fc116391dca32c788059ad14205a29a53d5440b97b2fbfe166aef0657ca1",
"receipt": {
"to": null,
"from": "0x47d80912400ef8f8224531EBEB1ce8f2ACf4b75a",
"contractAddress": "0xD2587c781c4bFE196fbb09060109F4558D3e8da4",
"transactionIndex": 8,
"gasUsed": "3151701",
"logsBloom": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000800000200000000000000000000000000000000000000000000000000080000000000000000004010000000000000000000000000000000000000000000000000000000000008000000a000080000000000000000000000000000000000000000000000080000000000000000000200010000000000000000000000400000000000000000000000040000000004000000000000000000001002000040000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000",
"blockHash": "0x86e887ac1f46d423783aad09d3b924e36d69cabd4a6ef177b6f5331b6514e9fc",
"transactionHash": "0xec17fc116391dca32c788059ad14205a29a53d5440b97b2fbfe166aef0657ca1",
"logs": [
{
"transactionIndex": 8,
"blockNumber": 33709680,
"transactionHash": "0xec17fc116391dca32c788059ad14205a29a53d5440b97b2fbfe166aef0657ca1",
"address": "0xD2587c781c4bFE196fbb09060109F4558D3e8da4",
"topics": [
"0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"
],
"data": "0x00000000000000000000000000000000000000000000000000000000000000ff",
"logIndex": 13,
"blockHash": "0x86e887ac1f46d423783aad09d3b924e36d69cabd4a6ef177b6f5331b6514e9fc"
},
{
"transactionIndex": 8,
"blockNumber": 33709680,
"transactionHash": "0xec17fc116391dca32c788059ad14205a29a53d5440b97b2fbfe166aef0657ca1",
"address": "0x0000000000000000000000000000000000001010",
"topics": [
"0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
"0x0000000000000000000000000000000000000000000000000000000000001010",
"0x00000000000000000000000047d80912400ef8f8224531ebeb1ce8f2acf4b75a",
"0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd"
],
"data": "0x0000000000000000000000000000000000000000000000000010cbaedbd09b0000000000000000000000000000000000000000000000000006d25da99c7868d2000000000000000000000000000000000000000000000ef321b9c6a681d4421100000000000000000000000000000000000000000000000006c191fac0a7cdd2000000000000000000000000000000000000000000000ef321ca92555da4dd11",
"logIndex": 14,
"blockHash": "0x86e887ac1f46d423783aad09d3b924e36d69cabd4a6ef177b6f5331b6514e9fc"
}
],
"blockNumber": 33709680,
"cumulativeGasUsed": "3996387",
"status": 1,
"byzantium": true
},
"args": [],
"numDeployments": 1,
"solcInputHash": "5103af19eb380f14c87ab8dbbc239b55",
"metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dao\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"where\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"who\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"permissionId\",\"type\":\"bytes32\"}],\"name\":\"DaoUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actual\",\"type\":\"uint64\"}],\"name\":\"DateOutOfBounds\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actual\",\"type\":\"uint64\"}],\"name\":\"MinDurationOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoVotingPower\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ProposalCreationForbidden\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecutionForbidden\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"RatioOutOfBounds\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"RatioOutOfBounds\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"enum IMajorityVoting.VoteOption\",\"name\":\"voteOption\",\"type\":\"uint8\"}],\"name\":\"VoteCastForbidden\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"members\",\"type\":\"address[]\"}],\"name\":\"MembersAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"members\",\"type\":\"address[]\"}],\"name\":\"MembersRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"definingContract\",\"type\":\"address\"}],\"name\":\"MembershipContractAnnounced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"startDate\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endDate\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct IDAO.Action[]\",\"name\":\"actions\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"allowFailureMap\",\"type\":\"uint256\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum IMajorityVoting.VoteOption\",\"name\":\"voteOption\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"votingPower\",\"type\":\"uint256\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum MajorityVotingBase.VotingMode\",\"name\":\"votingMode\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"supportThreshold\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"minParticipation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"minDuration\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minProposerVotingPower\",\"type\":\"uint256\"}],\"name\":\"VotingSettingsUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"UPDATE_VOTING_SETTINGS_PERMISSION_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_PLUGIN_PERMISSION_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"}],\"name\":\"canExecute\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_voter\",\"type\":\"address\"},{\"internalType\":\"enum IMajorityVoting.VoteOption\",\"name\":\"_voteOption\",\"type\":\"uint8\"}],\"name\":\"canVote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_metadata\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IDAO.Action[]\",\"name\":\"_actions\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"_allowFailureMap\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_startDate\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_endDate\",\"type\":\"uint64\"},{\"internalType\":\"enum IMajorityVoting.VoteOption\",\"name\":\"_voteOption\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_tryEarlyExecution\",\"type\":\"bool\"}],\"name\":\"createProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dao\",\"outputs\":[{\"internalType\":\"contract IDAO\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"}],\"name\":\"getProposal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"open\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"enum MajorityVotingBase.VotingMode\",\"name\":\"votingMode\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"supportThreshold\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"startDate\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endDate\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"snapshotBlock\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"minVotingPower\",\"type\":\"uint256\"}],\"internalType\":\"struct MajorityVotingBase.ProposalParameters\",\"name\":\"parameters\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"abstain\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"yes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"no\",\"type\":\"uint256\"}],\"internalType\":\"struct MajorityVotingBase.Tally\",\"name\":\"tally\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IDAO.Action[]\",\"name\":\"actions\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"allowFailureMap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoteOption\",\"outputs\":[{\"internalType\":\"enum IMajorityVoting.VoteOption\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotingToken\",\"outputs\":[{\"internalType\":\"contract IFollowNFT\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IDAO\",\"name\":\"_dao\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"enum MajorityVotingBase.VotingMode\",\"name\":\"votingMode\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"supportThreshold\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minParticipation\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"minDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"minProposerVotingPower\",\"type\":\"uint256\"}],\"internalType\":\"struct MajorityVotingBase.VotingSettings\",\"name\":\"_votingSettings\",\"type\":\"tuple\"},{\"internalType\":\"contract IFollowNFT\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isMember\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"}],\"name\":\"isMinParticipationReached\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"}],\"name\":\"isSupportThresholdReached\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"}],\"name\":\"isSupportThresholdReachedEarly\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minDuration\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minParticipation\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minProposerVotingPower\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pluginType\",\"outputs\":[{\"internalType\":\"enum IPlugin.PluginType\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supportThreshold\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"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\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"totalVotingPower\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"enum MajorityVotingBase.VotingMode\",\"name\":\"votingMode\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"supportThreshold\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minParticipation\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"minDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"minProposerVotingPower\",\"type\":\"uint256\"}],\"internalType\":\"struct MajorityVotingBase.VotingSettings\",\"name\":\"_votingSettings\",\"type\":\"tuple\"}],\"name\":\"updateVotingSettings\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proposalId\",\"type\":\"uint256\"},{\"internalType\":\"enum IMajorityVoting.VoteOption\",\"name\":\"_voteOption\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_tryEarlyExecution\",\"type\":\"bool\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingMode\",\"outputs\":[{\"internalType\":\"enum MajorityVotingBase.VotingMode\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Aragon Association - 2021-2023\",\"details\":\"This contract inherits from `MajorityVotingBase` and implements the `IMajorityVoting` interface.\",\"errors\":{\"DaoUnauthorized(address,address,address,bytes32)\":[{\"params\":{\"dao\":\"The associated DAO.\",\"permissionId\":\"The permission identifier.\",\"where\":\"The context in which the authorization reverted.\",\"who\":\"The address (EOA or contract) missing the permission.\"}}],\"DateOutOfBounds(uint64,uint64)\":[{\"params\":{\"actual\":\"The actual value.\",\"limit\":\"The limit value.\"}}],\"MinDurationOutOfBounds(uint64,uint64)\":[{\"params\":{\"actual\":\"The actual value.\",\"limit\":\"The limit value.\"}}],\"ProposalCreationForbidden(address)\":[{\"params\":{\"sender\":\"The sender address.\"}}],\"ProposalExecutionForbidden(uint256)\":[{\"params\":{\"proposalId\":\"The ID of the proposal.\"}}],\"RatioOutOfBounds(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual value.\",\"limit\":\"The maximal value.\"}},{\"params\":{\"actual\":\"The actual value.\",\"limit\":\"The maximal value.\"}}],\"VoteCastForbidden(uint256,address,uint8)\":[{\"params\":{\"account\":\"The address of the _account.\",\"proposalId\":\"The ID of the proposal.\",\"voteOption\":\"The chosen vote option.\"}}]},\"kind\":\"dev\",\"methods\":{\"canExecute(uint256)\":{\"params\":{\"_proposalId\":\"The ID of the proposal to be checked.\"},\"returns\":{\"_0\":\"True if the proposal can be executed, false otherwise.\"}},\"canVote(uint256,address,uint8)\":{\"details\":\"The function assumes the queried proposal exists.\",\"params\":{\"_account\":\"The account address to be checked.\",\"_proposalId\":\"The proposal Id.\",\"_voteOption\":\"Whether the voter abstains, supports or opposes the proposal.\"},\"returns\":{\"_0\":\"Returns true if the account is allowed to vote.\"}},\"createProposal(bytes,(address,uint256,bytes)[],uint256,uint64,uint64,uint8,bool)\":{\"params\":{\"_actions\":\"The actions that will be executed after the proposal passes.\",\"_allowFailureMap\":\"Allows proposal to succeed even if an action reverts. Uses bitmap representation. If the bit at index `x` is 1, the tx succeeds even if the action at `x` failed. Passing 0 will be treated as atomic execution.\",\"_endDate\":\"The end date of the proposal vote. If 0, `_startDate + minDuration` is used.\",\"_metadata\":\"The metadata of the proposal.\",\"_startDate\":\"The start date of the proposal vote. If 0, the current timestamp is used and the vote starts immediately.\",\"_tryEarlyExecution\":\"If `true`, early execution is tried after the vote cast. The call does not revert if early execution is not possible.\",\"_voteOption\":\"The chosen vote option to be casted on proposal creation.\"},\"returns\":{\"proposalId\":\"The ID of the proposal.\"}},\"dao()\":{\"returns\":{\"_0\":\"The DAO contract.\"}},\"execute(uint256)\":{\"params\":{\"_proposalId\":\"The ID of the proposal to be executed.\"}},\"getProposal(uint256)\":{\"params\":{\"_proposalId\":\"The ID of the proposal.\"},\"returns\":{\"actions\":\"The actions to be executed in the associated DAO after the proposal has passed.\",\"allowFailureMap\":\"The bit map representations of which actions are allowed to revert so tx still succeeds.\",\"executed\":\"Whether the proposal is executed or not.\",\"open\":\"Whether the proposal is open or not.\",\"parameters\":\"The parameters of the proposal vote.\",\"tally\":\"The current tally of the proposal vote.\"}},\"getVoteOption(uint256,address)\":{\"params\":{\"_account\":\"The account address to be checked.\",\"_proposalId\":\"The ID of the proposal.\"},\"returns\":{\"_0\":\"The vote option cast by a voter for a certain proposal.\"}},\"getVotingToken()\":{\"details\":\"public function also useful for registering interfaceId and for distinguishing from majority voting interface.\",\"returns\":{\"_0\":\"The token used for voting.\"}},\"implementation()\":{\"returns\":{\"_0\":\"The address of the implementation contract.\"}},\"initialize(address,(uint8,uint32,uint32,uint64,uint256),address)\":{\"details\":\"This method is required to support [ERC-1822](https://eips.ethereum.org/EIPS/eip-1822).\",\"params\":{\"_dao\":\"The IDAO interface of the associated DAO.\",\"_token\":\"The governance token.\",\"_votingSettings\":\"The voting settings.\"}},\"isMember(address)\":{\"details\":\"This function must be implemented in the plugin contract that introduces the members to the DAO.\",\"params\":{\"_account\":\"The address of the account to be checked.\"},\"returns\":{\"_0\":\"Whether the account is a member or not.\"}},\"isMinParticipationReached(uint256)\":{\"params\":{\"_proposalId\":\"The ID of the proposal.\"},\"returns\":{\"_0\":\"Returns `true` if the participation is greater than the minimum particpation and `false` otherwise.\"}},\"isSupportThresholdReached(uint256)\":{\"params\":{\"_proposalId\":\"The ID of the proposal.\"},\"returns\":{\"_0\":\"Returns `true` if the support is greater than the support threshold and `false` otherwise.\"}},\"isSupportThresholdReachedEarly(uint256)\":{\"params\":{\"_proposalId\":\"The ID of the proposal.\"},\"returns\":{\"_0\":\"Returns `true` if the worst-case support is greater than the support threshold and `false` otherwise.\"}},\"minDuration()\":{\"returns\":{\"_0\":\"The minimum duration parameter.\"}},\"minParticipation()\":{\"returns\":{\"_0\":\"The minimum participation parameter.\"}},\"minProposerVotingPower()\":{\"returns\":{\"_0\":\"The minimum voting power required to create a proposal.\"}},\"proposalCount()\":{\"returns\":{\"_0\":\"The proposal count.\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"supportThreshold()\":{\"returns\":{\"_0\":\"The support threshold parameter.\"}},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceId\":\"The ID of the interface.\"},\"returns\":{\"_0\":\"Returns `true` if the interface is supported.\"}},\"totalVotingPower(uint256)\":{\"params\":{\"_blockNumber\":\"The block number.\"},\"returns\":{\"_0\":\"The total voting power.\"}},\"updateVotingSettings((uint8,uint32,uint32,uint64,uint256))\":{\"params\":{\"_votingSettings\":\"The new voting settings.\"}},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"vote(uint256,uint8,bool)\":{\"details\":\"`_voteOption`, 1 -> abstain, 2 -> yes, 3 -> no\",\"params\":{\"_proposalId\":\"The ID of the proposal.\",\"_tryEarlyExecution\":\"If `true`, early execution is tried after the vote cast. The call does not revert if early execution is not possible.\",\"_voteOption\":\"The chosen vote option.\"}},\"votingMode()\":{\"returns\":{\"_0\":\"The vote mode parameter.\"}}},\"stateVariables\":{\"__gap\":{\"details\":\"This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain. https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\"}},\"title\":\"TokenVoting\",\"version\":1},\"userdoc\":{\"errors\":{\"DaoUnauthorized(address,address,address,bytes32)\":[{\"notice\":\"Thrown if a call is unauthorized in the associated DAO.\"}],\"DateOutOfBounds(uint64,uint64)\":[{\"notice\":\"Thrown if a date is out of bounds.\"}],\"MinDurationOutOfBounds(uint64,uint64)\":[{\"notice\":\"Thrown if the minimal duration value is out of bounds (less than one hour or greater than 1 year).\"}],\"NoVotingPower()\":[{\"notice\":\"Thrown if the voting power is zero\"}],\"ProposalCreationForbidden(address)\":[{\"notice\":\"Thrown when a sender is not allowed to create a proposal.\"}],\"ProposalExecutionForbidden(uint256)\":[{\"notice\":\"Thrown if the proposal execution is forbidden.\"}],\"RatioOutOfBounds(uint256,uint256)\":[{\"notice\":\"Thrown if a ratio value exceeds the maximal value of `10**6`.\"},{\"notice\":\"Thrown if a ratio value exceeds the maximal value of `10**6`.\"}],\"VoteCastForbidden(uint256,address,uint8)\":[{\"notice\":\"Thrown if an account is not allowed to cast a vote. This can be because the vote - has not started, - has ended, - was executed, or - the account doesn't have voting powers.\"}]},\"events\":{\"MembersAdded(address[])\":{\"notice\":\"Emitted when members are added to the DAO plugin.\"},\"MembersRemoved(address[])\":{\"notice\":\"Emitted when members are removed from the DAO plugin.\"},\"MembershipContractAnnounced(address)\":{\"notice\":\"Emitted to announce the membership being defined by a contract.\"},\"ProposalCreated(uint256,address,uint64,uint64,bytes,(address,uint256,bytes)[],uint256)\":{\"notice\":\"Emitted when a proposal is created.\"},\"ProposalExecuted(uint256)\":{\"notice\":\"Emitted when a proposal is executed.\"},\"VoteCast(uint256,address,uint8,uint256)\":{\"notice\":\"Emitted when a vote is cast by a voter.\"},\"VotingSettingsUpdated(uint8,uint32,uint32,uint64,uint256)\":{\"notice\":\"Emitted when the voting settings are updated.\"}},\"kind\":\"user\",\"methods\":{\"UPDATE_VOTING_SETTINGS_PERMISSION_ID()\":{\"notice\":\"The ID of the permission required to call the `updateVotingSettings` function.\"},\"UPGRADE_PLUGIN_PERMISSION_ID()\":{\"notice\":\"The ID of the permission required to call the `_authorizeUpgrade` function.\"},\"canExecute(uint256)\":{\"notice\":\"Checks if a proposal can be executed.\"},\"canVote(uint256,address,uint8)\":{\"notice\":\"Checks if an account can participate on a proposal vote. This can be because the vote - has not started, - has ended, - was executed, or - the voter doesn't have voting powers.\"},\"createProposal(bytes,(address,uint256,bytes)[],uint256,uint64,uint64,uint8,bool)\":{\"notice\":\"Creates a new majority voting proposal.\"},\"dao()\":{\"notice\":\"Returns the DAO contract.\"},\"execute(uint256)\":{\"notice\":\"Executes a proposal.\"},\"getProposal(uint256)\":{\"notice\":\"Returns all information for a proposal vote by its ID.\"},\"getVoteOption(uint256,address)\":{\"notice\":\"Returns whether the account has voted for the proposal. Note, that this does not check if the account has voting power.\"},\"getVotingToken()\":{\"notice\":\"getter function for the voting token.\"},\"implementation()\":{\"notice\":\"Returns the address of the implementation contract in the [proxy storage slot](https://eips.ethereum.org/EIPS/eip-1967) slot the [UUPS proxy](https://eips.ethereum.org/EIPS/eip-1822) is pointing to.\"},\"initialize(address,(uint8,uint32,uint32,uint64,uint256),address)\":{\"notice\":\"Initializes the component.\"},\"isMember(address)\":{\"notice\":\"Checks if an account is a member of the DAO.\"},\"isMinParticipationReached(uint256)\":{\"notice\":\"Checks if the participation value defined as $$\\\\texttt{participation} = \\\\frac{N_\\\\text{yes}+N_\\\\text{no}+N_\\\\text{abstain}}{N_\\\\text{total}}$$ for a proposal vote is greater or equal than the minimum participation value.\"},\"isSupportThresholdReached(uint256)\":{\"notice\":\"Checks if the support value defined as $$\\\\texttt{support} = \\\\frac{N_\\\\text{yes}}{N_\\\\text{yes}+N_\\\\text{no}}$$ for a proposal vote is greater than the support threshold.\"},\"isSupportThresholdReachedEarly(uint256)\":{\"notice\":\"Checks if the worst-case support value defined as $$\\\\texttt{worstCaseSupport} = \\\\frac{N_\\\\text{yes}}{ N_\\\\text{total}-N_\\\\text{abstain}}$$ for a proposal vote is greater than the support threshold.\"},\"minDuration()\":{\"notice\":\"Returns the minimum duration parameter stored in the voting settings.\"},\"minParticipation()\":{\"notice\":\"Returns the minimum participation parameter stored in the voting settings.\"},\"minProposerVotingPower()\":{\"notice\":\"Returns the minimum voting power required to create a proposa stored in the voting settings.\"},\"pluginType()\":{\"notice\":\"returns the plugin's type\"},\"proposalCount()\":{\"notice\":\"Returns the proposal count determining the next proposal ID.\"},\"supportThreshold()\":{\"notice\":\"Returns the support threshold parameter stored in the voting settings.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Checks if this or the parent contract supports an interface by its ID.\"},\"totalVotingPower(uint256)\":{\"notice\":\"Returns the total voting power checkpointed for a specific block number.\"},\"updateVotingSettings((uint8,uint32,uint32,uint64,uint256))\":{\"notice\":\"Updates the voting settings.\"},\"vote(uint256,uint8,bool)\":{\"notice\":\"Votes for a vote option and, optionally, executes the proposal.\"},\"votingMode()\":{\"notice\":\"Returns the vote mode stored in the voting settings.\"}},\"notice\":\"The majority voting implementation using an [OpenZepplin `Votes`](https://docs.openzeppelin.com/contracts/4.x/api/governance#Votes) compatible governance token.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/LensVotingPlugin.sol\":\"LensVotingPlugin\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":2000},\"remappings\":[]},\"sources\":{\"@aragon/osx/core/dao/IDAO.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\n/// @title IDAO\\n/// @author Aragon Association - 2022-2023\\n/// @notice The interface required for DAOs within the Aragon App DAO framework.\\ninterface IDAO {\\n /// @notice The action struct to be consumed by the DAO's `execute` function resulting in an external call.\\n /// @param to The address to call.\\n /// @param value The native token value to be sent with the call.\\n /// @param data The bytes-encoded function selector and calldata for the call.\\n struct Action {\\n address to;\\n uint256 value;\\n bytes data;\\n }\\n\\n /// @notice Checks if an address has permission on a contract via a permission identifier and considers if `ANY_ADDRESS` was used in the granting process.\\n /// @param _where The address of the contract.\\n /// @param _who The address of a EOA or contract to give the permissions.\\n /// @param _permissionId The permission identifier.\\n /// @param _data The optional data passed to the `PermissionCondition` registered.\\n /// @return Returns true if the address has permission, false if not.\\n function hasPermission(\\n address _where,\\n address _who,\\n bytes32 _permissionId,\\n bytes memory _data\\n ) external view returns (bool);\\n\\n /// @notice Updates the DAO metadata (e.g., an IPFS hash).\\n /// @param _metadata The IPFS hash of the new metadata object.\\n function setMetadata(bytes calldata _metadata) external;\\n\\n /// @notice Emitted when the DAO metadata is updated.\\n /// @param metadata The IPFS hash of the new metadata object.\\n event MetadataSet(bytes metadata);\\n\\n /// @notice Executes a list of actions. If a zero allow-failure map is provided, a failing action reverts the entire excution. If a non-zero allow-failure map is provided, allowed actions can fail without the entire call being reverted.\\n /// @param _callId The ID of the call. The definition of the value of `callId` is up to the calling contract and can be used, e.g., as a nonce.\\n /// @param _actions The array of actions.\\n /// @param _allowFailureMap A bitmap allowing execution to succeed, even if individual actions might revert. If the bit at index `i` is 1, the execution succeeds even if the `i`th action reverts. A failure map value of 0 requires every action to not revert.\\n /// @return The array of results obtained from the executed actions in `bytes`.\\n /// @return The resulting failure map containing the actions have actually failed.\\n function execute(\\n bytes32 _callId,\\n Action[] memory _actions,\\n uint256 _allowFailureMap\\n ) external returns (bytes[] memory, uint256);\\n\\n /// @notice Emitted when a proposal is executed.\\n /// @param actor The address of the caller.\\n /// @param callId The ID of the call.\\n /// @param actions The array of actions executed.\\n /// @param failureMap The failure map encoding which actions have failed.\\n /// @param execResults The array with the results of the executed actions.\\n /// @dev The value of `callId` is defined by the component/contract calling the execute function. A `Plugin` implementation can use it, for example, as a nonce.\\n event Executed(\\n address indexed actor,\\n bytes32 callId,\\n Action[] actions,\\n uint256 failureMap,\\n bytes[] execResults\\n );\\n\\n /// @notice Emitted when a standard callback is registered.\\n /// @param interfaceId The ID of the interface.\\n /// @param callbackSelector The selector of the callback function.\\n /// @param magicNumber The magic number to be registered for the callback function selector.\\n event StandardCallbackRegistered(\\n bytes4 interfaceId,\\n bytes4 callbackSelector,\\n bytes4 magicNumber\\n );\\n\\n /// @notice Deposits (native) tokens to the DAO contract with a reference string.\\n /// @param _token The address of the token or address(0) in case of the native token.\\n /// @param _amount The amount of tokens to deposit.\\n /// @param _reference The reference describing the deposit reason.\\n function deposit(address _token, uint256 _amount, string calldata _reference) external payable;\\n\\n /// @notice Emitted when a token deposit has been made to the DAO.\\n /// @param sender The address of the sender.\\n /// @param token The address of the deposited token.\\n /// @param amount The amount of tokens deposited.\\n /// @param _reference The reference describing the deposit reason.\\n event Deposited(\\n address indexed sender,\\n address indexed token,\\n uint256 amount,\\n string _reference\\n );\\n\\n /// @notice Emitted when a native token deposit has been made to the DAO.\\n /// @dev This event is intended to be emitted in the `receive` function and is therefore bound by the gas limitations for `send`/`transfer` calls introduced by [ERC-2929](https://eips.ethereum.org/EIPS/eip-2929).\\n /// @param sender The address of the sender.\\n /// @param amount The amount of native tokens deposited.\\n event NativeTokenDeposited(address sender, uint256 amount);\\n\\n /// @notice Setter for the trusted forwarder verifying the meta transaction.\\n /// @param _trustedForwarder The trusted forwarder address.\\n function setTrustedForwarder(address _trustedForwarder) external;\\n\\n /// @notice Getter for the trusted forwarder verifying the meta transaction.\\n /// @return The trusted forwarder address.\\n function getTrustedForwarder() external view returns (address);\\n\\n /// @notice Emitted when a new TrustedForwarder is set on the DAO.\\n /// @param forwarder the new forwarder address.\\n event TrustedForwarderSet(address forwarder);\\n\\n /// @notice Setter for the [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) signature validator contract.\\n /// @param _signatureValidator The address of the signature validator.\\n function setSignatureValidator(address _signatureValidator) external;\\n\\n /// @notice Emitted when the signature validator address is updated.\\n /// @param signatureValidator The address of the signature validator.\\n event SignatureValidatorSet(address signatureValidator);\\n\\n /// @notice Checks whether a signature is valid for the provided hash by forwarding the call to the set [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) signature validator contract.\\n /// @param _hash The hash of the data to be signed.\\n /// @param _signature The signature byte array associated with `_hash`.\\n /// @return Returns the `bytes4` magic value `0x1626ba7e` if the signature is valid.\\n function isValidSignature(bytes32 _hash, bytes memory _signature) external returns (bytes4);\\n\\n /// @notice Registers an ERC standard having a callback by registering its [ERC-165](https://eips.ethereum.org/EIPS/eip-165) interface ID and callback function signature.\\n /// @param _interfaceId The ID of the interface.\\n /// @param _callbackSelector The selector of the callback function.\\n /// @param _magicNumber The magic number to be registered for the function signature.\\n function registerStandardCallback(\\n bytes4 _interfaceId,\\n bytes4 _callbackSelector,\\n bytes4 _magicNumber\\n ) external;\\n}\\n\",\"keccak256\":\"0x3574fa159cc2c8ca35292a2612ee1a444bfb5100540820661718c5a4bc1fd168\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/core/plugin/IPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\n/// @title IPlugin\\n/// @author Aragon Association - 2022-2023\\n/// @notice An interface defining the traits of a plugin.\\ninterface IPlugin {\\n enum PluginType {\\n UUPS,\\n Cloneable,\\n Constructable\\n }\\n\\n /// @notice returns the plugin's type\\n function pluginType() external view returns (PluginType);\\n}\\n\",\"keccak256\":\"0xff0e60999c7f9c78bc57d4ca7eb53e38bd4eefbfb152784e98f8cf7530aad3b8\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/core/plugin/PluginUUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {IERC1822ProxiableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport {ERC165Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\\\";\\n\\nimport {IDAO} from \\\"../dao/IDAO.sol\\\";\\nimport {DaoAuthorizableUpgradeable} from \\\"./dao-authorizable/DaoAuthorizableUpgradeable.sol\\\";\\nimport {IPlugin} from \\\"./IPlugin.sol\\\";\\n\\n/// @title PluginUUPSUpgradeable\\n/// @author Aragon Association - 2022-2023\\n/// @notice An abstract, upgradeable contract to inherit from when creating a plugin being deployed via the UUPS pattern (see [ERC-1822](https://eips.ethereum.org/EIPS/eip-1822)).\\nabstract contract PluginUUPSUpgradeable is\\n IPlugin,\\n ERC165Upgradeable,\\n UUPSUpgradeable,\\n DaoAuthorizableUpgradeable\\n{\\n // NOTE: When adding new state variables to the contract, the size of `_gap` has to be adapted below as well.\\n\\n /// @notice Disables the initializers on the implementation contract to prevent it from being left uninitialized.\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /// @inheritdoc IPlugin\\n function pluginType() public pure override returns (PluginType) {\\n return PluginType.UUPS;\\n }\\n\\n /// @notice The ID of the permission required to call the `_authorizeUpgrade` function.\\n bytes32 public constant UPGRADE_PLUGIN_PERMISSION_ID = keccak256(\\\"UPGRADE_PLUGIN_PERMISSION\\\");\\n\\n /// @notice Initializes the plugin by storing the associated DAO.\\n /// @param _dao The DAO contract.\\n function __PluginUUPSUpgradeable_init(IDAO _dao) internal virtual onlyInitializing {\\n __DaoAuthorizableUpgradeable_init(_dao);\\n }\\n\\n /// @notice Checks if an interface is supported by this or its parent contract.\\n /// @param _interfaceId The ID of the interface.\\n /// @return Returns `true` if the interface is supported.\\n function supportsInterface(bytes4 _interfaceId) public view virtual override returns (bool) {\\n return\\n _interfaceId == type(IPlugin).interfaceId ||\\n _interfaceId == type(IERC1822ProxiableUpgradeable).interfaceId ||\\n super.supportsInterface(_interfaceId);\\n }\\n\\n /// @notice Returns the address of the implementation contract in the [proxy storage slot](https://eips.ethereum.org/EIPS/eip-1967) slot the [UUPS proxy](https://eips.ethereum.org/EIPS/eip-1822) is pointing to.\\n /// @return The address of the implementation contract.\\n function implementation() public view returns (address) {\\n return _getImplementation();\\n }\\n\\n /// @notice Internal method authorizing the upgrade of the contract via the [upgradeabilty mechanism for UUPS proxies](https://docs.openzeppelin.com/contracts/4.x/api/proxy#UUPSUpgradeable) (see [ERC-1822](https://eips.ethereum.org/EIPS/eip-1822)).\\n /// @dev The caller must have the `UPGRADE_PLUGIN_PERMISSION_ID` permission.\\n function _authorizeUpgrade(\\n address\\n ) internal virtual override auth(UPGRADE_PLUGIN_PERMISSION_ID) {}\\n\\n /// @notice This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain (see [OpenZepplins guide about storage gaps](https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps)).\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xde1b9e29d70b9e9d731b7b66f649fd2ab3a5725c03c3114dede433bfabe61489\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/core/plugin/dao-authorizable/DaoAuthorizableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {ContextUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\\\";\\n\\nimport {IDAO} from \\\"../../dao/IDAO.sol\\\";\\nimport {_auth} from \\\"../../utils/auth.sol\\\";\\n\\n/// @title DaoAuthorizableUpgradeable\\n/// @author Aragon Association - 2022-2023\\n/// @notice An abstract contract providing a meta-transaction compatible modifier for upgradeable or cloneable contracts to authorize function calls through an associated DAO.\\n/// @dev Make sure to call `__DaoAuthorizableUpgradeable_init` during initialization of the inheriting contract.\\nabstract contract DaoAuthorizableUpgradeable is ContextUpgradeable {\\n /// @notice The associated DAO managing the permissions of inheriting contracts.\\n IDAO private dao_;\\n\\n /// @notice Initializes the contract by setting the associated DAO.\\n /// @param _dao The associated DAO address.\\n function __DaoAuthorizableUpgradeable_init(IDAO _dao) internal onlyInitializing {\\n dao_ = _dao;\\n }\\n\\n /// @notice Returns the DAO contract.\\n /// @return The DAO contract.\\n function dao() public view returns (IDAO) {\\n return dao_;\\n }\\n\\n /// @notice A modifier to make functions on inheriting contracts authorized. Permissions to call the function are checked through the associated DAO's permission manager.\\n /// @param _permissionId The permission identifier required to call the method this modifier is applied to.\\n modifier auth(bytes32 _permissionId) {\\n _auth(dao_, address(this), _msgSender(), _permissionId, _msgData());\\n _;\\n }\\n\\n /// @notice This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain (see [OpenZepplins guide about storage gaps](https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps)).\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x4d57aea8920987f368cc6d610a462fb929df38872b174e4fc15d3eaf8bb5e47c\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/core/plugin/membership/IMembership.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {IDAO} from \\\"../../dao/IDAO.sol\\\";\\n\\n/// @title IProposal\\n/// @author Aragon Association - 2022-2023\\n/// @notice An interface to be implemented by DAO plugins that define membership.\\ninterface IMembership {\\n /// @notice Emitted when members are added to the DAO plugin.\\n /// @param members The list of new members being added.\\n event MembersAdded(address[] members);\\n\\n /// @notice Emitted when members are removed from the DAO plugin.\\n /// @param members The list of existing members being removed.\\n event MembersRemoved(address[] members);\\n\\n /// @notice Emitted to announce the membership being defined by a contract.\\n /// @param definingContract The contract defining the membership.\\n event MembershipContractAnnounced(address indexed definingContract);\\n\\n /// @notice Checks if an account is a member of the DAO.\\n /// @param _account The address of the account to be checked.\\n /// @return Whether the account is a member or not.\\n /// @dev This function must be implemented in the plugin contract that introduces the members to the DAO.\\n function isMember(address _account) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4d0e1efbe511e6c9d802f6dcf535e8013f4c941faace4e8abbe08701c204b2a2\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/core/plugin/proposal/IProposal.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {IDAO} from \\\"../../dao/IDAO.sol\\\";\\n\\n/// @title IProposal\\n/// @author Aragon Association - 2022-2023\\n/// @notice An interface to be implemented by DAO plugins that create and execute proposals.\\ninterface IProposal {\\n /// @notice Emitted when a proposal is created.\\n /// @param proposalId The ID of the proposal.\\n /// @param creator The creator of the proposal.\\n /// @param startDate The start date of the proposal in seconds.\\n /// @param endDate The end date of the proposal in seconds.\\n /// @param metadata The metadata of the proposal.\\n /// @param actions The actions that will be executed if the proposal passes.\\n /// @param allowFailureMap A bitmap allowing the proposal to succeed, even if individual actions might revert. If the bit at index `i` is 1, the proposal succeeds even if the `i`th action reverts. A failure map value of 0 requires every action to not revert.\\n event ProposalCreated(\\n uint256 indexed proposalId,\\n address indexed creator,\\n uint64 startDate,\\n uint64 endDate,\\n bytes metadata,\\n IDAO.Action[] actions,\\n uint256 allowFailureMap\\n );\\n\\n /// @notice Emitted when a proposal is executed.\\n /// @param proposalId The ID of the proposal.\\n event ProposalExecuted(uint256 indexed proposalId);\\n\\n /// @notice Returns the proposal count determining the next proposal ID.\\n /// @return The proposal count.\\n function proposalCount() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xdbd1e47141bbe841ace905824aa6fb130620b8be601e0525214aecd4e15688b4\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/core/plugin/proposal/ProposalUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {CountersUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\\\";\\nimport {ERC165Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\\\";\\n\\nimport \\\"./IProposal.sol\\\";\\n\\n/// @title ProposalUgradeable\\n/// @author Aragon Association - 2022-2023\\n/// @notice An abstract contract containing the traits and internal functionality to create and execute proposals that can be inherited by upgradeable DAO plugins.\\nabstract contract ProposalUpgradeable is IProposal, ERC165Upgradeable {\\n using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n /// @notice The incremental ID for proposals and executions.\\n CountersUpgradeable.Counter private proposalCounter;\\n\\n /// @inheritdoc IProposal\\n function proposalCount() public view override returns (uint256) {\\n return proposalCounter.current();\\n }\\n\\n /// @notice Checks if this or the parent contract supports an interface by its ID.\\n /// @param _interfaceId The ID of the interface.\\n /// @return Returns `true` if the interface is supported.\\n function supportsInterface(bytes4 _interfaceId) public view virtual override returns (bool) {\\n return _interfaceId == type(IProposal).interfaceId || super.supportsInterface(_interfaceId);\\n }\\n\\n /// @notice Creates a proposal ID.\\n /// @return proposalId The proposal ID.\\n function _createProposalId() internal returns (uint256 proposalId) {\\n proposalId = proposalCount();\\n proposalCounter.increment();\\n }\\n\\n /// @notice Internal function to create a proposal.\\n /// @param _metadata The the proposal metadata.\\n /// @param _startDate The start date of the proposal in seconds.\\n /// @param _endDate The end date of the proposal in seconds.\\n /// @param _allowFailureMap A bitmap allowing the proposal to succeed, even if individual actions might revert. If the bit at index `i` is 1, the proposal succeeds even if the `i`th action reverts. A failure map value of 0 requires every action to not revert.\\n /// @param _actions The actions that will be executed after the proposal passes.\\n /// @return proposalId The ID of the proposal.\\n function _createProposal(\\n address _creator,\\n bytes calldata _metadata,\\n uint64 _startDate,\\n uint64 _endDate,\\n IDAO.Action[] calldata _actions,\\n uint256 _allowFailureMap\\n ) internal virtual returns (uint256 proposalId) {\\n proposalId = _createProposalId();\\n\\n emit ProposalCreated({\\n proposalId: proposalId,\\n creator: _creator,\\n metadata: _metadata,\\n startDate: _startDate,\\n endDate: _endDate,\\n actions: _actions,\\n allowFailureMap: _allowFailureMap\\n });\\n }\\n\\n /// @notice Internal function to execute a proposal.\\n /// @param _proposalId The ID of the proposal to be executed.\\n /// @param _actions The array of actions to be executed.\\n /// @param _allowFailureMap A bitmap allowing the proposal to succeed, even if individual actions might revert. If the bit at index `i` is 1, the proposal succeeds even if the `i`th action reverts. A failure map value of 0 requires every action to not revert.\\n /// @return execResults The array with the results of the executed actions.\\n /// @return failureMap The failure map encoding which actions have failed.\\n function _executeProposal(\\n IDAO _dao,\\n uint256 _proposalId,\\n IDAO.Action[] memory _actions,\\n uint256 _allowFailureMap\\n ) internal virtual returns (bytes[] memory execResults, uint256 failureMap) {\\n (execResults, failureMap) = _dao.execute(bytes32(_proposalId), _actions, _allowFailureMap);\\n emit ProposalExecuted({proposalId: _proposalId});\\n }\\n\\n /// @notice This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain (see [OpenZepplins guide about storage gaps](https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps)).\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xc400b5b58708d5464a0df6a9d4649f841eac670c08922ffb8a9e07d15be30d4e\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/core/utils/auth.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {IDAO} from \\\"../dao/IDAO.sol\\\";\\n\\n/// @notice Thrown if a call is unauthorized in the associated DAO.\\n/// @param dao The associated DAO.\\n/// @param where The context in which the authorization reverted.\\n/// @param who The address (EOA or contract) missing the permission.\\n/// @param permissionId The permission identifier.\\nerror DaoUnauthorized(address dao, address where, address who, bytes32 permissionId);\\n\\n/// @notice A free function checking if a caller is granted permissions on a target contract via a permission identifier that redirects the approval to a `PermissionCondition` if this was specified in the setup.\\n/// @param _where The address of the target contract for which `who` recieves permission.\\n/// @param _who The address (EOA or contract) owning the permission.\\n/// @param _permissionId The permission identifier.\\n/// @param _data The optional data passed to the `PermissionCondition` registered.\\nfunction _auth(\\n IDAO _dao,\\n address _where,\\n address _who,\\n bytes32 _permissionId,\\n bytes calldata _data\\n) view {\\n if (!_dao.hasPermission(_where, _who, _permissionId, _data))\\n revert DaoUnauthorized({\\n dao: address(_dao),\\n where: _where,\\n who: _who,\\n permissionId: _permissionId\\n });\\n}\\n\",\"keccak256\":\"0x5452788bbdaf93868177c15cefd71f57b5f83293d94a69d98d9505d4c9ec0015\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/plugins/governance/majority-voting/IMajorityVoting.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {IDAO} from \\\"../../../core/dao/IDAO.sol\\\";\\n\\n/// @title IMajorityVoting\\n/// @author Aragon Association - 2022-2023\\n/// @notice The interface of majority voting plugin.\\ninterface IMajorityVoting {\\n /// @notice Vote options that a voter can chose from.\\n /// @param None The default option state of a voter indicating the absence of from the vote. This option neither influences support nor participation.\\n /// @param Abstain This option does not influence the support but counts towards participation.\\n /// @param Yes This option increases the support and counts towards participation.\\n /// @param No This option decreases the support and counts towards participation.\\n enum VoteOption {\\n None,\\n Abstain,\\n Yes,\\n No\\n }\\n\\n /// @notice Emitted when a vote is cast by a voter.\\n /// @param proposalId The ID of the proposal.\\n /// @param voter The voter casting the vote.\\n /// @param voteOption The casted vote option.\\n /// @param votingPower The voting power behind this vote.\\n event VoteCast(\\n uint256 indexed proposalId,\\n address indexed voter,\\n VoteOption voteOption,\\n uint256 votingPower\\n );\\n\\n /// @notice Returns the support threshold parameter stored in the voting settings.\\n /// @return The support threshold parameter.\\n function supportThreshold() external view returns (uint32);\\n\\n /// @notice Returns the minimum participation parameter stored in the voting settings.\\n /// @return The minimum participation parameter.\\n function minParticipation() external view returns (uint32);\\n\\n /// @notice Checks if the support value defined as $$\\\\texttt{support} = \\\\frac{N_\\\\text{yes}}{N_\\\\text{yes}+N_\\\\text{no}}$$ for a proposal vote is greater than the support threshold.\\n /// @param _proposalId The ID of the proposal.\\n /// @return Returns `true` if the support is greater than the support threshold and `false` otherwise.\\n function isSupportThresholdReached(uint256 _proposalId) external view returns (bool);\\n\\n /// @notice Checks if the worst-case support value defined as $$\\\\texttt{worstCaseSupport} = \\\\frac{N_\\\\text{yes}}{ N_\\\\text{total}-N_\\\\text{abstain}}$$ for a proposal vote is greater than the support threshold.\\n /// @param _proposalId The ID of the proposal.\\n /// @return Returns `true` if the worst-case support is greater than the support threshold and `false` otherwise.\\n function isSupportThresholdReachedEarly(uint256 _proposalId) external view returns (bool);\\n\\n /// @notice Checks if the participation value defined as $$\\\\texttt{participation} = \\\\frac{N_\\\\text{yes}+N_\\\\text{no}+N_\\\\text{abstain}}{N_\\\\text{total}}$$ for a proposal vote is greater or equal than the minimum participation value.\\n /// @param _proposalId The ID of the proposal.\\n /// @return Returns `true` if the participation is greater than the minimum particpation and `false` otherwise.\\n function isMinParticipationReached(uint256 _proposalId) external view returns (bool);\\n\\n /// @notice Checks if an account can participate on a proposal vote. This can be because the vote\\n /// - has not started,\\n /// - has ended,\\n /// - was executed, or\\n /// - the voter doesn't have voting powers.\\n /// @param _proposalId The proposal Id.\\n /// @param _account The account address to be checked.\\n /// @param _voteOption Whether the voter abstains, supports or opposes the proposal.\\n /// @return Returns true if the account is allowed to vote.\\n /// @dev The function assumes the queried proposal exists.\\n function canVote(\\n uint256 _proposalId,\\n address _account,\\n VoteOption _voteOption\\n ) external view returns (bool);\\n\\n /// @notice Checks if a proposal can be executed.\\n /// @param _proposalId The ID of the proposal to be checked.\\n /// @return True if the proposal can be executed, false otherwise.\\n function canExecute(uint256 _proposalId) external view returns (bool);\\n\\n /// @notice Votes for a vote option and, optionally, executes the proposal.\\n /// @dev `_voteOption`, 1 -> abstain, 2 -> yes, 3 -> no\\n /// @param _proposalId The ID of the proposal.\\n /// @param _voteOption The chosen vote option.\\n /// @param _tryEarlyExecution If `true`, early execution is tried after the vote cast. The call does not revert if early execution is not possible.\\n function vote(uint256 _proposalId, VoteOption _voteOption, bool _tryEarlyExecution) external;\\n\\n /// @notice Executes a proposal.\\n /// @param _proposalId The ID of the proposal to be executed.\\n function execute(uint256 _proposalId) external;\\n\\n /// @notice Returns whether the account has voted for the proposal. Note, that this does not check if the account has voting power.\\n /// @param _proposalId The ID of the proposal.\\n /// @param _account The account address to be checked.\\n /// @return The vote option cast by a voter for a certain proposal.\\n function getVoteOption(\\n uint256 _proposalId,\\n address _account\\n ) external view returns (VoteOption);\\n}\\n\",\"keccak256\":\"0xe4fbc4c8cb0db3ad4878db69ca88044136c8474cb4751aa49c6910a80e55d742\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/plugins/governance/majority-voting/MajorityVotingBase.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {ERC165Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\\\";\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {SafeCastUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol\\\";\\n\\nimport {IProposal} from \\\"../../../core/plugin/proposal/IProposal.sol\\\";\\nimport {ProposalUpgradeable} from \\\"../../../core/plugin/proposal/ProposalUpgradeable.sol\\\";\\nimport {PluginUUPSUpgradeable} from \\\"../../../core/plugin/PluginUUPSUpgradeable.sol\\\";\\nimport {IDAO} from \\\"../../../core/dao/IDAO.sol\\\";\\nimport {RATIO_BASE, RatioOutOfBounds} from \\\"../../utils/Ratio.sol\\\";\\nimport {IMajorityVoting} from \\\"./IMajorityVoting.sol\\\";\\n\\n/// @title MajorityVotingBase\\n/// @author Aragon Association - 2022-2023\\n/// @notice The abstract implementation of majority voting plugins.\\n///\\n/// ### Parameterization\\n///\\n/// We define two parameters\\n/// $$\\\\texttt{support} = \\\\frac{N_\\\\text{yes}}{N_\\\\text{yes} + N_\\\\text{no}} \\\\in [0,1]$$\\n/// and\\n/// $$\\\\texttt{participation} = \\\\frac{N_\\\\text{yes} + N_\\\\text{no} + N_\\\\text{abstain}}{N_\\\\text{total}} \\\\in [0,1],$$\\n/// where $N_\\\\text{yes}$, $N_\\\\text{no}$, and $N_\\\\text{abstain}$ are the yes, no, and abstain votes that have been cast and $N_\\\\text{total}$ is the total voting power available at proposal creation time.\\n///\\n/// #### Limit Values: Support Threshold & Minimum Participation\\n///\\n/// Two limit values are associated with these parameters and decide if a proposal execution should be possible: $\\\\texttt{supportThreshold} \\\\in [0,1]$ and $\\\\texttt{minParticipation} \\\\in [0,1]$.\\n///\\n/// For threshold values, $>$ comparison is used. This **does not** include the threshold value. E.g., for $\\\\texttt{supportThreshold} = 50\\\\%$, the criterion is fulfilled if there is at least one more yes than no votes ($N_\\\\text{yes} = N_\\\\text{no} + 1$).\\n/// For minimum values, $\\\\ge{}$ comparison is used. This **does** include the minimum participation value. E.g., for $\\\\texttt{minParticipation} = 40\\\\%$ and $N_\\\\text{total} = 10$, the criterion is fulfilled if 4 out of 10 votes were casted.\\n///\\n/// Majority voting implies that the support threshold is set with\\n/// $$\\\\texttt{supportThreshold} \\\\ge 50\\\\% .$$\\n/// However, this is not enforced by the contract code and developers can make unsafe parameters and only the frontend will warn about bad parameter settings.\\n///\\n/// ### Execution Criteria\\n///\\n/// After the vote is closed, two criteria decide if the proposal passes.\\n///\\n/// #### The Support Criterion\\n///\\n/// For a proposal to pass, the required ratio of yes and no votes must be met:\\n/// $$(1- \\\\texttt{supportThreshold}) \\\\cdot N_\\\\text{yes} > \\\\texttt{supportThreshold} \\\\cdot N_\\\\text{no}.$$\\n/// Note, that the inequality yields the simple majority voting condition for $\\\\texttt{supportThreshold}=\\\\frac{1}{2}$.\\n///\\n/// #### The Participation Criterion\\n///\\n/// For a proposal to pass, the minimum voting power must have been cast:\\n/// $$N_\\\\text{yes} + N_\\\\text{no} + N_\\\\text{abstain} \\\\ge \\\\texttt{minVotingPower},$$\\n/// where $\\\\texttt{minVotingPower} = \\\\texttt{minParticipation} \\\\cdot N_\\\\text{total}$.\\n///\\n/// ### Vote Replacement Execution\\n///\\n/// The contract allows votes to be replaced. Voters can vote multiple times and only the latest voteOption is tallied.\\n///\\n/// ### Early Execution\\n///\\n/// This contract allows a proposal to be executed early, iff the vote outcome cannot change anymore by more people voting. Accordingly, vote replacement and early execution are /// mutually exclusive options.\\n/// The outcome cannot change anymore iff the support threshold is met even if all remaining votes are no votes. We call this number the worst-case number of no votes and define it as\\n///\\n/// $$N_\\\\text{no, worst-case} = N_\\\\text{no, worst-case} + \\\\texttt{remainingVotes}$$\\n///\\n/// where\\n///\\n/// $$\\\\texttt{remainingVotes} = N_\\\\text{total}-\\\\underbrace{(N_\\\\text{yes}+N_\\\\text{no}+N_\\\\text{abstain})}_{\\\\text{turnout}}.$$\\n///\\n/// We can use this quantity to calculate the worst-case support that would be obtained if all remaining votes are casted with no:\\n///\\n/// $$\\n/// \\\\begin{align*}\\n/// \\\\texttt{worstCaseSupport}\\n/// &= \\\\frac{N_\\\\text{yes}}{N_\\\\text{yes} + (N_\\\\text{no, worst-case})} \\\\\\\\[3mm]\\n/// &= \\\\frac{N_\\\\text{yes}}{N_\\\\text{yes} + (N_\\\\text{no} + \\\\texttt{remainingVotes})} \\\\\\\\[3mm]\\n/// &= \\\\frac{N_\\\\text{yes}}{N_\\\\text{yes} + N_\\\\text{no} + N_\\\\text{total} - (N_\\\\text{yes} + N_\\\\text{no} + N_\\\\text{abstain})} \\\\\\\\[3mm]\\n/// &= \\\\frac{N_\\\\text{yes}}{N_\\\\text{total} - N_\\\\text{abstain}}\\n/// \\\\end{align*}\\n/// $$\\n///\\n/// In analogy, we can modify [the support criterion](#the-support-criterion) from above to allow for early execution:\\n///\\n/// $$\\n/// \\\\begin{align*}\\n/// (1 - \\\\texttt{supportThreshold}) \\\\cdot N_\\\\text{yes}\\n/// &> \\\\texttt{supportThreshold} \\\\cdot N_\\\\text{no, worst-case} \\\\\\\\[3mm]\\n/// &> \\\\texttt{supportThreshold} \\\\cdot (N_\\\\text{no} + \\\\texttt{remainingVotes}) \\\\\\\\[3mm]\\n/// &> \\\\texttt{supportThreshold} \\\\cdot (N_\\\\text{no} + N_\\\\text{total}-(N_\\\\text{yes}+N_\\\\text{no}+N_\\\\text{abstain})) \\\\\\\\[3mm]\\n/// &> \\\\texttt{supportThreshold} \\\\cdot (N_\\\\text{total} - N_\\\\text{yes} - N_\\\\text{abstain})\\n/// \\\\end{align*}\\n/// $$\\n///\\n/// Accordingly, early execution is possible when the vote is open, the modified support criterion, and the particicpation criterion are met.\\n/// @dev This contract implements the `IMajorityVoting` interface.\\nabstract contract MajorityVotingBase is\\n IMajorityVoting,\\n Initializable,\\n ERC165Upgradeable,\\n PluginUUPSUpgradeable,\\n ProposalUpgradeable\\n{\\n using SafeCastUpgradeable for uint256;\\n\\n /// @notice The different voting modes available.\\n /// @param Standard In standard mode, early execution and vote replacement are disabled.\\n /// @param EarlyExecution In early execution mode, a proposal can be executed early before the end date if the vote outcome cannot mathematically change by more voters voting.\\n /// @param VoteReplacment In vote replacement mode, voters can change their vote multiple times and only the latest vote option is tallied.\\n enum VotingMode {\\n Standard,\\n EarlyExecution,\\n VoteReplacement\\n }\\n\\n /// @notice A container for the majority voting settings that will be applied as parameters on proposal creation.\\n /// @param votingMode A parameter to select the vote mode.\\n /// @param supportThreshold The support threshold value. Its value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`.\\n /// @param minParticipation The minimum participation value. Its value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`.\\n /// @param minDuration The minimum duration of the proposal vote in seconds.\\n /// @param minProposerVotingPower The minimum voting power required to create a proposal.\\n struct VotingSettings {\\n VotingMode votingMode;\\n uint32 supportThreshold;\\n uint32 minParticipation;\\n uint64 minDuration;\\n uint256 minProposerVotingPower;\\n }\\n\\n /// @notice A container for proposal-related information.\\n /// @param executed Whether the proposal is executed or not.\\n /// @param parameters The proposal parameters at the time of the proposal creation.\\n /// @param tally The vote tally of the proposal.\\n /// @param voters The votes casted by the voters.\\n /// @param actions The actions to be executed when the proposal passes.\\n /// @param allowFailureMap A bitmap allowing the proposal to succeed, even if individual actions might revert. If the bit at index `i` is 1, the proposal succeeds even if the `i`th action reverts. A failure map value of 0 requires every action to not revert.\\n struct Proposal {\\n bool executed;\\n ProposalParameters parameters;\\n Tally tally;\\n mapping(address => IMajorityVoting.VoteOption) voters;\\n IDAO.Action[] actions;\\n uint256 allowFailureMap;\\n }\\n\\n /// @notice A container for the proposal parameters at the time of proposal creation.\\n /// @param votingMode A parameter to select the vote mode.\\n /// @param supportThreshold The support threshold value. The value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`.\\n /// @param startDate The start date of the proposal vote.\\n /// @param endDate The end date of the proposal vote.\\n /// @param snapshotBlock The number of the block prior to the proposal creation.\\n /// @param minVotingPower The minimum voting power needed.\\n struct ProposalParameters {\\n VotingMode votingMode;\\n uint32 supportThreshold;\\n uint64 startDate;\\n uint64 endDate;\\n uint64 snapshotBlock;\\n uint256 minVotingPower;\\n }\\n\\n /// @notice A container for the proposal vote tally.\\n /// @param abstain The number of abstain votes casted.\\n /// @param yes The number of yes votes casted.\\n /// @param no The number of no votes casted.\\n struct Tally {\\n uint256 abstain;\\n uint256 yes;\\n uint256 no;\\n }\\n\\n /// @notice The [ERC-165](https://eips.ethereum.org/EIPS/eip-165) interface ID of the contract.\\n bytes4 internal constant MAJORITY_VOTING_BASE_INTERFACE_ID =\\n this.minDuration.selector ^\\n this.minProposerVotingPower.selector ^\\n this.votingMode.selector ^\\n this.totalVotingPower.selector ^\\n this.getProposal.selector ^\\n this.updateVotingSettings.selector ^\\n this.createProposal.selector;\\n\\n /// @notice The ID of the permission required to call the `updateVotingSettings` function.\\n bytes32 public constant UPDATE_VOTING_SETTINGS_PERMISSION_ID =\\n keccak256(\\\"UPDATE_VOTING_SETTINGS_PERMISSION\\\");\\n\\n /// @notice A mapping between proposal IDs and proposal information.\\n mapping(uint256 => Proposal) internal proposals;\\n\\n /// @notice The struct storing the voting settings.\\n VotingSettings private votingSettings;\\n\\n /// @notice Thrown if a date is out of bounds.\\n /// @param limit The limit value.\\n /// @param actual The actual value.\\n error DateOutOfBounds(uint64 limit, uint64 actual);\\n\\n /// @notice Thrown if the minimal duration value is out of bounds (less than one hour or greater than 1 year).\\n /// @param limit The limit value.\\n /// @param actual The actual value.\\n error MinDurationOutOfBounds(uint64 limit, uint64 actual);\\n\\n /// @notice Thrown when a sender is not allowed to create a proposal.\\n /// @param sender The sender address.\\n error ProposalCreationForbidden(address sender);\\n\\n /// @notice Thrown if an account is not allowed to cast a vote. This can be because the vote\\n /// - has not started,\\n /// - has ended,\\n /// - was executed, or\\n /// - the account doesn't have voting powers.\\n /// @param proposalId The ID of the proposal.\\n /// @param account The address of the _account.\\n /// @param voteOption The chosen vote option.\\n error VoteCastForbidden(uint256 proposalId, address account, VoteOption voteOption);\\n\\n /// @notice Thrown if the proposal execution is forbidden.\\n /// @param proposalId The ID of the proposal.\\n error ProposalExecutionForbidden(uint256 proposalId);\\n\\n /// @notice Emitted when the voting settings are updated.\\n /// @param votingMode A parameter to select the vote mode.\\n /// @param supportThreshold The support threshold value.\\n /// @param minParticipation The minimum participation value.\\n /// @param minDuration The minimum duration of the proposal vote in seconds.\\n /// @param minProposerVotingPower The minimum voting power required to create a proposal.\\n event VotingSettingsUpdated(\\n VotingMode votingMode,\\n uint32 supportThreshold,\\n uint32 minParticipation,\\n uint64 minDuration,\\n uint256 minProposerVotingPower\\n );\\n\\n /// @notice Initializes the component to be used by inheriting contracts.\\n /// @dev This method is required to support [ERC-1822](https://eips.ethereum.org/EIPS/eip-1822).\\n /// @param _dao The IDAO interface of the associated DAO.\\n /// @param _votingSettings The voting settings.\\n function __MajorityVotingBase_init(\\n IDAO _dao,\\n VotingSettings calldata _votingSettings\\n ) internal onlyInitializing {\\n __PluginUUPSUpgradeable_init(_dao);\\n _updateVotingSettings(_votingSettings);\\n }\\n\\n /// @notice Checks if this or the parent contract supports an interface by its ID.\\n /// @param _interfaceId The ID of the interface.\\n /// @return Returns `true` if the interface is supported.\\n function supportsInterface(\\n bytes4 _interfaceId\\n )\\n public\\n view\\n virtual\\n override(ERC165Upgradeable, PluginUUPSUpgradeable, ProposalUpgradeable)\\n returns (bool)\\n {\\n return\\n _interfaceId == MAJORITY_VOTING_BASE_INTERFACE_ID ||\\n _interfaceId == type(IMajorityVoting).interfaceId ||\\n super.supportsInterface(_interfaceId);\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function vote(\\n uint256 _proposalId,\\n VoteOption _voteOption,\\n bool _tryEarlyExecution\\n ) public virtual {\\n address account = _msgSender();\\n\\n if (!_canVote(_proposalId, account, _voteOption)) {\\n revert VoteCastForbidden({\\n proposalId: _proposalId,\\n account: account,\\n voteOption: _voteOption\\n });\\n }\\n _vote(_proposalId, _voteOption, account, _tryEarlyExecution);\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function execute(uint256 _proposalId) public virtual {\\n if (!_canExecute(_proposalId)) {\\n revert ProposalExecutionForbidden(_proposalId);\\n }\\n _execute(_proposalId);\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function getVoteOption(\\n uint256 _proposalId,\\n address _voter\\n ) public view virtual returns (VoteOption) {\\n return proposals[_proposalId].voters[_voter];\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function canVote(\\n uint256 _proposalId,\\n address _voter,\\n VoteOption _voteOption\\n ) public view virtual returns (bool) {\\n return _canVote(_proposalId, _voter, _voteOption);\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function canExecute(uint256 _proposalId) public view virtual returns (bool) {\\n return _canExecute(_proposalId);\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function isSupportThresholdReached(uint256 _proposalId) public view virtual returns (bool) {\\n Proposal storage proposal_ = proposals[_proposalId];\\n\\n // The code below implements the formula of the support criterion explained in the top of this file.\\n // `(1 - supportThreshold) * N_yes > supportThreshold * N_no`\\n return\\n (RATIO_BASE - proposal_.parameters.supportThreshold) * proposal_.tally.yes >\\n proposal_.parameters.supportThreshold * proposal_.tally.no;\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function isSupportThresholdReachedEarly(\\n uint256 _proposalId\\n ) public view virtual returns (bool) {\\n Proposal storage proposal_ = proposals[_proposalId];\\n\\n uint256 noVotesWorstCase = totalVotingPower(proposal_.parameters.snapshotBlock) -\\n proposal_.tally.yes -\\n proposal_.tally.abstain;\\n\\n // The code below implements the formula of the early execution support criterion explained in the top of this file.\\n // `(1 - supportThreshold) * N_yes > supportThreshold * N_no,worst-case`\\n return\\n (RATIO_BASE - proposal_.parameters.supportThreshold) * proposal_.tally.yes >\\n proposal_.parameters.supportThreshold * noVotesWorstCase;\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function isMinParticipationReached(uint256 _proposalId) public view virtual returns (bool) {\\n Proposal storage proposal_ = proposals[_proposalId];\\n\\n // The code below implements the formula of the participation criterion explained in the top of this file.\\n // `N_yes + N_no + N_abstain >= minVotingPower = minParticipation * N_total`\\n return\\n proposal_.tally.yes + proposal_.tally.no + proposal_.tally.abstain >=\\n proposal_.parameters.minVotingPower;\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function supportThreshold() public view virtual returns (uint32) {\\n return votingSettings.supportThreshold;\\n }\\n\\n /// @inheritdoc IMajorityVoting\\n function minParticipation() public view virtual returns (uint32) {\\n return votingSettings.minParticipation;\\n }\\n\\n /// @notice Returns the minimum duration parameter stored in the voting settings.\\n /// @return The minimum duration parameter.\\n function minDuration() public view virtual returns (uint64) {\\n return votingSettings.minDuration;\\n }\\n\\n /// @notice Returns the minimum voting power required to create a proposa stored in the voting settings.\\n /// @return The minimum voting power required to create a proposal.\\n function minProposerVotingPower() public view virtual returns (uint256) {\\n return votingSettings.minProposerVotingPower;\\n }\\n\\n /// @notice Returns the vote mode stored in the voting settings.\\n /// @return The vote mode parameter.\\n function votingMode() public view virtual returns (VotingMode) {\\n return votingSettings.votingMode;\\n }\\n\\n /// @notice Returns the total voting power checkpointed for a specific block number.\\n /// @param _blockNumber The block number.\\n /// @return The total voting power.\\n function totalVotingPower(uint256 _blockNumber) public view virtual returns (uint256);\\n\\n /// @notice Returns all information for a proposal vote by its ID.\\n /// @param _proposalId The ID of the proposal.\\n /// @return open Whether the proposal is open or not.\\n /// @return executed Whether the proposal is executed or not.\\n /// @return parameters The parameters of the proposal vote.\\n /// @return tally The current tally of the proposal vote.\\n /// @return actions The actions to be executed in the associated DAO after the proposal has passed.\\n /// @return allowFailureMap The bit map representations of which actions are allowed to revert so tx still succeeds.\\n function getProposal(\\n uint256 _proposalId\\n )\\n public\\n view\\n virtual\\n returns (\\n bool open,\\n bool executed,\\n ProposalParameters memory parameters,\\n Tally memory tally,\\n IDAO.Action[] memory actions,\\n uint256 allowFailureMap\\n )\\n {\\n Proposal storage proposal_ = proposals[_proposalId];\\n\\n open = _isProposalOpen(proposal_);\\n executed = proposal_.executed;\\n parameters = proposal_.parameters;\\n tally = proposal_.tally;\\n actions = proposal_.actions;\\n allowFailureMap = proposal_.allowFailureMap;\\n }\\n\\n /// @notice Updates the voting settings.\\n /// @param _votingSettings The new voting settings.\\n function updateVotingSettings(\\n VotingSettings calldata _votingSettings\\n ) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) {\\n _updateVotingSettings(_votingSettings);\\n }\\n\\n /// @notice Creates a new majority voting proposal.\\n /// @param _metadata The metadata of the proposal.\\n /// @param _actions The actions that will be executed after the proposal passes.\\n /// @param _allowFailureMap Allows proposal to succeed even if an action reverts. Uses bitmap representation. If the bit at index `x` is 1, the tx succeeds even if the action at `x` failed. Passing 0 will be treated as atomic execution.\\n /// @param _startDate The start date of the proposal vote. If 0, the current timestamp is used and the vote starts immediately.\\n /// @param _endDate The end date of the proposal vote. If 0, `_startDate + minDuration` is used.\\n /// @param _voteOption The chosen vote option to be casted on proposal creation.\\n /// @param _tryEarlyExecution If `true`, early execution is tried after the vote cast. The call does not revert if early execution is not possible.\\n /// @return proposalId The ID of the proposal.\\n function createProposal(\\n bytes calldata _metadata,\\n IDAO.Action[] calldata _actions,\\n uint256 _allowFailureMap,\\n uint64 _startDate,\\n uint64 _endDate,\\n VoteOption _voteOption,\\n bool _tryEarlyExecution\\n ) external virtual returns (uint256 proposalId);\\n\\n /// @notice Internal function to cast a vote. It assumes the queried vote exists.\\n /// @param _proposalId The ID of the proposal.\\n /// @param _voteOption The chosen vote option to be casted on the proposal vote.\\n /// @param _tryEarlyExecution If `true`, early execution is tried after the vote cast. The call does not revert if early execution is not possible.\\n function _vote(\\n uint256 _proposalId,\\n VoteOption _voteOption,\\n address _voter,\\n bool _tryEarlyExecution\\n ) internal virtual;\\n\\n /// @notice Internal function to execute a vote. It assumes the queried proposal exists.\\n /// @param _proposalId The ID of the proposal.\\n function _execute(uint256 _proposalId) internal virtual {\\n proposals[_proposalId].executed = true;\\n\\n _executeProposal(\\n dao(),\\n _proposalId,\\n proposals[_proposalId].actions,\\n proposals[_proposalId].allowFailureMap\\n );\\n }\\n\\n /// @notice Internal function to check if a voter can vote. It assumes the queried proposal exists.\\n /// @param _proposalId The ID of the proposal.\\n /// @param _voter The address of the voter to check.\\n /// @param _voteOption Whether the voter abstains, supports or opposes the proposal.\\n /// @return Returns `true` if the given voter can vote on a certain proposal and `false` otherwise.\\n function _canVote(\\n uint256 _proposalId,\\n address _voter,\\n VoteOption _voteOption\\n ) internal view virtual returns (bool);\\n\\n /// @notice Internal function to check if a proposal can be executed. It assumes the queried proposal exists.\\n /// @param _proposalId The ID of the proposal.\\n /// @return True if the proposal can be executed, false otherwise.\\n /// @dev Threshold and minimal values are compared with `>` and `>=` comparators, respectively.\\n function _canExecute(uint256 _proposalId) internal view virtual returns (bool) {\\n Proposal storage proposal_ = proposals[_proposalId];\\n\\n // Verify that the vote has not been executed already.\\n if (proposal_.executed) {\\n return false;\\n }\\n\\n if (_isProposalOpen(proposal_)) {\\n // Early execution\\n if (proposal_.parameters.votingMode != VotingMode.EarlyExecution) {\\n return false;\\n }\\n if (!isSupportThresholdReachedEarly(_proposalId)) {\\n return false;\\n }\\n } else {\\n // Normal execution\\n if (!isSupportThresholdReached(_proposalId)) {\\n return false;\\n }\\n }\\n if (!isMinParticipationReached(_proposalId)) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /// @notice Internal function to check if a proposal vote is still open.\\n /// @param proposal_ The proposal struct.\\n /// @return True if the proposal vote is open, false otherwise.\\n function _isProposalOpen(Proposal storage proposal_) internal view virtual returns (bool) {\\n uint64 currentTime = block.timestamp.toUint64();\\n\\n return\\n proposal_.parameters.startDate <= currentTime &&\\n currentTime < proposal_.parameters.endDate &&\\n !proposal_.executed;\\n }\\n\\n /// @notice Internal function to update the plugin-wide proposal vote settings.\\n /// @param _votingSettings The voting settings to be validated and updated.\\n function _updateVotingSettings(VotingSettings calldata _votingSettings) internal virtual {\\n // Require the support threshold value to be in the interval [0, 10^6-1], because `>` comparision is used in the support criterion and >100% could never be reached.\\n if (_votingSettings.supportThreshold > RATIO_BASE - 1) {\\n revert RatioOutOfBounds({\\n limit: RATIO_BASE - 1,\\n actual: _votingSettings.supportThreshold\\n });\\n }\\n\\n // Require the minimum participation value to be in the interval [0, 10^6], because `>=` comparision is used in the participation criterion.\\n if (_votingSettings.minParticipation > RATIO_BASE) {\\n revert RatioOutOfBounds({limit: RATIO_BASE, actual: _votingSettings.minParticipation});\\n }\\n\\n if (_votingSettings.minDuration < 60 minutes) {\\n revert MinDurationOutOfBounds({limit: 60 minutes, actual: _votingSettings.minDuration});\\n }\\n\\n if (_votingSettings.minDuration > 365 days) {\\n revert MinDurationOutOfBounds({limit: 365 days, actual: _votingSettings.minDuration});\\n }\\n\\n votingSettings = _votingSettings;\\n\\n emit VotingSettingsUpdated({\\n votingMode: _votingSettings.votingMode,\\n supportThreshold: _votingSettings.supportThreshold,\\n minParticipation: _votingSettings.minParticipation,\\n minDuration: _votingSettings.minDuration,\\n minProposerVotingPower: _votingSettings.minProposerVotingPower\\n });\\n }\\n\\n /// @notice Validates and returns the proposal vote dates.\\n /// @param _start The start date of the proposal vote. If 0, the current timestamp is used and the vote starts immediately.\\n /// @param _end The end date of the proposal vote. If 0, `_start + minDuration` is used.\\n /// @return startDate The validated start date of the proposal vote.\\n /// @return endDate The validated end date of the proposal vote.\\n function _validateProposalDates(\\n uint64 _start,\\n uint64 _end\\n ) internal view virtual returns (uint64 startDate, uint64 endDate) {\\n uint64 currentTimestamp = block.timestamp.toUint64();\\n\\n if (_start == 0) {\\n startDate = currentTimestamp;\\n } else {\\n startDate = _start;\\n\\n if (startDate < currentTimestamp) {\\n revert DateOutOfBounds({limit: currentTimestamp, actual: startDate});\\n }\\n }\\n\\n uint64 earliestEndDate = startDate + votingSettings.minDuration; // Since `minDuration` is limited to 1 year, `startDate + minDuration` can only overflow if the `startDate` is after `type(uint64).max - minDuration`. In this case, the proposal creation will revert and another date can be picked.\\n\\n if (_end == 0) {\\n endDate = earliestEndDate;\\n } else {\\n endDate = _end;\\n\\n if (endDate < earliestEndDate) {\\n revert DateOutOfBounds({limit: earliestEndDate, actual: endDate});\\n }\\n }\\n }\\n\\n /// @notice This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain (see [OpenZepplins guide about storage gaps](https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps)).\\n uint256[47] private __gap;\\n}\\n\",\"keccak256\":\"0x23dd2a0aec819888bbfd69d7e8fd5ca2a1cdd513b50c2c04b46298faeb3eae45\",\"license\":\"AGPL-3.0-or-later\"},\"@aragon/osx/plugins/utils/Ratio.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\n// The base value to encode real-valued ratios on the interval `[0,1]` as integers on the interval `[0, 10**6]`.\\nuint256 constant RATIO_BASE = 10 ** 6;\\n\\n/// @notice Thrown if a ratio value exceeds the maximal value of `10**6`.\\n/// @param limit The maximal value.\\n/// @param actual The actual value.\\nerror RatioOutOfBounds(uint256 limit, uint256 actual);\\n\\n/// @notice Applies a ratio to a value and ceils the remainder.\\n/// @param _value The value to which the ratio is applied.\\n/// @param _ratio The ratio that must be in the interval `[0, 10**6]`.\\n/// @return result The resulting value.\\nfunction _applyRatioCeiled(uint256 _value, uint256 _ratio) pure returns (uint256 result) {\\n if (_ratio > RATIO_BASE) {\\n revert RatioOutOfBounds({limit: RATIO_BASE, actual: _ratio});\\n }\\n\\n _value = _value * _ratio;\\n uint256 remainder = _value % RATIO_BASE;\\n result = _value / RATIO_BASE;\\n\\n // Check if ceiling is needed\\n if (remainder != 0) {\\n ++result;\\n }\\n}\\n\",\"keccak256\":\"0x1f4e7292bb5df899773938067290aef9a78f6a3bfaff24873698390b0584f30d\",\"license\":\"AGPL-3.0-or-later\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable {\\n function __ERC1967Upgrade_init() internal onlyInitializing {\\n }\\n\\n function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n }\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n _functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n }\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) {\\n require(AddressUpgradeable.isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return AddressUpgradeable.verifyCallResult(success, returndata, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x315887e846f1e5f8d8fa535a229d318bb9290aaa69485117f1ee8a9a6b3be823\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x7967d130887c4b40666cd88f8744691d4527039a1b2a38aa0de41481ef646778\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary CountersUpgradeable {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0x798741e231b22b81e2dd2eddaaf8832dee4baf5cd8e2dbaa5c1dd12a1c053c4d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlotUpgradeable {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0x09864aea84f01e39313375b5610c73a3c1c68abbdc51e5ccdd25ff977fdadf9a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n function __ERC165_init() internal onlyInitializing {\\n }\\n\\n function __ERC165_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165Upgradeable).interfaceId;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n downcasted = int248(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n downcasted = int240(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n downcasted = int232(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n downcasted = int224(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n downcasted = int216(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n downcasted = int208(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n downcasted = int200(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n downcasted = int192(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n downcasted = int184(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n downcasted = int176(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n downcasted = int168(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n downcasted = int160(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n downcasted = int152(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n downcasted = int144(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n downcasted = int136(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n downcasted = int128(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n downcasted = int120(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n downcasted = int112(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n downcasted = int104(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n downcasted = int96(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n downcasted = int88(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n downcasted = int80(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n downcasted = int72(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n downcasted = int64(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n downcasted = int56(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n downcasted = int48(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n downcasted = int40(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n downcasted = int32(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n downcasted = int24(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n downcasted = int16(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n downcasted = int8(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0xcef50f95b43b038aa40aed25b62fc45906c681a5c1d504a4fdcf3bc6330a8d4b\",\"license\":\"MIT\"},\"contracts/LensVotingPlugin.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\nimport {IFollowNFT} from \\\"./interfaces/IFollowNFT.sol\\\";\\nimport {SafeCastUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol\\\";\\nimport {IMembership} from \\\"@aragon/osx/core/plugin/membership/IMembership.sol\\\";\\nimport {IMajorityVoting} from \\\"@aragon/osx/plugins/governance/majority-voting/IMajorityVoting.sol\\\";\\nimport {MajorityVotingBase} from \\\"@aragon/osx/plugins/governance/majority-voting/MajorityVotingBase.sol\\\";\\nimport {IDAO} from \\\"@aragon/osx/core/dao/IDAO.sol\\\";\\n\\nimport {RATIO_BASE, _applyRatioCeiled} from \\\"./utils/Ratio.sol\\\";\\n\\n/// @title TokenVoting\\n/// @author Aragon Association - 2021-2023\\n/// @notice The majority voting implementation using an [OpenZepplin `Votes`](https://docs.openzeppelin.com/contracts/4.x/api/governance#Votes) compatible governance token.\\n/// @dev This contract inherits from `MajorityVotingBase` and implements the `IMajorityVoting` interface.\\ncontract LensVotingPlugin is IMembership, MajorityVotingBase {\\n using SafeCastUpgradeable for uint256;\\n\\n /// @notice The [ERC-165](https://eips.ethereum.org/EIPS/eip-165) interface ID of the contract.\\n bytes4 internal constant TOKEN_VOTING_INTERFACE_ID =\\n this.initialize.selector ^ this.getVotingToken.selector;\\n\\n /// @notice An [OpenZepplin `Votes`](https://docs.openzeppelin.com/contracts/4.x/api/governance#Votes) compatible contract referencing the token being used for voting.\\n IFollowNFT private votingToken;\\n\\n /// @notice Thrown if the voting power is zero\\n error NoVotingPower();\\n\\n /// @notice Initializes the component.\\n /// @dev This method is required to support [ERC-1822](https://eips.ethereum.org/EIPS/eip-1822).\\n /// @param _dao The IDAO interface of the associated DAO.\\n /// @param _votingSettings The voting settings.\\n /// @param _token The governance token.\\n function initialize(\\n IDAO _dao,\\n VotingSettings calldata _votingSettings,\\n IFollowNFT _token\\n ) external initializer {\\n __MajorityVotingBase_init(_dao, _votingSettings);\\n\\n votingToken = _token;\\n\\n emit MembershipContractAnnounced({definingContract: address(_token)});\\n }\\n\\n /// @notice Checks if this or the parent contract supports an interface by its ID.\\n /// @param _interfaceId The ID of the interface.\\n /// @return Returns `true` if the interface is supported.\\n function supportsInterface(bytes4 _interfaceId) public view virtual override returns (bool) {\\n return\\n _interfaceId == TOKEN_VOTING_INTERFACE_ID ||\\n _interfaceId == type(IMembership).interfaceId ||\\n super.supportsInterface(_interfaceId);\\n }\\n\\n /// @notice getter function for the voting token.\\n /// @dev public function also useful for registering interfaceId and for distinguishing from majority voting interface.\\n /// @return The token used for voting.\\n function getVotingToken() public view returns (IFollowNFT) {\\n return votingToken;\\n }\\n\\n /// @inheritdoc MajorityVotingBase\\n function totalVotingPower(uint256 _blockNumber) public view override returns (uint256) {\\n return votingToken.getDelegatedSupplyByBlockNumber(_blockNumber);\\n }\\n\\n /// @inheritdoc MajorityVotingBase\\n function createProposal(\\n bytes calldata _metadata,\\n IDAO.Action[] calldata _actions,\\n uint256 _allowFailureMap,\\n uint64 _startDate,\\n uint64 _endDate,\\n VoteOption _voteOption,\\n bool _tryEarlyExecution\\n ) external override returns (uint256 proposalId) {\\n uint256 snapshotBlock;\\n unchecked {\\n snapshotBlock = block.number - 1;\\n }\\n\\n uint256 totalVotingPower_ = totalVotingPower(snapshotBlock);\\n\\n if (totalVotingPower_ == 0) {\\n revert NoVotingPower();\\n }\\n\\n if (votingToken.getPowerByBlockNumber(_msgSender(), snapshotBlock) < minProposerVotingPower()) {\\n revert ProposalCreationForbidden(_msgSender());\\n }\\n\\n proposalId = _createProposal({\\n _creator: _msgSender(),\\n _metadata: _metadata,\\n _startDate: _startDate,\\n _endDate: _endDate,\\n _actions: _actions,\\n _allowFailureMap: _allowFailureMap\\n });\\n\\n // Store proposal related information\\n Proposal storage proposal_ = proposals[proposalId];\\n\\n (proposal_.parameters.startDate, proposal_.parameters.endDate) = _validateProposalDates(\\n _startDate,\\n _endDate\\n );\\n proposal_.parameters.snapshotBlock = snapshotBlock.toUint64();\\n proposal_.parameters.votingMode = votingMode();\\n proposal_.parameters.supportThreshold = supportThreshold();\\n proposal_.parameters.minVotingPower = _applyRatioCeiled(\\n totalVotingPower_,\\n minParticipation()\\n );\\n\\n // Reduce costs\\n if (_allowFailureMap != 0) {\\n proposal_.allowFailureMap = _allowFailureMap;\\n }\\n\\n for (uint256 i; i < _actions.length; ) {\\n proposal_.actions.push(_actions[i]);\\n unchecked {\\n ++i;\\n }\\n }\\n\\n if (_voteOption != VoteOption.None) {\\n vote(proposalId, _voteOption, _tryEarlyExecution);\\n }\\n }\\n\\n /// @inheritdoc IMembership\\n function isMember(address _account) external view returns (bool) {\\n /// whatever condition\\n return votingToken.getPowerByBlockNumber(_account, block.number) > 0;\\n }\\n\\n /// @inheritdoc MajorityVotingBase\\n function _vote(\\n uint256 _proposalId,\\n VoteOption _voteOption,\\n address _voter,\\n bool _tryEarlyExecution\\n ) internal override {\\n Proposal storage proposal_ = proposals[_proposalId];\\n\\n // This could re-enter, though we can assume the governance token is not malicious\\n uint256 votingPower = votingToken.getPowerByBlockNumber(_voter, proposal_.parameters.snapshotBlock);\\n VoteOption state = proposal_.voters[_voter];\\n\\n // If voter had previously voted, decrease count\\n if (state == VoteOption.Yes) {\\n proposal_.tally.yes = proposal_.tally.yes - votingPower;\\n } else if (state == VoteOption.No) {\\n proposal_.tally.no = proposal_.tally.no - votingPower;\\n } else if (state == VoteOption.Abstain) {\\n proposal_.tally.abstain = proposal_.tally.abstain - votingPower;\\n }\\n\\n // write the updated/new vote for the voter.\\n if (_voteOption == VoteOption.Yes) {\\n proposal_.tally.yes = proposal_.tally.yes + votingPower;\\n } else if (_voteOption == VoteOption.No) {\\n proposal_.tally.no = proposal_.tally.no + votingPower;\\n } else if (_voteOption == VoteOption.Abstain) {\\n proposal_.tally.abstain = proposal_.tally.abstain + votingPower;\\n }\\n\\n proposal_.voters[_voter] = _voteOption;\\n\\n emit VoteCast({\\n proposalId: _proposalId,\\n voter: _voter,\\n voteOption: _voteOption,\\n votingPower: votingPower\\n });\\n\\n if (_tryEarlyExecution && _canExecute(_proposalId)) {\\n _execute(_proposalId);\\n }\\n }\\n\\n /// @inheritdoc MajorityVotingBase\\n function _canVote(\\n uint256 _proposalId,\\n address _account,\\n VoteOption _voteOption\\n ) internal view override returns (bool) {\\n Proposal storage proposal_ = proposals[_proposalId];\\n\\n // The proposal vote hasn't started or has already ended.\\n if (!_isProposalOpen(proposal_)) {\\n return false;\\n }\\n\\n // The voter votes `None` which is not allowed.\\n if (_voteOption == VoteOption.None) {\\n return false;\\n }\\n\\n // The voter has no voting power.\\n if (votingToken.getPowerByBlockNumber(_account, proposal_.parameters.snapshotBlock) == 0) {\\n return false;\\n }\\n\\n // The voter has already voted but vote replacment is not allowed.\\n if (\\n proposal_.voters[_account] != VoteOption.None &&\\n proposal_.parameters.votingMode != VotingMode.VoteReplacement\\n ) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /// @dev This empty reserved space is put in place to allow future versions to add new\\n /// variables without shifting down storage in the inheritance chain.\\n /// https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xd5e13e20fff6d9a9da0497c71f3bd49c98939755870a3f85615f0ad4fd2e7eb9\",\"license\":\"AGPL-3.0-or-later\"},\"contracts/interfaces/IFollowNFT.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport {DataTypes} from \\\"../lib/DataTypes.sol\\\";\\n\\n/**\\n * @title IFollowNFT\\n * @author Lens Protocol\\n *\\n * @notice This is the interface for the FollowNFT contract, which is cloned upon the first follow for any profile.\\n */\\ninterface IFollowNFT {\\n /**\\n * @notice Initializes the follow NFT, setting the hub as the privileged minter and storing the associated profile ID.\\n *\\n * @param profileId The token ID of the profile in the hub associated with this followNFT, used for transfer hooks.\\n */\\n function initialize(uint256 profileId) external;\\n\\n /**\\n * @notice Mints a follow NFT to the specified address. This can only be called by the hub, and is called\\n * upon follow.\\n *\\n * @param to The address to mint the NFT to.\\n *\\n * @return uint256 An interger representing the minted token ID.\\n */\\n function mint(address to) external returns (uint256);\\n\\n /**\\n * @notice Delegates the caller's governance power to the given delegatee address.\\n *\\n * @param delegatee The delegatee address to delegate governance power to.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @notice Delegates the delegator's governance power via meta-tx to the given delegatee address.\\n *\\n * @param delegator The delegator address, who is the signer.\\n * @param delegatee The delegatee address, who is receiving the governance power delegation.\\n * @param sig The EIP712Signature struct containing the necessary parameters to recover the delegator's signature.\\n */\\n function delegateBySig(\\n address delegator,\\n address delegatee,\\n DataTypes.EIP712Signature calldata sig\\n ) external;\\n\\n /**\\n * @notice Returns the governance power for a given user at a specified block number.\\n *\\n * @param user The user to query governance power for.\\n * @param blockNumber The block number to query the user's governance power at.\\n *\\n * @return uint256 The power of the given user at the given block number.\\n */\\n function getPowerByBlockNumber(address user, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @notice Returns the total delegated supply at a specified block number. This is the sum of all\\n * current available voting power at a given block.\\n *\\n * @param blockNumber The block number to query the delegated supply at.\\n *\\n * @return uint256 The delegated supply at the given block number.\\n */\\n function getDelegatedSupplyByBlockNumber(uint256 blockNumber) external view returns (uint256);\\n}\",\"keccak256\":\"0xe35370ba040c8b78239caa8c3ea8a682cae8fd2fdac6025d768bdaa44781fda8\",\"license\":\"MIT\"},\"contracts/lib/DataTypes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\n/**\\n * @title DataTypes\\n * @author Lens Protocol\\n *\\n * @notice A standard library of data types used throughout the Lens Protocol.\\n */\\nlibrary DataTypes {\\n /**\\n * @notice An enum containing the different states the protocol can be in, limiting certain actions.\\n *\\n * @param Unpaused The fully unpaused state.\\n * @param PublishingPaused The state where only publication creation functions are paused.\\n * @param Paused The fully paused state.\\n */\\n enum ProtocolState {\\n Unpaused,\\n PublishingPaused,\\n Paused\\n }\\n\\n /**\\n * @notice An enum specifically used in a helper function to easily retrieve the publication type for integrations.\\n *\\n * @param Post A standard post, having a URI, a collect module but no pointer to another publication.\\n * @param Comment A comment, having a URI, a collect module and a pointer to another publication.\\n * @param Mirror A mirror, having a pointer to another publication, but no URI or collect module.\\n * @param Nonexistent An indicator showing the queried publication does not exist.\\n */\\n enum PubType {\\n Post,\\n Comment,\\n Mirror,\\n Nonexistent\\n }\\n\\n /**\\n * @notice A struct containing the necessary information to reconstruct an EIP-712 typed data signature.\\n *\\n * @param v The signature's recovery parameter.\\n * @param r The signature's r parameter.\\n * @param s The signature's s parameter\\n * @param deadline The signature's deadline\\n */\\n struct EIP712Signature {\\n uint8 v;\\n bytes32 r;\\n bytes32 s;\\n uint256 deadline;\\n }\\n\\n /**\\n * @notice A struct containing profile data.\\n *\\n * @param pubCount The number of publications made to this profile.\\n * @param followModule The address of the current follow module in use by this profile, can be empty.\\n * @param followNFT The address of the followNFT associated with this profile, can be empty..\\n * @param handle The profile's associated handle.\\n * @param imageURI The URI to be used for the profile's image.\\n * @param followNFTURI The URI to be used for the follow NFT.\\n */\\n struct ProfileStruct {\\n uint256 pubCount;\\n address followModule;\\n address followNFT;\\n string handle;\\n string imageURI;\\n string followNFTURI;\\n }\\n\\n /**\\n * @notice A struct containing data associated with each new publication.\\n *\\n * @param profileIdPointed The profile token ID this publication points to, for mirrors and comments.\\n * @param pubIdPointed The publication ID this publication points to, for mirrors and comments.\\n * @param contentURI The URI associated with this publication.\\n * @param referenceModule The address of the current reference module in use by this publication, can be empty.\\n * @param collectModule The address of the collect module associated with this publication, this exists for all publication.\\n * @param collectNFT The address of the collectNFT associated with this publication, if any.\\n */\\n struct PublicationStruct {\\n uint256 profileIdPointed;\\n uint256 pubIdPointed;\\n string contentURI;\\n address referenceModule;\\n address collectModule;\\n address collectNFT;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `createProfile()` function.\\n *\\n * @param to The address receiving the profile.\\n * @param handle The handle to set for the profile, must be unique and non-empty.\\n * @param imageURI The URI to set for the profile image.\\n * @param followModule The follow module to use, can be the zero address.\\n * @param followModuleInitData The follow module initialization data, if any.\\n * @param followNFTURI The URI to use for the follow NFT.\\n */\\n struct CreateProfileData {\\n address to;\\n string handle;\\n string imageURI;\\n address followModule;\\n bytes followModuleInitData;\\n string followNFTURI;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `setDefaultProfileWithSig()` function. Parameters are\\n * the same as the regular `setDefaultProfile()` function, with an added EIP712Signature.\\n *\\n * @param wallet The address of the wallet setting the default profile.\\n * @param profileId The token ID of the profile which will be set as default, or zero.\\n * @param sig The EIP712Signature struct containing the profile owner's signature.\\n */\\n struct SetDefaultProfileWithSigData {\\n address wallet;\\n uint256 profileId;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `setFollowModuleWithSig()` function. Parameters are\\n * the same as the regular `setFollowModule()` function, with an added EIP712Signature.\\n *\\n * @param profileId The token ID of the profile to change the followModule for.\\n * @param followModule The followModule to set for the given profile, must be whitelisted.\\n * @param followModuleInitData The data to be passed to the followModule for initialization.\\n * @param sig The EIP712Signature struct containing the profile owner's signature.\\n */\\n struct SetFollowModuleWithSigData {\\n uint256 profileId;\\n address followModule;\\n bytes followModuleInitData;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `setDispatcherWithSig()` function. Parameters are the same\\n * as the regular `setDispatcher()` function, with an added EIP712Signature.\\n *\\n * @param profileId The token ID of the profile to set the dispatcher for.\\n * @param dispatcher The dispatcher address to set for the profile.\\n * @param sig The EIP712Signature struct containing the profile owner's signature.\\n */\\n struct SetDispatcherWithSigData {\\n uint256 profileId;\\n address dispatcher;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `setProfileImageURIWithSig()` function. Parameters are the same\\n * as the regular `setProfileImageURI()` function, with an added EIP712Signature.\\n *\\n * @param profileId The token ID of the profile to set the URI for.\\n * @param imageURI The URI to set for the given profile image.\\n * @param sig The EIP712Signature struct containing the profile owner's signature.\\n */\\n struct SetProfileImageURIWithSigData {\\n uint256 profileId;\\n string imageURI;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `setFollowNFTURIWithSig()` function. Parameters are the same\\n * as the regular `setFollowNFTURI()` function, with an added EIP712Signature.\\n *\\n * @param profileId The token ID of the profile for which to set the followNFT URI.\\n * @param followNFTURI The follow NFT URI to set.\\n * @param sig The EIP712Signature struct containing the followNFT's associated profile owner's signature.\\n */\\n struct SetFollowNFTURIWithSigData {\\n uint256 profileId;\\n string followNFTURI;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `post()` function.\\n *\\n * @param profileId The token ID of the profile to publish to.\\n * @param contentURI The URI to set for this new publication.\\n * @param collectModule The collect module to set for this new publication.\\n * @param collectModuleInitData The data to pass to the collect module's initialization.\\n * @param referenceModule The reference module to set for the given publication, must be whitelisted.\\n * @param referenceModuleInitData The data to be passed to the reference module for initialization.\\n */\\n struct PostData {\\n uint256 profileId;\\n string contentURI;\\n address collectModule;\\n bytes collectModuleInitData;\\n address referenceModule;\\n bytes referenceModuleInitData;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `postWithSig()` function. Parameters are the same as\\n * the regular `post()` function, with an added EIP712Signature.\\n *\\n * @param profileId The token ID of the profile to publish to.\\n * @param contentURI The URI to set for this new publication.\\n * @param collectModule The collectModule to set for this new publication.\\n * @param collectModuleInitData The data to pass to the collectModule's initialization.\\n * @param referenceModule The reference module to set for the given publication, must be whitelisted.\\n * @param referenceModuleInitData The data to be passed to the reference module for initialization.\\n * @param sig The EIP712Signature struct containing the profile owner's signature.\\n */\\n struct PostWithSigData {\\n uint256 profileId;\\n string contentURI;\\n address collectModule;\\n bytes collectModuleInitData;\\n address referenceModule;\\n bytes referenceModuleInitData;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `comment()` function.\\n *\\n * @param profileId The token ID of the profile to publish to.\\n * @param contentURI The URI to set for this new publication.\\n * @param profileIdPointed The profile token ID to point the comment to.\\n * @param pubIdPointed The publication ID to point the comment to.\\n * @param referenceModuleData The data passed to the reference module.\\n * @param collectModule The collect module to set for this new publication.\\n * @param collectModuleInitData The data to pass to the collect module's initialization.\\n * @param referenceModule The reference module to set for the given publication, must be whitelisted.\\n * @param referenceModuleInitData The data to be passed to the reference module for initialization.\\n */\\n struct CommentData {\\n uint256 profileId;\\n string contentURI;\\n uint256 profileIdPointed;\\n uint256 pubIdPointed;\\n bytes referenceModuleData;\\n address collectModule;\\n bytes collectModuleInitData;\\n address referenceModule;\\n bytes referenceModuleInitData;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `commentWithSig()` function. Parameters are the same as\\n * the regular `comment()` function, with an added EIP712Signature.\\n *\\n * @param profileId The token ID of the profile to publish to.\\n * @param contentURI The URI to set for this new publication.\\n * @param profileIdPointed The profile token ID to point the comment to.\\n * @param pubIdPointed The publication ID to point the comment to.\\n * @param referenceModuleData The data passed to the reference module.\\n * @param collectModule The collectModule to set for this new publication.\\n * @param collectModuleInitData The data to pass to the collectModule's initialization.\\n * @param referenceModule The reference module to set for the given publication, must be whitelisted.\\n * @param referenceModuleInitData The data to be passed to the reference module for initialization.\\n * @param sig The EIP712Signature struct containing the profile owner's signature.\\n */\\n struct CommentWithSigData {\\n uint256 profileId;\\n string contentURI;\\n uint256 profileIdPointed;\\n uint256 pubIdPointed;\\n bytes referenceModuleData;\\n address collectModule;\\n bytes collectModuleInitData;\\n address referenceModule;\\n bytes referenceModuleInitData;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `mirror()` function.\\n *\\n * @param profileId The token ID of the profile to publish to.\\n * @param profileIdPointed The profile token ID to point the mirror to.\\n * @param pubIdPointed The publication ID to point the mirror to.\\n * @param referenceModuleData The data passed to the reference module.\\n * @param referenceModule The reference module to set for the given publication, must be whitelisted.\\n * @param referenceModuleInitData The data to be passed to the reference module for initialization.\\n */\\n struct MirrorData {\\n uint256 profileId;\\n uint256 profileIdPointed;\\n uint256 pubIdPointed;\\n bytes referenceModuleData;\\n address referenceModule;\\n bytes referenceModuleInitData;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `mirrorWithSig()` function. Parameters are the same as\\n * the regular `mirror()` function, with an added EIP712Signature.\\n *\\n * @param profileId The token ID of the profile to publish to.\\n * @param profileIdPointed The profile token ID to point the mirror to.\\n * @param pubIdPointed The publication ID to point the mirror to.\\n * @param referenceModuleData The data passed to the reference module.\\n * @param referenceModule The reference module to set for the given publication, must be whitelisted.\\n * @param referenceModuleInitData The data to be passed to the reference module for initialization.\\n * @param sig The EIP712Signature struct containing the profile owner's signature.\\n */\\n struct MirrorWithSigData {\\n uint256 profileId;\\n uint256 profileIdPointed;\\n uint256 pubIdPointed;\\n bytes referenceModuleData;\\n address referenceModule;\\n bytes referenceModuleInitData;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `followWithSig()` function. Parameters are the same\\n * as the regular `follow()` function, with the follower's (signer) address and an EIP712Signature added.\\n *\\n * @param follower The follower which is the message signer.\\n * @param profileIds The array of token IDs of the profiles to follow.\\n * @param datas The array of arbitrary data to pass to the followModules if needed.\\n * @param sig The EIP712Signature struct containing the follower's signature.\\n */\\n struct FollowWithSigData {\\n address follower;\\n uint256[] profileIds;\\n bytes[] datas;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `collectWithSig()` function. Parameters are the same as\\n * the regular `collect()` function, with the collector's (signer) address and an EIP712Signature added.\\n *\\n * @param collector The collector which is the message signer.\\n * @param profileId The token ID of the profile that published the publication to collect.\\n * @param pubId The publication to collect's publication ID.\\n * @param data The arbitrary data to pass to the collectModule if needed.\\n * @param sig The EIP712Signature struct containing the collector's signature.\\n */\\n struct CollectWithSigData {\\n address collector;\\n uint256 profileId;\\n uint256 pubId;\\n bytes data;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `setProfileMetadataWithSig()` function.\\n *\\n * @param profileId The profile ID for which to set the metadata.\\n * @param metadata The metadata string to set for the profile and user.\\n * @param sig The EIP712Signature struct containing the user's signature.\\n */\\n struct SetProfileMetadataWithSigData {\\n uint256 profileId;\\n string metadata;\\n EIP712Signature sig;\\n }\\n\\n /**\\n * @notice A struct containing the parameters required for the `toggleFollowWithSig()` function.\\n *\\n * @param follower The follower which is the message signer.\\n * @param profileIds The token ID array of the profiles.\\n * @param enables The array of booleans to enable/disable follows.\\n * @param sig The EIP712Signature struct containing the follower's signature.\\n */\\n struct ToggleFollowWithSigData {\\n address follower;\\n uint256[] profileIds;\\n bool[] enables;\\n EIP712Signature sig;\\n }\\n}\",\"keccak256\":\"0xeed9a3e9dede45d011da5b620a8eb7145cd2ba8917ad4ba701900fd31518d733\",\"license\":\"MIT\"},\"contracts/utils/Ratio.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-or-later\\n\\npragma solidity 0.8.17;\\n\\n// The base value to encode real-valued ratios on the interval `[0,1]` as integers on the interval `[0, 10**6]`.\\nuint256 constant RATIO_BASE = 10 ** 6;\\n\\n/// @notice Thrown if a ratio value exceeds the maximal value of `10**6`.\\n/// @param limit The maximal value.\\n/// @param actual The actual value.\\nerror RatioOutOfBounds(uint256 limit, uint256 actual);\\n\\n/// @notice Applies a ratio to a value and ceils the remainder.\\n/// @param _value The value to which the ratio is applied.\\n/// @param _ratio The ratio that must be in the interval `[0, 10**6]`.\\n/// @return result The resulting value.\\nfunction _applyRatioCeiled(uint256 _value, uint256 _ratio) pure returns (uint256 result) {\\n if (_ratio > RATIO_BASE) {\\n revert RatioOutOfBounds({limit: RATIO_BASE, actual: _ratio});\\n }\\n\\n _value = _value * _ratio;\\n uint256 remainder = _value % RATIO_BASE;\\n result = _value / RATIO_BASE;\\n\\n // Check if ceiling is needed\\n if (remainder != 0) {\\n ++result;\\n }\\n}\\n\\n/// @notice Applies a ratio to a value and floors the remainder.\\n/// @param _value The value to which the ratio is applied.\\n/// @param _ratio The ratio that must be in the interval `[0, 10**6]`.\\n/// @return result The resulting value.\\nfunction _applyRatioFloored(uint256 _value, uint256 _ratio) pure returns (uint256 result) {\\n if (_ratio > RATIO_BASE) {\\n revert RatioOutOfBounds({limit: RATIO_BASE, actual: _ratio});\\n }\\n\\n result = (_value * _ratio) / RATIO_BASE;\\n}\",\"keccak256\":\"0xb711c211b90a88fefba2a5b7bdef12e2e07e347af041b7a895a89083365d807b\",\"license\":\"AGPL-3.0-or-later\"}},\"version\":1}",
"bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516137cc62000120600039600081816107b70152818161085201528181610959015281816109ef0152610ae601526137cc6000f3fe6080604052600436106101cd5760003560e01c80637c36e8e8116100f7578063c9c4bfca11610095578063da35c66411610064578063da35c664146105c6578063e28c3b19146105db578063f60046b2146105fa578063fe0d94c11461061057600080fd5b8063c9c4bfca14610532578063cc63604a14610566578063ce6366c414610586578063cf131149146105a657600080fd5b80639cba3021116100d15780639cba3021146104a0578063a230c524146104c0578063b2673b07146104e0578063c7f758a81461050057600080fd5b80637c36e8e8146104075780638a4b00f814610428578063970601d81461044857600080fd5b80633659cfe61161016f57806352d1902d1161013e57806352d1902d1461037c578063536f9f421461039157806356715761146103b15780635c60da1b146103f257600080fd5b80633659cfe6146103035780634162169f1461032357806341de6830146103555780634f1ef2861461036957600080fd5b80630dfb278e116101ab5780630dfb278e1461025d57806317d1b4041461027f5780631befc4051461029f57806323d07188146102e157600080fd5b806301ffc9a7146101d2578063054fd2c2146102075780630de218561461023d575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046129b0565b610630565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b506101605465010000000000900463ffffffff165b60405163ffffffff90911681526020016101fe565b34801561024957600080fd5b506101f26102583660046129da565b6106a8565b34801561026957600080fd5b5061027d610278366004612a0b565b61074b565b005b34801561028b57600080fd5b506101f261029a366004612a50565b610796565b3480156102ab57600080fd5b506102d37fbba35d41610b7d25c8e486006535c76bd423091563e694d206ae3d71ce949fe581565b6040519081526020016101fe565b3480156102ed57600080fd5b506101605460ff165b6040516101fe9190612ab4565b34801561030f57600080fd5b5061027d61031e366004612ac7565b6107ad565b34801561032f57600080fd5b5060c9546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b34801561036157600080fd5b5060006102f6565b61027d610377366004612b53565b61094f565b34801561038857600080fd5b506102d3610ad9565b34801561039d57600080fd5b506102d36103ac3660046129da565b610b9f565b3480156103bd57600080fd5b50610160546901000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b3480156103fe57600080fd5b5061033d610c27565b34801561041357600080fd5b5061016054610100900463ffffffff16610228565b34801561043457600080fd5b506101f26104433660046129da565b610c5f565b34801561045457600080fd5b50610493610463366004612be6565b600082815261015f602090815260408083206001600160a01b038516845260060190915290205460ff1692915050565b6040516101fe9190612c2a565b3480156104ac57600080fd5b506102d36104bb366004612cbe565b610c9f565b3480156104cc57600080fd5b506101f26104db366004612ac7565b610fdd565b3480156104ec57600080fd5b5061027d6104fb366004612da3565b61105d565b34801561050c57600080fd5b5061052061051b3660046129da565b6111d7565b6040516101fe96959493929190612ebb565b34801561053e57600080fd5b506102d37f821b6e3a557148015a918c89e5d092e878a69854a2d1a410635f771bd5a8a3f581565b34801561057257600080fd5b506101f26105813660046129da565b61143f565b34801561059257600080fd5b5061027d6105a1366004612f73565b61144a565b3480156105b257600080fd5b506101f26105c13660046129da565b61149e565b3480156105d257600080fd5b506102d3611500565b3480156105e757600080fd5b50610191546001600160a01b031661033d565b34801561060657600080fd5b50610161546102d3565b34801561061c57600080fd5b5061027d61062b3660046129da565b61150c565b60006001600160e01b031982167f50eb001e00000000000000000000000000000000000000000000000000000000148061069357506001600160e01b031982167fa230c52400000000000000000000000000000000000000000000000000000000145b806106a257506106a282611557565b92915050565b600081815261015f60205260408120600381015460048201546001830154849291906106e490600160a81b900467ffffffffffffffff16610b9f565b6106ee9190612fbe565b6106f89190612fbe565b6001830154909150610716908290610100900463ffffffff16612fd1565b6004830154600184015461073890610100900463ffffffff16620f4240612fbe565b6107429190612fd1565b11949350505050565b60c9547fbba35d41610b7d25c8e486006535c76bd423091563e694d206ae3d71ce949fe590610789906001600160a01b031630335b846000366115c9565b610792826116b7565b5050565b60006107a38484846118ba565b90505b9392505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108505760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108ab7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146109275760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610847565b61093081611a0e565b6040805160008082526020820190925261094c91839190611a47565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109ed5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610847565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a487f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610ac45760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610847565b610acd82611a0e565b61079282826001611a47565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b795760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610847565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b90565b610191546040517f8fca0d41000000000000000000000000000000000000000000000000000000008152600481018390526000916001600160a01b031690638fca0d4190602401602060405180830381865afa158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a29190612fe8565b6000610c5a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b600081815261015f602052604081206002810154600382015460058301546004840154610c8c9190613001565b610c969190613001565b10159392505050565b6000600019430181610cb082610b9f565b905080600003610cec576040517f7c176b7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016154610191546001600160a01b0316632c994dc8336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101869052604401602060405180830381865afa158015610d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d729190612fe8565b1015610dac576040517feab99344000000000000000000000000000000000000000000000000000000008152336004820152602401610847565b610dbc338d8d8a8a8f8f8f611bec565b600081815261015f60205260409020909350610dd88888611c52565b6001830180547fffffffffffffffffffffff00000000000000000000000000000000ffffffffff166d010000000000000000000000000067ffffffffffffffff938416027fffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffff1617650100000000009390921692909202179055610e5a83611d93565b60018201805467ffffffffffffffff92909216600160a81b027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff909216919091179055610eaa6101605460ff1690565b60018083018054909160ff1990911690836002811115610ecc57610ecc612a8e565b021790555061016054610100900463ffffffff166001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1661010063ffffffff9384160217905561016054610f369184916501000000000090041663ffffffff16611e17565b60028201558815610f4957600881018990555b60005b8a811015610fa857816007018c8c83818110610f6a57610f6a613014565b9050602002810190610f7c919061302a565b815460018101835560009283526020909220909160030201610f9e82826130c4565b5050600101610f4c565b506000866003811115610fbd57610fbd612a8e565b14610fcd57610fcd84878761144a565b5050509998505050505050505050565b6101915460405163059329b960e31b81526001600160a01b0383811660048301524360248301526000928392911690632c994dc890604401602060405180830381865afa158015611032573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110569190612fe8565b1192915050565b600054610100900460ff161580801561107d5750600054600160ff909116105b806110975750303b158015611097575060005460ff166001145b6111095760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610847565b6000805460ff19166001179055801561112c576000805461ff0019166101001790555b6111368484611ea7565b610191805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091556040517f3f1ec22954d444cb99f80a1989ac8f631616b8a575a89379e514c0f7f748c93390600090a280156111d1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052819061122e60405180606001604052806000815260200160008152602001600081525090565b600085815261015f602052604081206060919061124a81611f36565b81546040805160c08101909152600184018054939a5060ff928316995090929091839116600281111561127f5761127f612a8e565b600281111561129057611290612a8e565b8152815463ffffffff61010082041660208084019190915267ffffffffffffffff65010000000000830481166040808601919091526d010000000000000000000000000084048216606080870191909152600160a81b909404909116608085015260019094015460a090930192909252825190810183526003850154815260048501548183015260058501548184015260078501805484518185028101850190955280855294995090975091929060009084015b82821015611428576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600181015493830193909352600283018054929392918401916113979061304a565b80601f01602080910402602001604051908101604052809291908181526020018280546113c39061304a565b80156114105780601f106113e557610100808354040283529160200191611410565b820191906000526020600020905b8154815290600101906020018083116113f357829003601f168201915b50505050508152505081526020019060010190611344565b505050509250806008015491505091939550919395565b60006106a282611fa4565b336114568482856118ba565b611492578381846040517f70b4b254000000000000000000000000000000000000000000000000000000008152600401610847939291906131f5565b6111d18484838561204c565b600081815261015f60205260408120600581015460018201546114cc9190610100900463ffffffff16612fd1565b600482015460018301546114ee90610100900463ffffffff16620f4240612fbe565b6114f89190612fd1565b119392505050565b6000610c5a61012d5490565b61151581611fa4565b61154e576040517f9fefd0f100000000000000000000000000000000000000000000000000000000815260048101829052602401610847565b61094c816122da565b60006001600160e01b031982167f8678b01e0000000000000000000000000000000000000000000000000000000014806115ba57506001600160e01b031982167f4d19145e00000000000000000000000000000000000000000000000000000000145b806106a257506106a282612442565b6040517ffdef91060000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063fdef910690611616908890889088908890889060040161324b565b602060405180830381865afa158015611633573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116579190613289565b6116af576040517f32dbe3b40000000000000000000000000000000000000000000000000000000081526001600160a01b03808816600483015280871660248301528516604482015260648101849052608401610847565b505050505050565b6116c56001620f4240612fbe565b6116d560408301602084016132b8565b63ffffffff161115611740576116ef6001620f4240612fbe565b6116ff60408301602084016132b8565b6040517fcc80c195000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff166024820152604401610847565b620f424061175460608301604084016132b8565b63ffffffff16111561177457620f42406116ff60608301604084016132b8565b610e1061178760808301606084016132d5565b67ffffffffffffffff1610156117f057610e106117aa60808301606084016132d5565b6040517fc51033ee00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff928316600482015291166024820152604401610847565b6301e1338061180560808301606084016132d5565b67ffffffffffffffff16111561182a576301e133806117aa60808301606084016132d5565b80610160611838828261330c565b507fa8a18d06ddd19f24a872740e3d364c86f62be25f7154525dda18ef07fda46f3e9050611869602083018361341f565b61187960408401602085016132b8565b61188960608501604086016132b8565b61189960808601606087016132d5565b85608001356040516118af95949392919061343c565b60405180910390a150565b600083815261015f602052604081206118d281611f36565b6118e05760009150506107a6565b60008360038111156118f4576118f4612a8e565b036119035760009150506107a6565b61019154600182015460405163059329b960e31b81526001600160a01b038781166004830152600160a81b90920467ffffffffffffffff166024820152911690632c994dc890604401602060405180830381865afa158015611969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198d9190612fe8565b60000361199e5760009150506107a6565b6001600160a01b038416600090815260068201602052604081205460ff1660038111156119cd576119cd612a8e565b141580156119f457506002600182015460ff1660028111156119f1576119f1612a8e565b14155b15611a035760009150506107a6565b506001949350505050565b60c9547f821b6e3a557148015a918c89e5d092e878a69854a2d1a410635f771bd5a8a3f590610792906001600160a01b03163033610780565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611a7f57611a7a83612480565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ad9575060408051601f3d908101601f19168201909252611ad691810190612fe8565b60015b611b4b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610847565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611be05760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610847565b50611a7a83838361254b565b6000611bf6612570565b9050886001600160a01b0316817fa6c1f8f4276dc3f243459e13b557c84e8f4e90b2e09070bad5f6909cee687c9288888c8c8a8a8a604051611c3e9796959493929190613478565b60405180910390a398975050505050505050565b6000806000611c6042611d93565b90508467ffffffffffffffff16600003611c7c57809250611ce1565b8492508067ffffffffffffffff168367ffffffffffffffff161015611ce1576040517f4cc9c0f400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808316600483015284166024820152604401610847565b61016054600090611d09906901000000000000000000900467ffffffffffffffff1685613587565b90508467ffffffffffffffff16600003611d2557809250611d8a565b8492508067ffffffffffffffff168367ffffffffffffffff161015611d8a576040517f4cc9c0f400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808316600483015284166024820152604401610847565b50509250929050565b600067ffffffffffffffff821115611e135760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201527f34206269747300000000000000000000000000000000000000000000000000006064820152608401610847565b5090565b6000620f4240821115611e62576040517fcc80c195000000000000000000000000000000000000000000000000000000008152620f4240600482015260248101839052604401610847565b611e6c8284612fd1565b92506000611e7d620f4240856135be565b9050611e8c620f4240856135d2565b91508015611ea057611e9d826135e6565b91505b5092915050565b600054610100900460ff16611f245760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610847565b611f2d8261258b565b610792816116b7565b600080611f4242611d93565b600184015490915067ffffffffffffffff808316650100000000009092041611801590611f915750600183015467ffffffffffffffff6d01000000000000000000000000009091048116908216105b80156107a6575050905460ff1615919050565b600081815261015f60205260408120805460ff1615611fc65750600092915050565b611fcf81611f36565b156120175760018082015460ff166002811115611fee57611fee612a8e565b14611ffc5750600092915050565b612005836106a8565b6120125750600092915050565b61202d565b6120208361149e565b61202d5750600092915050565b61203683610c5f565b6120435750600092915050565b50600192915050565b600084815261015f6020526040808220610191546001820154925163059329b960e31b81526001600160a01b038781166004830152600160a81b90940467ffffffffffffffff1660248201529193921690632c994dc890604401602060405180830381865afa1580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e79190612fe8565b6001600160a01b038516600090815260068401602052604090205490915060ff16600281600381111561211c5761211c612a8e565b0361213b576004830154612131908390612fbe565b600484015561219d565b600381600381111561214f5761214f612a8e565b0361216e576005830154612164908390612fbe565b600584015561219d565b600181600381111561218257612182612a8e565b0361219d576003830154612197908390612fbe565b60038401555b60028660038111156121b1576121b1612a8e565b036121d05760048301546121c6908390613001565b6004840155612232565b60038660038111156121e4576121e4612a8e565b036122035760058301546121f9908390613001565b6005840155612232565b600186600381111561221757612217612a8e565b0361223257600383015461222c908390613001565b60038401555b6001600160a01b03851660009081526006840160205260409020805487919060ff1916600183600381111561226957612269612a8e565b0217905550846001600160a01b0316877fb83d25c6a5d258561330739951487acb4bd09ba5190b5d32c4f261817d90679288856040516122aa929190613600565b60405180910390a38380156122c357506122c387611fa4565b156122d1576122d1876122da565b50505050505050565b600081815261015f60205260409020805460ff19166001179055611a7a61230960c9546001600160a01b031690565b8261015f6000858152602001908152602001600020600701805480602002602001604051908101604052809291908181526020016000905b82821015612425576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600181015493830193909352600283018054929392918401916123949061304a565b80601f01602080910402602001604051908101604052809291908181526020018280546123c09061304a565b801561240d5780601f106123e25761010080835404028352916020019161240d565b820191906000526020600020905b8154815290600101906020018083116123f057829003601f168201915b50505050508152505081526020019060010190612341565b505050600086815261015f60205260409020600801549050612611565b60006001600160e01b031982167fda35c6640000000000000000000000000000000000000000000000000000000014806106a257506106a2826126e0565b6001600160a01b0381163b6124fd5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610847565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6125548361277b565b6000825111806125615750805b15611a7a576111d183836127bb565b600061257a611500565b9050610b9c61012d80546001019055565b600054610100900460ff166126085760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610847565b61094c816128c6565b6040517fc71bf3240000000000000000000000000000000000000000000000000000000081526060906000906001600160a01b0387169063c71bf324906126609088908890889060040161361b565b6000604051808303816000875af115801561267f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126a79190810190613644565b604051919350915085907f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90600090a294509492505050565b60006001600160e01b031982167f41de683000000000000000000000000000000000000000000000000000000000148061274357506001600160e01b031982167f52d1902d00000000000000000000000000000000000000000000000000000000145b806106a257507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146106a2565b61278481612480565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b61283a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610847565b600080846001600160a01b031684604051612855919061374a565b600060405180830381855af49150503d8060008114612890576040519150601f19603f3d011682016040523d82523d6000602084013e612895565b606091505b50915091506128bd828260405180606001604052806027815260200161377060279139612972565b95945050505050565b600054610100900460ff166129435760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610847565b60c9805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b606083156129815750816107a6565b6107a683838151156129965781518083602001fd5b8060405162461bcd60e51b8152600401610847919061375c565b6000602082840312156129c257600080fd5b81356001600160e01b0319811681146107a657600080fd5b6000602082840312156129ec57600080fd5b5035919050565b600060a08284031215612a0557600080fd5b50919050565b600060a08284031215612a1d57600080fd5b6107a683836129f3565b6001600160a01b038116811461094c57600080fd5b803560048110612a4b57600080fd5b919050565b600080600060608486031215612a6557600080fd5b833592506020840135612a7781612a27565b9150612a8560408501612a3c565b90509250925092565b634e487b7160e01b600052602160045260246000fd5b6003811061094c5761094c612a8e565b60208101612ac183612aa4565b91905290565b600060208284031215612ad957600080fd5b81356107a681612a27565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612b2357612b23612ae4565b604052919050565b600067ffffffffffffffff821115612b4557612b45612ae4565b50601f01601f191660200190565b60008060408385031215612b6657600080fd5b8235612b7181612a27565b9150602083013567ffffffffffffffff811115612b8d57600080fd5b8301601f81018513612b9e57600080fd5b8035612bb1612bac82612b2b565b612afa565b818152866020838501011115612bc657600080fd5b816020840160208301376000602083830101528093505050509250929050565b60008060408385031215612bf957600080fd5b823591506020830135612c0b81612a27565b809150509250929050565b60048110612c2657612c26612a8e565b9052565b602081016106a28284612c16565b60008083601f840112612c4a57600080fd5b50813567ffffffffffffffff811115612c6257600080fd5b6020830191508360208260051b8501011115612c7d57600080fd5b9250929050565b67ffffffffffffffff8116811461094c57600080fd5b8035612a4b81612c84565b801515811461094c57600080fd5b8035612a4b81612ca5565b600080600080600080600080600060e08a8c031215612cdc57600080fd5b893567ffffffffffffffff80821115612cf457600080fd5b818c0191508c601f830112612d0857600080fd5b813581811115612d1757600080fd5b8d6020828501011115612d2957600080fd5b60209283019b509950908b01359080821115612d4457600080fd5b50612d518c828d01612c38565b90985096505060408a01359450612d6a60608b01612c9a565b9350612d7860808b01612c9a565b9250612d8660a08b01612a3c565b9150612d9460c08b01612cb3565b90509295985092959850929598565b600080600060e08486031215612db857600080fd5b8335612dc381612a27565b9250612dd285602086016129f3565b915060c0840135612de281612a27565b809150509250925092565b60005b83811015612e08578181015183820152602001612df0565b50506000910152565b60008151808452612e29816020860160208601612ded565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015612eae578284038952815180516001600160a01b031685528581015186860152604090810151606091860182905290612e9a81870183612e11565b9a87019a9550505090840190600101612e5b565b5091979650505050505050565b60006101a0881515835287151560208401528651612ed881612aa4565b8060408501525063ffffffff6020880151166060840152604087015167ffffffffffffffff80821660808601528060608a01511660a08601528060808a01511660c0860152505060a087015160e0840152612f4b6101008401878051825260208082015190830152604090810151910152565b80610160840152612f5e81840186612e3d565b91505082610180830152979650505050505050565b600080600060608486031215612f8857600080fd5b83359250612f9860208501612a3c565b91506040840135612de281612ca5565b634e487b7160e01b600052601160045260246000fd5b818103818111156106a2576106a2612fa8565b80820281158282048414176106a2576106a2612fa8565b600060208284031215612ffa57600080fd5b5051919050565b808201808211156106a2576106a2612fa8565b634e487b7160e01b600052603260045260246000fd5b60008235605e1983360301811261304057600080fd5b9190910192915050565b600181811c9082168061305e57607f821691505b602082108103612a0557634e487b7160e01b600052602260045260246000fd5b601f821115611a7a57600081815260208120601f850160051c810160208610156130a55750805b601f850160051c820191505b818110156116af578281556001016130b1565b81356130cf81612a27565b6001600160a01b03811673ffffffffffffffffffffffffffffffffffffffff1983541617825550600160208084013582840155600283016040850135601e1986360301811261311d57600080fd5b8501803567ffffffffffffffff81111561313657600080fd5b803603848301131561314757600080fd5b61315b81613155855461304a565b8561307e565b6000601f821160018114613191576000831561317957508382018601355b600019600385901b1c1916600184901b1785556131ea565b600085815260209020601f19841690835b828110156131c1578685018901358255938801939089019088016131a2565b50848210156131e05760001960f88660031b161c198885880101351681555b50508683881b0185555b505050505050505050565b8381526001600160a01b0383166020820152606081016132186040830184612c16565b949350505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60006001600160a01b0380881683528087166020840152508460408301526080606083015261327e608083018486613220565b979650505050505050565b60006020828403121561329b57600080fd5b81516107a681612ca5565b63ffffffff8116811461094c57600080fd5b6000602082840312156132ca57600080fd5b81356107a6816132a6565b6000602082840312156132e757600080fd5b81356107a681612c84565b6003811061094c57600080fd5b600081356106a281612c84565b8135613317816132f2565b61332081612aa4565b815460ff821691508160ff198216178355602084013561333f816132a6565b64ffffffff008160081b16905080837fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008416171784556040850135613383816132a6565b68ffffffff00000000008160281b16847fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000008516178317178555505050506134116133cf606084016132ff565b82547fffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffff1660489190911b70ffffffffffffffff00000000000000000016178255565b608082013560018201555050565b60006020828403121561343157600080fd5b81356107a6816132f2565b60a0810161344987612aa4565b95815263ffffffff948516602082015292909316604083015267ffffffffffffffff1660608201526080015290565b600067ffffffffffffffff808a1683526020818a1681850152604060a0818601526134a760a086018a8c613220565b606086820381880152818983528483019050848a60051b8401018b60005b8c81101561356957601f198684030184528135605e198f36030181126134ea57600080fd5b8e0180356134f781612a27565b6001600160a01b0316845280890135898501528781013536829003601e1901811261352157600080fd5b0188810190358a81111561353457600080fd5b80360382131561354357600080fd5b86898601526135558786018284613220565b958a019594505050908701906001016134c5565b50508097505050505050505082608083015298975050505050505050565b67ffffffffffffffff818116838216019080821115611ea057611ea0612fa8565b634e487b7160e01b600052601260045260246000fd5b6000826135cd576135cd6135a8565b500690565b6000826135e1576135e16135a8565b500490565b600060001982036135f9576135f9612fa8565b5060010190565b6040810161360e8285612c16565b8260208301529392505050565b8381526060602082015260006136346060830185612e3d565b9050826040830152949350505050565b600080604080848603121561365857600080fd5b835167ffffffffffffffff8082111561367057600080fd5b818601915086601f83011261368457600080fd5b815160208282111561369857613698612ae4565b8160051b6136a7828201612afa565b928352848101820192828101908b8511156136c157600080fd5b83870192505b84831015613736578251868111156136df5760008081fd5b8701603f81018d136136f15760008081fd5b84810151613701612bac82612b2b565b8181528e8b8385010111156137165760008081fd5b613725828883018d8601612ded565b8452505091830191908301906136c7565b9990920151989a9899505050505050505050565b60008251613040818460208701612ded565b6020815260006107a66020830184612e1156fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212200dcce9efc1d5cb24c7cb47d6c8d3c605731ce282be4e6d7daa19c04ea775b4a764736f6c63430008110033",
"deployedBytecode": "0x6080604052600436106101cd5760003560e01c80637c36e8e8116100f7578063c9c4bfca11610095578063da35c66411610064578063da35c664146105c6578063e28c3b19146105db578063f60046b2146105fa578063fe0d94c11461061057600080fd5b8063c9c4bfca14610532578063cc63604a14610566578063ce6366c414610586578063cf131149146105a657600080fd5b80639cba3021116100d15780639cba3021146104a0578063a230c524146104c0578063b2673b07146104e0578063c7f758a81461050057600080fd5b80637c36e8e8146104075780638a4b00f814610428578063970601d81461044857600080fd5b80633659cfe61161016f57806352d1902d1161013e57806352d1902d1461037c578063536f9f421461039157806356715761146103b15780635c60da1b146103f257600080fd5b80633659cfe6146103035780634162169f1461032357806341de6830146103555780634f1ef2861461036957600080fd5b80630dfb278e116101ab5780630dfb278e1461025d57806317d1b4041461027f5780631befc4051461029f57806323d07188146102e157600080fd5b806301ffc9a7146101d2578063054fd2c2146102075780630de218561461023d575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046129b0565b610630565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b506101605465010000000000900463ffffffff165b60405163ffffffff90911681526020016101fe565b34801561024957600080fd5b506101f26102583660046129da565b6106a8565b34801561026957600080fd5b5061027d610278366004612a0b565b61074b565b005b34801561028b57600080fd5b506101f261029a366004612a50565b610796565b3480156102ab57600080fd5b506102d37fbba35d41610b7d25c8e486006535c76bd423091563e694d206ae3d71ce949fe581565b6040519081526020016101fe565b3480156102ed57600080fd5b506101605460ff165b6040516101fe9190612ab4565b34801561030f57600080fd5b5061027d61031e366004612ac7565b6107ad565b34801561032f57600080fd5b5060c9546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b34801561036157600080fd5b5060006102f6565b61027d610377366004612b53565b61094f565b34801561038857600080fd5b506102d3610ad9565b34801561039d57600080fd5b506102d36103ac3660046129da565b610b9f565b3480156103bd57600080fd5b50610160546901000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff90911681526020016101fe565b3480156103fe57600080fd5b5061033d610c27565b34801561041357600080fd5b5061016054610100900463ffffffff16610228565b34801561043457600080fd5b506101f26104433660046129da565b610c5f565b34801561045457600080fd5b50610493610463366004612be6565b600082815261015f602090815260408083206001600160a01b038516845260060190915290205460ff1692915050565b6040516101fe9190612c2a565b3480156104ac57600080fd5b506102d36104bb366004612cbe565b610c9f565b3480156104cc57600080fd5b506101f26104db366004612ac7565b610fdd565b3480156104ec57600080fd5b5061027d6104fb366004612da3565b61105d565b34801561050c57600080fd5b5061052061051b3660046129da565b6111d7565b6040516101fe96959493929190612ebb565b34801561053e57600080fd5b506102d37f821b6e3a557148015a918c89e5d092e878a69854a2d1a410635f771bd5a8a3f581565b34801561057257600080fd5b506101f26105813660046129da565b61143f565b34801561059257600080fd5b5061027d6105a1366004612f73565b61144a565b3480156105b257600080fd5b506101f26105c13660046129da565b61149e565b3480156105d257600080fd5b506102d3611500565b3480156105e757600080fd5b50610191546001600160a01b031661033d565b34801561060657600080fd5b50610161546102d3565b34801561061c57600080fd5b5061027d61062b3660046129da565b61150c565b60006001600160e01b031982167f50eb001e00000000000000000000000000000000000000000000000000000000148061069357506001600160e01b031982167fa230c52400000000000000000000000000000000000000000000000000000000145b806106a257506106a282611557565b92915050565b600081815261015f60205260408120600381015460048201546001830154849291906106e490600160a81b900467ffffffffffffffff16610b9f565b6106ee9190612fbe565b6106f89190612fbe565b6001830154909150610716908290610100900463ffffffff16612fd1565b6004830154600184015461073890610100900463ffffffff16620f4240612fbe565b6107429190612fd1565b11949350505050565b60c9547fbba35d41610b7d25c8e486006535c76bd423091563e694d206ae3d71ce949fe590610789906001600160a01b031630335b846000366115c9565b610792826116b7565b5050565b60006107a38484846118ba565b90505b9392505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108505760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108ab7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146109275760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610847565b61093081611a0e565b6040805160008082526020820190925261094c91839190611a47565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109ed5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610847565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a487f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610ac45760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610847565b610acd82611a0e565b61079282826001611a47565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b795760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610847565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b90565b610191546040517f8fca0d41000000000000000000000000000000000000000000000000000000008152600481018390526000916001600160a01b031690638fca0d4190602401602060405180830381865afa158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a29190612fe8565b6000610c5a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b600081815261015f602052604081206002810154600382015460058301546004840154610c8c9190613001565b610c969190613001565b10159392505050565b6000600019430181610cb082610b9f565b905080600003610cec576040517f7c176b7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016154610191546001600160a01b0316632c994dc8336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101869052604401602060405180830381865afa158015610d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d729190612fe8565b1015610dac576040517feab99344000000000000000000000000000000000000000000000000000000008152336004820152602401610847565b610dbc338d8d8a8a8f8f8f611bec565b600081815261015f60205260409020909350610dd88888611c52565b6001830180547fffffffffffffffffffffff00000000000000000000000000000000ffffffffff166d010000000000000000000000000067ffffffffffffffff938416027fffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffff1617650100000000009390921692909202179055610e5a83611d93565b60018201805467ffffffffffffffff92909216600160a81b027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff909216919091179055610eaa6101605460ff1690565b60018083018054909160ff1990911690836002811115610ecc57610ecc612a8e565b021790555061016054610100900463ffffffff166001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1661010063ffffffff9384160217905561016054610f369184916501000000000090041663ffffffff16611e17565b60028201558815610f4957600881018990555b60005b8a811015610fa857816007018c8c83818110610f6a57610f6a613014565b9050602002810190610f7c919061302a565b815460018101835560009283526020909220909160030201610f9e82826130c4565b5050600101610f4c565b506000866003811115610fbd57610fbd612a8e565b14610fcd57610fcd84878761144a565b5050509998505050505050505050565b6101915460405163059329b960e31b81526001600160a01b0383811660048301524360248301526000928392911690632c994dc890604401602060405180830381865afa158015611032573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110569190612fe8565b1192915050565b600054610100900460ff161580801561107d5750600054600160ff909116105b806110975750303b158015611097575060005460ff166001145b6111095760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610847565b6000805460ff19166001179055801561112c576000805461ff0019166101001790555b6111368484611ea7565b610191805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091556040517f3f1ec22954d444cb99f80a1989ac8f631616b8a575a89379e514c0f7f748c93390600090a280156111d1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052819061122e60405180606001604052806000815260200160008152602001600081525090565b600085815261015f602052604081206060919061124a81611f36565b81546040805160c08101909152600184018054939a5060ff928316995090929091839116600281111561127f5761127f612a8e565b600281111561129057611290612a8e565b8152815463ffffffff61010082041660208084019190915267ffffffffffffffff65010000000000830481166040808601919091526d010000000000000000000000000084048216606080870191909152600160a81b909404909116608085015260019094015460a090930192909252825190810183526003850154815260048501548183015260058501548184015260078501805484518185028101850190955280855294995090975091929060009084015b82821015611428576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600181015493830193909352600283018054929392918401916113979061304a565b80601f01602080910402602001604051908101604052809291908181526020018280546113c39061304a565b80156114105780601f106113e557610100808354040283529160200191611410565b820191906000526020600020905b8154815290600101906020018083116113f357829003601f168201915b50505050508152505081526020019060010190611344565b505050509250806008015491505091939550919395565b60006106a282611fa4565b336114568482856118ba565b611492578381846040517f70b4b254000000000000000000000000000000000000000000000000000000008152600401610847939291906131f5565b6111d18484838561204c565b600081815261015f60205260408120600581015460018201546114cc9190610100900463ffffffff16612fd1565b600482015460018301546114ee90610100900463ffffffff16620f4240612fbe565b6114f89190612fd1565b119392505050565b6000610c5a61012d5490565b61151581611fa4565b61154e576040517f9fefd0f100000000000000000000000000000000000000000000000000000000815260048101829052602401610847565b61094c816122da565b60006001600160e01b031982167f8678b01e0000000000000000000000000000000000000000000000000000000014806115ba57506001600160e01b031982167f4d19145e00000000000000000000000000000000000000000000000000000000145b806106a257506106a282612442565b6040517ffdef91060000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063fdef910690611616908890889088908890889060040161324b565b602060405180830381865afa158015611633573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116579190613289565b6116af576040517f32dbe3b40000000000000000000000000000000000000000000000000000000081526001600160a01b03808816600483015280871660248301528516604482015260648101849052608401610847565b505050505050565b6116c56001620f4240612fbe565b6116d560408301602084016132b8565b63ffffffff161115611740576116ef6001620f4240612fbe565b6116ff60408301602084016132b8565b6040517fcc80c195000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff166024820152604401610847565b620f424061175460608301604084016132b8565b63ffffffff16111561177457620f42406116ff60608301604084016132b8565b610e1061178760808301606084016132d5565b67ffffffffffffffff1610156117f057610e106117aa60808301606084016132d5565b6040517fc51033ee00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff928316600482015291166024820152604401610847565b6301e1338061180560808301606084016132d5565b67ffffffffffffffff16111561182a576301e133806117aa60808301606084016132d5565b80610160611838828261330c565b507fa8a18d06ddd19f24a872740e3d364c86f62be25f7154525dda18ef07fda46f3e9050611869602083018361341f565b61187960408401602085016132b8565b61188960608501604086016132b8565b61189960808601606087016132d5565b85608001356040516118af95949392919061343c565b60405180910390a150565b600083815261015f602052604081206118d281611f36565b6118e05760009150506107a6565b60008360038111156118f4576118f4612a8e565b036119035760009150506107a6565b61019154600182015460405163059329b960e31b81526001600160a01b038781166004830152600160a81b90920467ffffffffffffffff166024820152911690632c994dc890604401602060405180830381865afa158015611969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198d9190612fe8565b60000361199e5760009150506107a6565b6001600160a01b038416600090815260068201602052604081205460ff1660038111156119cd576119cd612a8e565b141580156119f457506002600182015460ff1660028111156119f1576119f1612a8e565b14155b15611a035760009150506107a6565b506001949350505050565b60c9547f821b6e3a557148015a918c89e5d092e878a69854a2d1a410635f771bd5a8a3f590610792906001600160a01b03163033610780565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611a7f57611a7a83612480565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ad9575060408051601f3d908101601f19168201909252611ad691810190612fe8565b60015b611b4b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610847565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611be05760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610847565b50611a7a83838361254b565b6000611bf6612570565b9050886001600160a01b0316817fa6c1f8f4276dc3f243459e13b557c84e8f4e90b2e09070bad5f6909cee687c9288888c8c8a8a8a604051611c3e9796959493929190613478565b60405180910390a398975050505050505050565b6000806000611c6042611d93565b90508467ffffffffffffffff16600003611c7c57809250611ce1565b8492508067ffffffffffffffff168367ffffffffffffffff161015611ce1576040517f4cc9c0f400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808316600483015284166024820152604401610847565b61016054600090611d09906901000000000000000000900467ffffffffffffffff1685613587565b90508467ffffffffffffffff16600003611d2557809250611d8a565b8492508067ffffffffffffffff168367ffffffffffffffff161015611d8a576040517f4cc9c0f400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808316600483015284166024820152604401610847565b50509250929050565b600067ffffffffffffffff821115611e135760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201527f34206269747300000000000000000000000000000000000000000000000000006064820152608401610847565b5090565b6000620f4240821115611e62576040517fcc80c195000000000000000000000000000000000000000000000000000000008152620f4240600482015260248101839052604401610847565b611e6c8284612fd1565b92506000611e7d620f4240856135be565b9050611e8c620f4240856135d2565b91508015611ea057611e9d826135e6565b91505b5092915050565b600054610100900460ff16611f245760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610847565b611f2d8261258b565b610792816116b7565b600080611f4242611d93565b600184015490915067ffffffffffffffff808316650100000000009092041611801590611f915750600183015467ffffffffffffffff6d01000000000000000000000000009091048116908216105b80156107a6575050905460ff1615919050565b600081815261015f60205260408120805460ff1615611fc65750600092915050565b611fcf81611f36565b156120175760018082015460ff166002811115611fee57611fee612a8e565b14611ffc5750600092915050565b612005836106a8565b6120125750600092915050565b61202d565b6120208361149e565b61202d5750600092915050565b61203683610c5f565b6120435750600092915050565b50600192915050565b600084815261015f6020526040808220610191546001820154925163059329b960e31b81526001600160a01b038781166004830152600160a81b90940467ffffffffffffffff1660248201529193921690632c994dc890604401602060405180830381865afa1580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e79190612fe8565b6001600160a01b038516600090815260068401602052604090205490915060ff16600281600381111561211c5761211c612a8e565b0361213b576004830154612131908390612fbe565b600484015561219d565b600381600381111561214f5761214f612a8e565b0361216e576005830154612164908390612fbe565b600584015561219d565b600181600381111561218257612182612a8e565b0361219d576003830154612197908390612fbe565b60038401555b60028660038111156121b1576121b1612a8e565b036121d05760048301546121c6908390613001565b6004840155612232565b60038660038111156121e4576121e4612a8e565b036122035760058301546121f9908390613001565b6005840155612232565b600186600381111561221757612217612a8e565b0361223257600383015461222c908390613001565b60038401555b6001600160a01b03851660009081526006840160205260409020805487919060ff1916600183600381111561226957612269612a8e565b0217905550846001600160a01b0316877fb83d25c6a5d258561330739951487acb4bd09ba5190b5d32c4f261817d90679288856040516122aa929190613600565b60405180910390a38380156122c357506122c387611fa4565b156122d1576122d1876122da565b50505050505050565b600081815261015f60205260409020805460ff19166001179055611a7a61230960c9546001600160a01b031690565b8261015f6000858152602001908152602001600020600701805480602002602001604051908101604052809291908181526020016000905b82821015612425576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600181015493830193909352600283018054929392918401916123949061304a565b80601f01602080910402602001604051908101604052809291908181526020018280546123c09061304a565b801561240d5780601f106123e25761010080835404028352916020019161240d565b820191906000526020600020905b8154815290600101906020018083116123f057829003601f168201915b50505050508152505081526020019060010190612341565b505050600086815261015f60205260409020600801549050612611565b60006001600160e01b031982167fda35c6640000000000000000000000000000000000000000000000000000000014806106a257506106a2826126e0565b6001600160a01b0381163b6124fd5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610847565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6125548361277b565b6000825111806125615750805b15611a7a576111d183836127bb565b600061257a611500565b9050610b9c61012d80546001019055565b600054610100900460ff166126085760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610847565b61094c816128c6565b6040517fc71bf3240000000000000000000000000000000000000000000000000000000081526060906000906001600160a01b0387169063c71bf324906126609088908890889060040161361b565b6000604051808303816000875af115801561267f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126a79190810190613644565b604051919350915085907f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90600090a294509492505050565b60006001600160e01b031982167f41de683000000000000000000000000000000000000000000000000000000000148061274357506001600160e01b031982167f52d1902d00000000000000000000000000000000000000000000000000000000145b806106a257507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146106a2565b61278481612480565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b61283a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610847565b600080846001600160a01b031684604051612855919061374a565b600060405180830381855af49150503d8060008114612890576040519150601f19603f3d011682016040523d82523d6000602084013e612895565b606091505b50915091506128bd828260405180606001604052806027815260200161377060279139612972565b95945050505050565b600054610100900460ff166129435760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610847565b60c9805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b606083156129815750816107a6565b6107a683838151156129965781518083602001fd5b8060405162461bcd60e51b8152600401610847919061375c565b6000602082840312156129c257600080fd5b81356001600160e01b0319811681146107a657600080fd5b6000602082840312156129ec57600080fd5b5035919050565b600060a08284031215612a0557600080fd5b50919050565b600060a08284031215612a1d57600080fd5b6107a683836129f3565b6001600160a01b038116811461094c57600080fd5b803560048110612a4b57600080fd5b919050565b600080600060608486031215612a6557600080fd5b833592506020840135612a7781612a27565b9150612a8560408501612a3c565b90509250925092565b634e487b7160e01b600052602160045260246000fd5b6003811061094c5761094c612a8e565b60208101612ac183612aa4565b91905290565b600060208284031215612ad957600080fd5b81356107a681612a27565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612b2357612b23612ae4565b604052919050565b600067ffffffffffffffff821115612b4557612b45612ae4565b50601f01601f191660200190565b60008060408385031215612b6657600080fd5b8235612b7181612a27565b9150602083013567ffffffffffffffff811115612b8d57600080fd5b8301601f81018513612b9e57600080fd5b8035612bb1612bac82612b2b565b612afa565b818152866020838501011115612bc657600080fd5b816020840160208301376000602083830101528093505050509250929050565b60008060408385031215612bf957600080fd5b823591506020830135612c0b81612a27565b809150509250929050565b60048110612c2657612c26612a8e565b9052565b602081016106a28284612c16565b60008083601f840112612c4a57600080fd5b50813567ffffffffffffffff811115612c6257600080fd5b6020830191508360208260051b8501011115612c7d57600080fd5b9250929050565b67ffffffffffffffff8116811461094c57600080fd5b8035612a4b81612c84565b801515811461094c57600080fd5b8035612a4b81612ca5565b600080600080600080600080600060e08a8c031215612cdc57600080fd5b893567ffffffffffffffff80821115612cf457600080fd5b818c0191508c601f830112612d0857600080fd5b813581811115612d1757600080fd5b8d6020828501011115612d2957600080fd5b60209283019b509950908b01359080821115612d4457600080fd5b50612d518c828d01612c38565b90985096505060408a01359450612d6a60608b01612c9a565b9350612d7860808b01612c9a565b9250612d8660a08b01612a3c565b9150612d9460c08b01612cb3565b90509295985092959850929598565b600080600060e08486031215612db857600080fd5b8335612dc381612a27565b9250612dd285602086016129f3565b915060c0840135612de281612a27565b809150509250925092565b60005b83811015612e08578181015183820152602001612df0565b50506000910152565b60008151808452612e29816020860160208601612ded565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015612eae578284038952815180516001600160a01b031685528581015186860152604090810151606091860182905290612e9a81870183612e11565b9a87019a9550505090840190600101612e5b565b5091979650505050505050565b60006101a0881515835287151560208401528651612ed881612aa4565b8060408501525063ffffffff6020880151166060840152604087015167ffffffffffffffff80821660808601528060608a01511660a08601528060808a01511660c0860152505060a087015160e0840152612f4b6101008401878051825260208082015190830152604090810151910152565b80610160840152612f5e81840186612e3d565b91505082610180830152979650505050505050565b600080600060608486031215612f8857600080fd5b83359250612f9860208501612a3c565b91506040840135612de281612ca5565b634e487b7160e01b600052601160045260246000fd5b818103818111156106a2576106a2612fa8565b80820281158282048414176106a2576106a2612fa8565b600060208284031215612ffa57600080fd5b5051919050565b808201808211156106a2576106a2612fa8565b634e487b7160e01b600052603260045260246000fd5b60008235605e1983360301811261304057600080fd5b9190910192915050565b600181811c9082168061305e57607f821691505b602082108103612a0557634e487b7160e01b600052602260045260246000fd5b601f821115611a7a57600081815260208120601f850160051c810160208610156130a55750805b601f850160051c820191505b818110156116af578281556001016130b1565b81356130cf81612a27565b6001600160a01b03811673ffffffffffffffffffffffffffffffffffffffff1983541617825550600160208084013582840155600283016040850135601e1986360301811261311d57600080fd5b8501803567ffffffffffffffff81111561313657600080fd5b803603848301131561314757600080fd5b61315b81613155855461304a565b8561307e565b6000601f821160018114613191576000831561317957508382018601355b600019600385901b1c1916600184901b1785556131ea565b600085815260209020601f19841690835b828110156131c1578685018901358255938801939089019088016131a2565b50848210156131e05760001960f88660031b161c198885880101351681555b50508683881b0185555b505050505050505050565b8381526001600160a01b0383166020820152606081016132186040830184612c16565b949350505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60006001600160a01b0380881683528087166020840152508460408301526080606083015261327e608083018486613220565b979650505050505050565b60006020828403121561329b57600080fd5b81516107a681612ca5565b63ffffffff8116811461094c57600080fd5b6000602082840312156132ca57600080fd5b81356107a6816132a6565b6000602082840312156132e757600080fd5b81356107a681612c84565b6003811061094c57600080fd5b600081356106a281612c84565b8135613317816132f2565b61332081612aa4565b815460ff821691508160ff198216178355602084013561333f816132a6565b64ffffffff008160081b16905080837fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008416171784556040850135613383816132a6565b68ffffffff00000000008160281b16847fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000008516178317178555505050506134116133cf606084016132ff565b82547fffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffff1660489190911b70ffffffffffffffff00000000000000000016178255565b608082013560018201555050565b60006020828403121561343157600080fd5b81356107a6816132f2565b60a0810161344987612aa4565b95815263ffffffff948516602082015292909316604083015267ffffffffffffffff1660608201526080015290565b600067ffffffffffffffff808a1683526020818a1681850152604060a0818601526134a760a086018a8c613220565b606086820381880152818983528483019050848a60051b8401018b60005b8c81101561356957601f198684030184528135605e198f36030181126134ea57600080fd5b8e0180356134f781612a27565b6001600160a01b0316845280890135898501528781013536829003601e1901811261352157600080fd5b0188810190358a81111561353457600080fd5b80360382131561354357600080fd5b86898601526135558786018284613220565b958a019594505050908701906001016134c5565b50508097505050505050505082608083015298975050505050505050565b67ffffffffffffffff818116838216019080821115611ea057611ea0612fa8565b634e487b7160e01b600052601260045260246000fd5b6000826135cd576135cd6135a8565b500690565b6000826135e1576135e16135a8565b500490565b600060001982036135f9576135f9612fa8565b5060010190565b6040810161360e8285612c16565b8260208301529392505050565b8381526060602082015260006136346060830185612e3d565b9050826040830152949350505050565b600080604080848603121561365857600080fd5b835167ffffffffffffffff8082111561367057600080fd5b818601915086601f83011261368457600080fd5b815160208282111561369857613698612ae4565b8160051b6136a7828201612afa565b928352848101820192828101908b8511156136c157600080fd5b83870192505b84831015613736578251868111156136df5760008081fd5b8701603f81018d136136f15760008081fd5b84810151613701612bac82612b2b565b8181528e8b8385010111156137165760008081fd5b613725828883018d8601612ded565b8452505091830191908301906136c7565b9990920151989a9899505050505050505050565b60008251613040818460208701612ded565b6020815260006107a66020830184612e1156fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212200dcce9efc1d5cb24c7cb47d6c8d3c605731ce282be4e6d7daa19c04ea775b4a764736f6c63430008110033",
"devdoc": {
"author": "Aragon Association - 2021-2023",
"details": "This contract inherits from `MajorityVotingBase` and implements the `IMajorityVoting` interface.",
"errors": {
"DaoUnauthorized(address,address,address,bytes32)": [
{
"params": {
"dao": "The associated DAO.",
"permissionId": "The permission identifier.",
"where": "The context in which the authorization reverted.",
"who": "The address (EOA or contract) missing the permission."
}
}
],
"DateOutOfBounds(uint64,uint64)": [
{
"params": {
"actual": "The actual value.",
"limit": "The limit value."
}
}
],
"MinDurationOutOfBounds(uint64,uint64)": [
{
"params": {
"actual": "The actual value.",
"limit": "The limit value."
}
}
],
"ProposalCreationForbidden(address)": [
{
"params": {
"sender": "The sender address."
}
}
],
"ProposalExecutionForbidden(uint256)": [
{
"params": {
"proposalId": "The ID of the proposal."
}
}
],
"RatioOutOfBounds(uint256,uint256)": [
{
"params": {
"actual": "The actual value.",
"limit": "The maximal value."
}
},
{
"params": {
"actual": "The actual value.",
"limit": "The maximal value."
}
}
],
"VoteCastForbidden(uint256,address,uint8)": [
{
"params": {
"account": "The address of the _account.",
"proposalId": "The ID of the proposal.",
"voteOption": "The chosen vote option."
}
}
]
},
"kind": "dev",
"methods": {
"canExecute(uint256)": {
"params": {
"_proposalId": "The ID of the proposal to be checked."
},
"returns": {
"_0": "True if the proposal can be executed, false otherwise."
}
},
"canVote(uint256,address,uint8)": {
"details": "The function assumes the queried proposal exists.",
"params": {
"_account": "The account address to be checked.",
"_proposalId": "The proposal Id.",
"_voteOption": "Whether the voter abstains, supports or opposes the proposal."
},
"returns": {
"_0": "Returns true if the account is allowed to vote."
}
},
"createProposal(bytes,(address,uint256,bytes)[],uint256,uint64,uint64,uint8,bool)": {
"params": {
"_actions": "The actions that will be executed after the proposal passes.",
"_allowFailureMap": "Allows proposal to succeed even if an action reverts. Uses bitmap representation. If the bit at index `x` is 1, the tx succeeds even if the action at `x` failed. Passing 0 will be treated as atomic execution.",
"_endDate": "The end date of the proposal vote. If 0, `_startDate + minDuration` is used.",
"_metadata": "The metadata of the proposal.",
"_startDate": "The start date of the proposal vote. If 0, the current timestamp is used and the vote starts immediately.",
"_tryEarlyExecution": "If `true`, early execution is tried after the vote cast. The call does not revert if early execution is not possible.",
"_voteOption": "The chosen vote option to be casted on proposal creation."
},
"returns": {
"proposalId": "The ID of the proposal."
}
},
"dao()": {
"returns": {
"_0": "The DAO contract."
}
},
"execute(uint256)": {
"params": {
"_proposalId": "The ID of the proposal to be executed."
}
},
"getProposal(uint256)": {
"params": {
"_proposalId": "The ID of the proposal."
},
"returns": {
"actions": "The actions to be executed in the associated DAO after the proposal has passed.",
"allowFailureMap": "The bit map representations of which actions are allowed to revert so tx still succeeds.",
"executed": "Whether the proposal is executed or not.",
"open": "Whether the proposal is open or not.",
"parameters": "The parameters of the proposal vote.",
"tally": "The current tally of the proposal vote."
}
},
"getVoteOption(uint256,address)": {
"params": {
"_account": "The account address to be checked.",
"_proposalId": "The ID of the proposal."
},
"returns": {
"_0": "The vote option cast by a voter for a certain proposal."
}
},
"getVotingToken()": {
"details": "public function also useful for registering interfaceId and for distinguishing from majority voting interface.",
"returns": {
"_0": "The token used for voting."
}
},
"implementation()": {
"returns": {
"_0": "The address of the implementation contract."
}
},
"initialize(address,(uint8,uint32,uint32,uint64,uint256),address)": {
"details": "This method is required to support [ERC-1822](https://eips.ethereum.org/EIPS/eip-1822).",
"params": {
"_dao": "The IDAO interface of the associated DAO.",
"_token": "The governance token.",
"_votingSettings": "The voting settings."
}
},
"isMember(address)": {
"details": "This function must be implemented in the plugin contract that introduces the members to the DAO.",
"params": {
"_account": "The address of the account to be checked."
},
"returns": {
"_0": "Whether the account is a member or not."
}
},
"isMinParticipationReached(uint256)": {
"params": {
"_proposalId": "The ID of the proposal."
},
"returns": {
"_0": "Returns `true` if the participation is greater than the minimum particpation and `false` otherwise."
}
},
"isSupportThresholdReached(uint256)": {
"params": {
"_proposalId": "The ID of the proposal."
},
"returns": {
"_0": "Returns `true` if the support is greater than the support threshold and `false` otherwise."
}
},
"isSupportThresholdReachedEarly(uint256)": {
"params": {
"_proposalId": "The ID of the proposal."
},
"returns": {
"_0": "Returns `true` if the worst-case support is greater than the support threshold and `false` otherwise."
}
},
"minDuration()": {
"returns": {
"_0": "The minimum duration parameter."
}
},
"minParticipation()": {
"returns": {
"_0": "The minimum participation parameter."
}
},
"minProposerVotingPower()": {
"returns": {
"_0": "The minimum voting power required to create a proposal."
}
},
"proposalCount()": {
"returns": {
"_0": "The proposal count."
}
},
"proxiableUUID()": {
"details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."
},
"supportThreshold()": {
"returns": {
"_0": "The support threshold parameter."
}
},
"supportsInterface(bytes4)": {
"params": {
"_interfaceId": "The ID of the interface."
},
"returns": {
"_0": "Returns `true` if the interface is supported."
}
},
"totalVotingPower(uint256)": {
"params": {
"_blockNumber": "The block number."
},
"returns": {
"_0": "The total voting power."
}
},
"updateVotingSettings((uint8,uint32,uint32,uint64,uint256))": {
"params": {
"_votingSettings": "The new voting settings."
}
},
"upgradeTo(address)": {
"details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
},
"upgradeToAndCall(address,bytes)": {
"details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
},
"vote(uint256,uint8,bool)": {
"details": "`_voteOption`, 1 -> abstain, 2 -> yes, 3 -> no",
"params": {
"_proposalId": "The ID of the proposal.",
"_tryEarlyExecution": "If `true`, early execution is tried after the vote cast. The call does not revert if early execution is not possible.",
"_voteOption": "The chosen vote option."
}
},
"votingMode()": {
"returns": {
"_0": "The vote mode parameter."
}
}
},
"stateVariables": {
"__gap": {
"details": "This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain. https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps"
}
},
"title": "TokenVoting",
"version": 1
},
"userdoc": {
"errors": {
"DaoUnauthorized(address,address,address,bytes32)": [
{
"notice": "Thrown if a call is unauthorized in the associated DAO."
}
],
"DateOutOfBounds(uint64,uint64)": [
{
"notice": "Thrown if a date is out of bounds."
}
],
"MinDurationOutOfBounds(uint64,uint64)": [
{
"notice": "Thrown if the minimal duration value is out of bounds (less than one hour or greater than 1 year)."
}
],
"NoVotingPower()": [
{
"notice": "Thrown if the voting power is zero"
}
],
"ProposalCreationForbidden(address)": [
{
"notice": "Thrown when a sender is not allowed to create a proposal."
}
],
"ProposalExecutionForbidden(uint256)": [
{
"notice": "Thrown if the proposal execution is forbidden."
}
],
"RatioOutOfBounds(uint256,uint256)": [
{
"notice": "Thrown if a ratio value exceeds the maximal value of `10**6`."
},
{
"notice": "Thrown if a ratio value exceeds the maximal value of `10**6`."
}
],
"VoteCastForbidden(uint256,address,uint8)": [
{
"notice": "Thrown if an account is not allowed to cast a vote. This can be because the vote - has not started, - has ended, - was executed, or - the account doesn't have voting powers."
}
]
},
"events": {
"MembersAdded(address[])": {
"notice": "Emitted when members are added to the DAO plugin."
},
"MembersRemoved(address[])": {
"notice": "Emitted when members are removed from the DAO plugin."
},
"MembershipContractAnnounced(address)": {
"notice": "Emitted to announce the membership being defined by a contract."
},
"ProposalCreated(uint256,address,uint64,uint64,bytes,(address,uint256,bytes)[],uint256)": {
"notice": "Emitted when a proposal is created."
},
"ProposalExecuted(uint256)": {
"notice": "Emitted when a proposal is executed."
},
"VoteCast(uint256,address,uint8,uint256)": {
"notice": "Emitted when a vote is cast by a voter."
},
"VotingSettingsUpdated(uint8,uint32,uint32,uint64,uint256)": {
"notice": "Emitted when the voting settings are updated."
}
},
"kind": "user",
"methods": {
"UPDATE_VOTING_SETTINGS_PERMISSION_ID()": {
"notice": "The ID of the permission required to call the `updateVotingSettings` function."
},
"UPGRADE_PLUGIN_PERMISSION_ID()": {
"notice": "The ID of the permission required to call the `_authorizeUpgrade` function."
},
"canExecute(uint256)": {
"notice": "Checks if a proposal can be executed."
},
"canVote(uint256,address,uint8)": {
"notice": "Checks if an account can participate on a proposal vote. This can be because the vote - has not started, - has ended, - was executed, or - the voter doesn't have voting powers."
},
"createProposal(bytes,(address,uint256,bytes)[],uint256,uint64,uint64,uint8,bool)": {
"notice": "Creates a new majority voting proposal."
},
"dao()": {
"notice": "Returns the DAO contract."
},
"execute(uint256)": {
"notice": "Executes a proposal."
},
"getProposal(uint256)": {
"notice": "Returns all information for a proposal vote by its ID."
},
"getVoteOption(uint256,address)": {
"notice": "Returns whether the account has voted for the proposal. Note, that this does not check if the account has voting power."
},
"getVotingToken()": {
"notice": "getter function for the voting token."
},
"implementation()": {
"notice": "Returns the address of the implementation contract in the [proxy storage slot](https://eips.ethereum.org/EIPS/eip-1967) slot the [UUPS proxy](https://eips.ethereum.org/EIPS/eip-1822) is pointing to."
},
"initialize(address,(uint8,uint32,uint32,uint64,uint256),address)": {
"notice": "Initializes the component."
},
"isMember(address)": {
"notice": "Checks if an account is a member of the DAO."
},
"isMinParticipationReached(uint256)": {
"notice": "Checks if the participation value defined as $$\\texttt{participation} = \\frac{N_\\text{yes}+N_\\text{no}+N_\\text{abstain}}{N_\\text{total}}$$ for a proposal vote is greater or equal than the minimum participation value."
},
"isSupportThresholdReached(uint256)": {
"notice": "Checks if the support value defined as $$\\texttt{support} = \\frac{N_\\text{yes}}{N_\\text{yes}+N_\\text{no}}$$ for a proposal vote is greater than the support threshold."
},
"isSupportThresholdReachedEarly(uint256)": {
"notice": "Checks if the worst-case support value defined as $$\\texttt{worstCaseSupport} = \\frac{N_\\text{yes}}{ N_\\text{total}-N_\\text{abstain}}$$ for a proposal vote is greater than the support threshold."
},
"minDuration()": {
"notice": "Returns the minimum duration parameter stored in the voting settings."
},
"minParticipation()": {
"notice": "Returns the minimum participation parameter stored in the voting settings."
},
"minProposerVotingPower()": {
"notice": "Returns the minimum voting power required to create a proposa stored in the voting settings."
},
"pluginType()": {
"notice": "returns the plugin's type"
},
"proposalCount()": {
"notice": "Returns the proposal count determining the next proposal ID."
},
"supportThreshold()": {
"notice": "Returns the support threshold parameter stored in the voting settings."
},
"supportsInterface(bytes4)": {
"notice": "Checks if this or the parent contract supports an interface by its ID."
},
"totalVotingPower(uint256)": {
"notice": "Returns the total voting power checkpointed for a specific block number."
},
"updateVotingSettings((uint8,uint32,uint32,uint64,uint256))": {
"notice": "Updates the voting settings."
},
"vote(uint256,uint8,bool)": {
"notice": "Votes for a vote option and, optionally, executes the proposal."
},
"votingMode()": {
"notice": "Returns the vote mode stored in the voting settings."
}
},
"notice": "The majority voting implementation using an [OpenZepplin `Votes`](https://docs.openzeppelin.com/contracts/4.x/api/governance#Votes) compatible governance token.",
"version": 1
},
"storageLayout": {
"storage": [
{
"astId": 4599,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "_initialized",
"offset": 0,
"slot": "0",
"type": "t_uint8"
},
{
"astId": 4602,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "_initializing",
"offset": 1,
"slot": "0",
"type": "t_bool"
},
{
"astId": 8441,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "1",
"type": "t_array(t_uint256)50_storage"
},
{
"astId": 4581,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "51",
"type": "t_array(t_uint256)50_storage"
},
{
"astId": 4896,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "101",
"type": "t_array(t_uint256)50_storage"
},
{
"astId": 7506,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "151",
"type": "t_array(t_uint256)50_storage"
},
{
"astId": 1822,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "dao_",
"offset": 0,
"slot": "201",
"type": "t_contract(IDAO)903"
},
{
"astId": 1871,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "202",
"type": "t_array(t_uint256)49_storage"
},
{
"astId": 1806,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "251",
"type": "t_array(t_uint256)50_storage"
},
{
"astId": 1959,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "proposalCounter",
"offset": 0,
"slot": "301",
"type": "t_struct(Counter)7513_storage"
},
{
"astId": 2090,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "302",
"type": "t_array(t_uint256)49_storage"
},
{
"astId": 2663,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "proposals",
"offset": 0,
"slot": "351",
"type": "t_mapping(t_uint256,t_struct(Proposal)2600_storage)"
},
{
"astId": 2667,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "votingSettings",
"offset": 0,
"slot": "352",
"type": "t_struct(VotingSettings)2580_storage"
},
{
"astId": 3458,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "354",
"type": "t_array(t_uint256)47_storage"
},
{
"astId": 12040,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "votingToken",
"offset": 0,
"slot": "401",
"type": "t_contract(IFollowNFT)13056"
},
{
"astId": 12580,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "__gap",
"offset": 0,
"slot": "402",
"type": "t_array(t_uint256)49_storage"
}
],
"types": {
"t_address": {
"encoding": "inplace",
"label": "address",
"numberOfBytes": "20"
},
"t_array(t_struct(Action)759_storage)dyn_storage": {
"base": "t_struct(Action)759_storage",
"encoding": "dynamic_array",
"label": "struct IDAO.Action[]",
"numberOfBytes": "32"
},
"t_array(t_uint256)47_storage": {
"base": "t_uint256",
"encoding": "inplace",
"label": "uint256[47]",
"numberOfBytes": "1504"
},
"t_array(t_uint256)49_storage": {
"base": "t_uint256",
"encoding": "inplace",
"label": "uint256[49]",
"numberOfBytes": "1568"
},
"t_array(t_uint256)50_storage": {
"base": "t_uint256",
"encoding": "inplace",
"label": "uint256[50]",
"numberOfBytes": "1600"
},
"t_bool": {
"encoding": "inplace",
"label": "bool",
"numberOfBytes": "1"
},
"t_bytes_storage": {
"encoding": "bytes",
"label": "bytes",
"numberOfBytes": "32"
},
"t_contract(IDAO)903": {
"encoding": "inplace",
"label": "contract IDAO",
"numberOfBytes": "20"
},
"t_contract(IFollowNFT)13056": {
"encoding": "inplace",
"label": "contract IFollowNFT",
"numberOfBytes": "20"
},
"t_enum(VoteOption)2431": {
"encoding": "inplace",
"label": "enum IMajorityVoting.VoteOption",
"numberOfBytes": "1"
},
"t_enum(VotingMode)2568": {
"encoding": "inplace",
"label": "enum MajorityVotingBase.VotingMode",
"numberOfBytes": "1"
},
"t_mapping(t_address,t_enum(VoteOption)2431)": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => enum IMajorityVoting.VoteOption)",
"numberOfBytes": "32",
"value": "t_enum(VoteOption)2431"
},
"t_mapping(t_uint256,t_struct(Proposal)2600_storage)": {
"encoding": "mapping",
"key": "t_uint256",
"label": "mapping(uint256 => struct MajorityVotingBase.Proposal)",
"numberOfBytes": "32",
"value": "t_struct(Proposal)2600_storage"
},
"t_struct(Action)759_storage": {
"encoding": "inplace",
"label": "struct IDAO.Action",
"members": [
{
"astId": 754,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "to",
"offset": 0,
"slot": "0",
"type": "t_address"
},
{
"astId": 756,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "value",
"offset": 0,
"slot": "1",
"type": "t_uint256"
},
{
"astId": 758,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "data",
"offset": 0,
"slot": "2",
"type": "t_bytes_storage"
}
],
"numberOfBytes": "96"
},
"t_struct(Counter)7513_storage": {
"encoding": "inplace",
"label": "struct CountersUpgradeable.Counter",
"members": [
{
"astId": 7512,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "_value",
"offset": 0,
"slot": "0",
"type": "t_uint256"
}
],
"numberOfBytes": "32"
},
"t_struct(Proposal)2600_storage": {
"encoding": "inplace",
"label": "struct MajorityVotingBase.Proposal",
"members": [
{
"astId": 2582,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "executed",
"offset": 0,
"slot": "0",
"type": "t_bool"
},
{
"astId": 2585,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "parameters",
"offset": 0,
"slot": "1",
"type": "t_struct(ProposalParameters)2614_storage"
},
{
"astId": 2588,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "tally",
"offset": 0,
"slot": "3",
"type": "t_struct(Tally)2621_storage"
},
{
"astId": 2593,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "voters",
"offset": 0,
"slot": "6",
"type": "t_mapping(t_address,t_enum(VoteOption)2431)"
},
{
"astId": 2597,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "actions",
"offset": 0,
"slot": "7",
"type": "t_array(t_struct(Action)759_storage)dyn_storage"
},
{
"astId": 2599,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "allowFailureMap",
"offset": 0,
"slot": "8",
"type": "t_uint256"
}
],
"numberOfBytes": "288"
},
"t_struct(ProposalParameters)2614_storage": {
"encoding": "inplace",
"label": "struct MajorityVotingBase.ProposalParameters",
"members": [
{
"astId": 2603,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "votingMode",
"offset": 0,
"slot": "0",
"type": "t_enum(VotingMode)2568"
},
{
"astId": 2605,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "supportThreshold",
"offset": 1,
"slot": "0",
"type": "t_uint32"
},
{
"astId": 2607,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "startDate",
"offset": 5,
"slot": "0",
"type": "t_uint64"
},
{
"astId": 2609,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "endDate",
"offset": 13,
"slot": "0",
"type": "t_uint64"
},
{
"astId": 2611,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "snapshotBlock",
"offset": 21,
"slot": "0",
"type": "t_uint64"
},
{
"astId": 2613,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "minVotingPower",
"offset": 0,
"slot": "1",
"type": "t_uint256"
}
],
"numberOfBytes": "64"
},
"t_struct(Tally)2621_storage": {
"encoding": "inplace",
"label": "struct MajorityVotingBase.Tally",
"members": [
{
"astId": 2616,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "abstain",
"offset": 0,
"slot": "0",
"type": "t_uint256"
},
{
"astId": 2618,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "yes",
"offset": 0,
"slot": "1",
"type": "t_uint256"
},
{
"astId": 2620,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "no",
"offset": 0,
"slot": "2",
"type": "t_uint256"
}
],
"numberOfBytes": "96"
},
"t_struct(VotingSettings)2580_storage": {
"encoding": "inplace",
"label": "struct MajorityVotingBase.VotingSettings",
"members": [
{
"astId": 2571,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "votingMode",
"offset": 0,
"slot": "0",
"type": "t_enum(VotingMode)2568"
},
{
"astId": 2573,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "supportThreshold",
"offset": 1,
"slot": "0",
"type": "t_uint32"
},
{
"astId": 2575,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "minParticipation",
"offset": 5,
"slot": "0",
"type": "t_uint32"
},
{
"astId": 2577,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "minDuration",
"offset": 9,
"slot": "0",
"type": "t_uint64"
},
{
"astId": 2579,
"contract": "contracts/LensVotingPlugin.sol:LensVotingPlugin",
"label": "minProposerVotingPower",
"offset": 0,
"slot": "1",
"type": "t_uint256"
}
],
"numberOfBytes": "64"
},
"t_uint256": {
"encoding": "inplace",
"label": "uint256",
"numberOfBytes": "32"
},
"t_uint32": {
"encoding": "inplace",
"label": "uint32",
"numberOfBytes": "4"
},
"t_uint64": {
"encoding": "inplace",
"label": "uint64",
"numberOfBytes": "8"
},
"t_uint8": {
"encoding": "inplace",
"label": "uint8",
"numberOfBytes": "1"
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment