From 1acd0b0f704db87e975fab58a6e2bff05d9c8bc2 Mon Sep 17 00:00:00 2001 From: Ben DiFrancesco Date: Mon, 17 Aug 2026 14:30:29 -0400 Subject: [PATCH 1/3] Configure scripts for governor deployment --- AGENTS.md | 8 ++-- README.md | 9 +++-- ...oyGitcoinGovernorWithGuardianMainnet.s.sol | 37 ++++++++----------- .../GovernorUpgradeProposal.integration.t.sol | 10 ++--- ...ostUpgradeQuorumBehavior.integration.t.sol | 22 +++++------ .../GitcoinGovernorUpgradeTestBase.sol | 10 ++--- 6 files changed, 44 insertions(+), 52 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index b117729..392046d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -243,9 +243,11 @@ secret). CI supplies it via the `MAINNET_RPC_URL` repository secret. - `GitcoinGovernorWithGuardian` and its two custom extensions are written. - The Governor **deploy script** (`DeployGitcoinGovernorWithGuardian[Mainnet].s.sol`) and the - **upgrade proposal script** (`ProposeGovernorUpgrade[Mainnet].s.sol`) are in place. Both carry - `TODO`s to confirm with stakeholders before running (Governor name, vote extension, proposal - guardian; new Governor address, proposer, proposal text). + **upgrade proposal script** (`ProposeGovernorUpgrade[Mainnet].s.sol`) are in place. The deploy + configuration is finalized: "Gitcoin Governor Charlie," 1.5 million GTC quorum, 14,400-block + voting delay, unchanged 40,320-block voting period and 150,000 GTC proposal threshold, 7,200-block + vote extension, and Proposal Guardian `0x5743E35477363241300FcEdc2F5eB0195F300817`. The proposal + script still carries `TODO`s for the new Governor address, proposer, and proposal text. - The **mainnet fork integration suite** (`test/*.integration.t.sol`) is in place: it deploys the new Governor with the real deploy script, submits the upgrade proposal with the real proposal script, and exercises the upgrade lifecycle, post-upgrade governance, quorum behavior diff --git a/README.md b/README.md index 6f1ea06..791308e 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,11 @@ scopelint check # verify formatting and conventions (also run in CI) `script/DeployGitcoinGovernorWithGuardian.s.sol` holds the reusable deployment mechanics, and `script/DeployGitcoinGovernorWithGuardianMainnet.s.sol` supplies the mainnet configuration: the GTC -token and Compound Timelock addresses (fixed since 2021), plus governance parameters that mirror the -active "GTC Governor Bravo" so the upgrade preserves current behavior. The new late-quorum vote -extension, the initial proposal guardian, and the Governor name carry `TODO`s to confirm with -stakeholders before deploying. +token and Compound Timelock addresses (fixed since 2021), plus the finalized governance parameters. +The upgraded Governor is named "Gitcoin Governor Charlie," uses a 1.5 million GTC quorum, a 14,400- +block voting delay (approximately 48 hours), the existing 40,320-block voting period and 150,000 GTC +proposal threshold, and a 7,200-block late-quorum voting window (approximately 24 hours). Proposal +Guardian authority is initially assigned to `0x5743E35477363241300FcEdc2F5eB0195F300817`. Dry-run first to simulate the deployment and print the transaction it would send, and review that before broadcasting: diff --git a/script/DeployGitcoinGovernorWithGuardianMainnet.s.sol b/script/DeployGitcoinGovernorWithGuardianMainnet.s.sol index 9323230..8baf84b 100644 --- a/script/DeployGitcoinGovernorWithGuardianMainnet.s.sol +++ b/script/DeployGitcoinGovernorWithGuardianMainnet.s.sol @@ -6,43 +6,36 @@ import {DeployGitcoinGovernorWithGuardian} from "script/DeployGitcoinGovernorWit import {IComp} from "src/interfaces/IComp.sol"; /// @notice Mainnet deployment configuration for the upgraded Gitcoin Governor. -/// @dev The governance parameters mirror the active "GTC Governor Bravo" -/// (0x9D4C63565D5618310271bF3F3c01b2954C1D1639) so the upgrade preserves current behavior. The -/// late-quorum vote extension is new to this Governor and has no precedent to carry over. +/// @dev The proposal threshold and voting period mirror the active "GTC Governor Bravo" +/// (0x9D4C63565D5618310271bF3F3c01b2954C1D1639). The quorum, voting delay, late-quorum vote +/// extension, Proposal Guardian, and name are configured specifically for this upgrade. contract DeployGitcoinGovernorWithGuardianMainnet is DeployGitcoinGovernorWithGuardian { - // TODO: Confirm the Governor name with Gitcoin stakeholders before deploying. It sets the EIP-712 - // domain separator used when signing votes; defaulted here to the active Governor's name for - // continuity. - string constant GOVERNOR_NAME = "GTC Governor Bravo"; + // Sets the EIP-712 domain name used when signing votes. + string constant GOVERNOR_NAME = "Gitcoin Governor Charlie"; // Fixed values that can't change IComp constant GTC_TOKEN = IComp(0xDe30da39c46104798bB5aA3fe8B9e0e1F348163F); ICompoundTimelock constant TIMELOCK = ICompoundTimelock(payable(0x57a8865cfB1eCEf7253c27da6B4BC3dAEE5Be518)); - // Match the values from the existing Governor - uint256 constant INITIAL_QUORUM = 2_500_000e18; - uint48 constant INITIAL_VOTING_DELAY = 13_140; + // Governance parameters confirmed for the upgrade. The voting period and proposal threshold + // remain unchanged from the existing Governor. + uint256 constant INITIAL_QUORUM = 1_500_000e18; + uint48 constant INITIAL_VOTING_DELAY = 14_400; uint32 constant INITIAL_VOTING_PERIOD = 40_320; uint256 constant INITIAL_PROPOSAL_THRESHOLD = 150_000e18; - // TODO: Validate the late-quorum vote extension with Gitcoin stakeholders before deploying. This - // is a new parameter with no precedent in the active Governor; defaulted here to ~2 days (14,400 - // blocks at ~12s/block), the minimum window guaranteed between a proposal reaching quorum and its - // voting period ending. - uint48 constant INITIAL_VOTE_EXTENSION = 14_400; + // Guarantees approximately 24 hours between a proposal reaching quorum and voting ending, + // assuming 12-second blocks. + uint48 constant INITIAL_VOTE_EXTENSION = 7200; - // TODO: Confirm the proposal guardian address with Gitcoin stakeholders before deploying — - // presumably the DAO's security-council multisig. Defaulted here to the Timelock, i.e. the DAO - // itself, so that until a dedicated guardian is chosen, cancel authority rests with governance - // rather than with no one (an unset guardian would let every proposer cancel their own proposals - // at any lifecycle stage). - address constant INITIAL_PROPOSAL_GUARDIAN = 0x57a8865cfB1eCEf7253c27da6B4BC3dAEE5Be518; + // Gitcoin's designated Proposal Guardian. + address constant INITIAL_PROPOSAL_GUARDIAN = 0x5743E35477363241300FcEdc2F5eB0195F300817; // Boilerplate override so this file declares the public `run()` that scopelint's script rule // looks for; the mechanics all live in the base. function run() public override { - super.run(); + DeployGitcoinGovernorWithGuardian.run(); } function _getDeploymentParams() internal pure override returns (DeploymentParams memory) { diff --git a/test/GovernorUpgradeProposal.integration.t.sol b/test/GovernorUpgradeProposal.integration.t.sol index 2ef09e7..25a36b1 100644 --- a/test/GovernorUpgradeProposal.integration.t.sol +++ b/test/GovernorUpgradeProposal.integration.t.sol @@ -10,18 +10,16 @@ import {GitcoinGovernorUpgradeTestBase} from "test/helpers/GitcoinGovernorUpgrad // through passing, failing, and post-upgrade outcomes for control of the Timelock. abstract contract GovernorUpgradeProposalTest is GitcoinGovernorUpgradeTestBase { function test_DeploysTheNewGovernorWithTheMainnetConfiguration() external view { - assertEq(governor.name(), "GTC Governor Bravo"); + assertEq(governor.name(), "Gitcoin Governor Charlie"); assertEq(address(governor.token()), address(GTC_TOKEN)); assertEq(governor.timelock(), address(TIMELOCK)); - // These values mirror the active Governor, read from mainnet when the tests were written. - assertEq(governor.votingDelay(), 13_140); + assertEq(governor.votingDelay(), 14_400); assertEq(governor.votingPeriod(), 40_320); + // The proposal threshold and voting period remain unchanged from the active Governor. assertEq(governor.proposalThreshold(), 150_000e18); assertEq(governor.quorum(block.number), QUORUM); assertEq(governor.lateQuorumVoteExtension(), VOTE_EXTENSION); - // The placeholder guardian from the mainnet deploy config; update this assertion when the - // security-council guardian address is confirmed. - assertEq(governor.proposalGuardian(), address(TIMELOCK)); + assertEq(governor.proposalGuardian(), PROPOSAL_GUARDIAN); assertEq( governor.COUNTING_MODE(), "support=bravo,fractional&quorum=for,abstain¶ms=fractional" ); diff --git a/test/PostUpgradeQuorumBehavior.integration.t.sol b/test/PostUpgradeQuorumBehavior.integration.t.sol index 83bfc2d..99bd396 100644 --- a/test/PostUpgradeQuorumBehavior.integration.t.sol +++ b/test/PostUpgradeQuorumBehavior.integration.t.sol @@ -25,15 +25,6 @@ abstract contract PostUpgradeQuorumBehaviorTest is GitcoinGovernorPostUpgradeTes "rebalance the raised-quorum scenarios" ); } - if (_votingWeightOf(KEV) < LOWERED_QUORUM) { - revert("kev.eth no longer clears the lowered quorum; rebalance the lowered-quorum scenario"); - } - if (_votingWeightOf(KEV) >= QUORUM) { - revert( - "kev.eth now single-handedly clears the original quorum; " - "rebalance the lowered-quorum scenario" - ); - } uint256 _blocWeight = _votingWeightOf(PROPOSER) + _votingWeightOf(ANON_GNOSIS_SAFE) + _votingWeightOf(EVENT_HORIZON); if (_blocWeight < LOWERED_QUORUM) { @@ -41,6 +32,11 @@ abstract contract PostUpgradeQuorumBehaviorTest is GitcoinGovernorPostUpgradeTes "The sniping bloc no longer clears the lowered quorum; rebalance the late-quorum scenario" ); } + if (_blocWeight >= QUORUM) { + revert( + "The sniping bloc now clears the original quorum; rebalance the lowered-quorum scenario" + ); + } if (_votingWeightOf(KEV) <= _blocWeight) { revert("kev.eth no longer out-weighs the sniping bloc; rebalance the late-quorum scenario"); } @@ -103,14 +99,16 @@ abstract contract PostUpgradeQuorumBehaviorTest is GitcoinGovernorPostUpgradeTes function test_ProposalMeetingOnlyTheLoweredQuorumSucceedsAndExecutes() external { _setQuorumViaProposal(LOWERED_QUORUM); - // kev.eth alone clears the lowered quorum but would have fallen short of the original one - // (guarded in setUp). + // The minority bloc clears the lowered quorum but falls short of the original one (guarded in + // setUp). address _receiver = makeAddr("receiver"); ProposalDetails memory _proposal = _buildGtcSendProposal(_receiver, 1000e18, "Send GTC under the lowered quorum"); _submitProposal(_proposal); _jumpToProposalActive(_proposal.id); - _castVote(KEV, _proposal.id, FOR); + _castVote(PROPOSER, _proposal.id, FOR); + _castVote(ANON_GNOSIS_SAFE, _proposal.id, FOR); + _castVote(EVENT_HORIZON, _proposal.id, FOR); _jumpPastProposalDeadline(_proposal.id); assertEq(governor.state(_proposal.id), IGovernor.ProposalState.Succeeded); diff --git a/test/helpers/GitcoinGovernorUpgradeTestBase.sol b/test/helpers/GitcoinGovernorUpgradeTestBase.sol index ff0c523..f9c0bfc 100644 --- a/test/helpers/GitcoinGovernorUpgradeTestBase.sol +++ b/test/helpers/GitcoinGovernorUpgradeTestBase.sol @@ -29,6 +29,7 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { IGtc constant GTC_TOKEN = IGtc(0xDe30da39c46104798bB5aA3fe8B9e0e1F348163F); ICompoundTimelock constant TIMELOCK = ICompoundTimelock(payable(0x57a8865cfB1eCEf7253c27da6B4BC3dAEE5Be518)); + address constant PROPOSAL_GUARDIAN = 0x5743E35477363241300FcEdc2F5eB0195F300817; // kbw.eth — a real delegate whose voting weight (~485k GTC at FORK_BLOCK) clears the 150k // proposal threshold on both governors (guarded in setUp). @@ -43,10 +44,9 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { address constant LEFTERIS = 0x2B888954421b424C5D3D9Ce9bB67c9bD47537d12; // lefteris.eth, ~100k GTC address constant CERV1 = 0x5a5D9aB7b1bD978F80909503EBb828879daCa9C3; // cerv1.eth, ~90k GTC - // Governance parameters of the active Governor at FORK_BLOCK, mirrored by the new Governor's - // mainnet deploy config. - uint256 constant QUORUM = 2_500_000e18; - uint48 constant VOTE_EXTENSION = 14_400; + // New governance parameters supplied by the mainnet deploy config. + uint256 constant QUORUM = 1_500_000e18; + uint48 constant VOTE_EXTENSION = 7200; // Floors on the Timelock's real treasury holdings, guarded in setUp: the send tests draw on // the Timelock's genuine balances rather than manufactured ones, and need enough behind them @@ -70,7 +70,7 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { uint256 upgradeProposalId; // The electorate: real delegates whose live voting weights are read from the fork in setUp. - // Combined they must clear the 2.5M quorum — asserted in setUp so that a fork-block bump that + // Combined they must clear the 1.5M quorum — asserted in setUp so that a fork-block bump that // erodes their weight fails loudly rather than silently changing what the tests exercise. // Weights are stored at GTC's native uint96 checkpoint width so that vote math over them can // widen into narrower types (e.g. the uint128 fields of a fractional vote) without unsafe From 859d37f0e0bfe52c2758f4cf0c257d1a0d5fbb4c Mon Sep 17 00:00:00 2001 From: Ben DiFrancesco Date: Mon, 17 Aug 2026 15:02:56 -0400 Subject: [PATCH 2/3] Governor deployment logs --- .../1/run-1786993090380.json | 156 ++++++++++++++++++ .../1/run-latest.json | 156 ++++++++++++++++++ 2 files changed, 312 insertions(+) create mode 100644 broadcast/DeployGitcoinGovernorWithGuardianMainnet.s.sol/1/run-1786993090380.json create mode 100644 broadcast/DeployGitcoinGovernorWithGuardianMainnet.s.sol/1/run-latest.json diff --git a/broadcast/DeployGitcoinGovernorWithGuardianMainnet.s.sol/1/run-1786993090380.json b/broadcast/DeployGitcoinGovernorWithGuardianMainnet.s.sol/1/run-1786993090380.json new file mode 100644 index 0000000..0ba8e2d --- /dev/null +++ b/broadcast/DeployGitcoinGovernorWithGuardianMainnet.s.sol/1/run-1786993090380.json @@ -0,0 +1,156 @@ +{ + "transactions": [ + { + "hash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionType": "CREATE", + "contractName": "GitcoinGovernorWithGuardian", + "contractAddress": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "function": null, + "arguments": [ + "Gitcoin Governor Charlie", + "1500000000000000000000000", + "7200", + "14400", + "40320", + "150000000000000000000000", + "0xDe30da39c46104798bB5aA3fe8B9e0e1F348163F", + "0x57a8865cfB1eCEf7253c27da6B4BC3dAEE5Be518", + "0x5743E35477363241300FcEdc2F5eB0195F300817" + ], + "transaction": { + "from": "0xba41c0652c89dda91041fb6ad58576784c9f28f6", + "to": null, + "gas": "0x64767a", + "value": "0x0", + "input": "0x610180604052348015610010575f5ffd5b506040516163f83803806163f883398101604081905261002f916109e3565b87868686858b888f806100566040805180820190915260018152603160f81b602082015290565b610060825f610178565b6101205261006f816001610178565b61014052815160208084019190912060e052815190820120610100524660a0526100fb60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c05260036101108282610b96565b50506001600160a01b031661016052610128816101aa565b5061013281610210565b5061013c83610279565b610145826102df565b61014e81610383565b505050610160816103c460201b60201c565b5061016a81610434565b505050505050505050610cfa565b5f6020835110156101935761018c8361049d565b90506101a4565b8161019e8482610b96565b5060ff90505b92915050565b6008546040805165ffffffffffff928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a16008805465ffffffffffff191665ffffffffffff92909216919091179055565b600a54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600c805465ffffffffffff191665ffffffffffff92909216919091179055565b8063ffffffff165f0361030c5760405163f1cfbf0560e01b81525f60048201526024015b60405180910390fd5b600c546040805163ffffffff66010000000000009093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600c805463ffffffff90921666010000000000000263ffffffff60301b19909216919091179055565b600b5460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600b55565b5f6103cd6104da565b90507f6784e9bcb845caaa98267d7b0918f97d3d17f7cb35a05b52010f7eb587a0acb061040165ffffffffffff83166104e8565b60408051918252602082018590520160405180910390a161042e8161042584610512565b600d9190610549565b50505050565b600e54604080516001600160a01b03928316815291831660208301527feabe7d6d9720bd3fde29f0fbd6af94debeea74c6d5508c31ee6b07631e06e69b910160405180910390a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f829050601f815111156104c7578260405163305a27a960e01b81526004016103039190610c54565b80516104d282610c89565b179392505050565b5f6104e3610563565b905090565b5f6105036104f58361056d565b600d9063ffffffff1661059d565b6001600160d01b031692915050565b5f6001600160d01b03821115610545576040516306dfcc6560e41b815260d0600482015260248101839052604401610303565b5090565b5f80610556858585610650565b915091505b935093915050565b5f6104e3436107ac565b5f63ffffffff821115610545576040516306dfcc6560e41b81526020600482015260248101839052604401610303565b81545f90818160058111156105f9575f6105b6846107de565b6105c09085610cc0565b5f8881526020902090915081015465ffffffffffff90811690871610156105e9578091506105f7565b6105f4816001610cd3565b92505b505b5f61060687878585610936565b905080156106435761062a8761061d600184610cc0565b5f91825260209091200190565b54660100000000000090046001600160d01b0316610645565b5f5b979650505050505050565b82545f908190801561074f575f61066c8761061d600185610cc0565b805490915065ffffffffffff80821691660100000000000090046001600160d01b03169088168211156106b257604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff16036106ee57825465ffffffffffff1666010000000000006001600160d01b03891602178355610741565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b945085935061055b92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316660100000000000002919093161792019190915590508161055b565b5f65ffffffffffff821115610545576040516306dfcc6560e41b81526030600482015260248101839052604401610303565b5f600182116107eb575090565b816001600160801b82106108045760809190911c9060401b5b68010000000000000000821061081f5760409190911c9060201b5b64010000000082106108365760209190911c9060101b5b62010000821061084b5760109190911c9060081b5b610100821061085f5760089190911c9060041b5b601082106108725760049190911c9060021b5b6004821061087e5760011b5b600302600190811c9081858161089657610896610ce6565b048201901c905060018185816108ae576108ae610ce6565b048201901c905060018185816108c6576108c6610ce6565b048201901c905060018185816108de576108de610ce6565b048201901c905060018185816108f6576108f6610ce6565b048201901c9050600181858161090e5761090e610ce6565b048201901c905061092d81858161092757610927610ce6565b04821190565b90039392505050565b5f5b81831015610984575f85815260209020838316600285851804019081015465ffffffffffff868116911611156109705780925061097e565b61097b816001610cd3565b93505b50610938565b509392505050565b634e487b7160e01b5f52604160045260245ffd5b805165ffffffffffff811681146109b5575f5ffd5b919050565b805163ffffffff811681146109b5575f5ffd5b80516001600160a01b03811681146109b5575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c0312156109fc575f5ffd5b89516001600160401b03811115610a11575f5ffd5b8a01601f81018c13610a21575f5ffd5b80516001600160401b03811115610a3a57610a3a61098c565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610a6857610a6861098c565b6040528181528282016020018e1015610a7f575f5ffd5b8160208401602083015e5f6020928201830152908c0151909a509850610aa9905060408b016109a0565b9650610ab760608b016109a0565b9550610ac560808b016109ba565b60a08b01519095509350610adb60c08b016109cd565b9250610ae960e08b016109cd565b9150610af86101008b016109cd565b90509295985092959850929598565b600181811c90821680610b1b57607f821691505b602082108103610b3957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610b915782821115610b9157805f5260205f20601f840160051c6020851015610b6a57505f5b90810190601f840160051c035f5b81811015610b8d575f83820155600101610b78565b5050505b505050565b81516001600160401b03811115610baf57610baf61098c565b610bc381610bbd8454610b07565b84610b3f565b6020601f821160018114610bf5575f8315610bde5750848201515b5f19600385901b1c1916600184901b178455610c4d565b5f84815260208120601f198516915b82811015610c245787850151825560209485019460019092019101610c04565b5084821015610c4157868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610b39575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156101a4576101a4610cac565b808201808211156101a4576101a4610cac565b634e487b7160e01b5f52601260045260245ffd5b60805160a05160c05160e0516101005161012051610140516101605161569c610d5c5f395f8181610bab01526123b601525f61229501525f61226901525f613d7301525f613d4b01525f613ca601525f613cd001525f613cfa015261569c5ff3fe608060405260043610610332575f3560e01c806384b0196e116101a7578063c1ba4e59116100e7578063e540d01d11610092578063f23a6e611161006d578063f23a6e6114610b5f578063f8ce560a14610b7e578063fc0c546a14610b9d578063fc47361614610bcf575f5ffd5b8063e540d01d14610b02578063eb9019d414610b21578063ece40cc114610b40575f5ffd5b8063d33219b4116100c2578063d33219b414610a91578063dd4e2ba514610abb578063deaaa7cc14610acf575f5ffd5b8063c1ba4e5914610a40578063c28bc2fa14610a5f578063c59057e414610a72575f5ffd5b8063a8f8a66811610152578063b58131b01161012d578063b58131b0146109da578063b9a61961146109ee578063bc197c8114610a02578063c01f9e3714610a21575f5ffd5b8063a8f8a66814610966578063a9a9529414610985578063ab58fb8e146109a4575f5ffd5b80639a802a6d116101825780639a802a6d14610909578063a660aca514610928578063a890c91014610947575f5ffd5b806384b0196e146108af5780638ff262e3146108d657806391ddadf4146108f5575f5ffd5b806343859632116102725780635b8d0e0d1161021d57806379051887116101f857806379051887146108115780637b3c71d3146108305780637d5e81e21461084f5780637ecebe001461086e575f5ffd5b80635b8d0e0d146107815780635f398a14146107a05780636136cadf146107bf575f5ffd5b8063544ffc9c1161024d578063544ffc9c146106ca57806354fd4d501461071d5780635678138814610762575f5ffd5b80634385963214610612578063452115d6146106665780634bf5d7e914610685575f5ffd5b80632656227d116102dd57806332b8113e116102b857806332b8113e1461057c578063330df7ff146105ab5780633932abb1146105ca5780633e4f49e6146105e6575f5ffd5b80632656227d146104eb5780632d63f693146104fe5780632fe3e26114610549575f5ffd5b8063143489d01161030d578063143489d014610416578063150b7a021461047c578063160cbed7146104cc575f5ffd5b806301ffc9a71461039357806302a251a3146103c757806306fdde03146103f5575f5ffd5b3661038f5730610340610bf9565b73ffffffffffffffffffffffffffffffffffffffff161461038d576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f5ffd5b34801561039e575f5ffd5b506103b26103ad36600461447a565b610c1e565b60405190151581526020015b60405180910390f35b3480156103d2575f5ffd5b50600c546601000000000000900463ffffffff165b6040519081526020016103be565b348015610400575f5ffd5b50610409610d4e565b6040516103be9190614505565b348015610421575f5ffd5b50610457610430366004614517565b5f9081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103be565b348015610487575f5ffd5b5061049b610496366004614669565b610dde565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016103be565b3480156104d7575f5ffd5b506103e76104e6366004614832565b610e5f565b6103e76104f9366004614832565b610f5d565b348015610509575f5ffd5b506103e7610518366004614517565b5f9081526004602052604090205474010000000000000000000000000000000000000000900465ffffffffffff1690565b348015610554575f5ffd5b506103e77f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b348015610587575f5ffd5b5060085465ffffffffffff165b60405165ffffffffffff90911681526020016103be565b3480156105b6575f5ffd5b5061038d6105c53660046148c8565b611145565b3480156105d5575f5ffd5b50600c5465ffffffffffff166103e7565b3480156105f1575f5ffd5b50610605610600366004614517565b611159565b6040516103be9190614953565b34801561061d575f5ffd5b506103b261062c366004614961565b5f91825260076020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260039092019052902054151590565b348015610671575f5ffd5b506103e7610680366004614832565b611163565b348015610690575f5ffd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c740000006020820152610409565b3480156106d5575f5ffd5b506107026106e4366004614517565b5f908152600760205260409020805460018201546002909201549092565b604080519384526020840192909252908201526060016103be565b348015610728575f5ffd5b5060408051808201909152600181527f31000000000000000000000000000000000000000000000000000000000000006020820152610409565b34801561076d575f5ffd5b506103e761077c3660046149a4565b6111ef565b34801561078c575f5ffd5b506103e761079b366004614a13565b611216565b3480156107ab575f5ffd5b506103e76107ba366004614ad2565b6112f9565b3480156107ca575f5ffd5b506103e76107d9366004614961565b5f82815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845260030190915290205492915050565b34801561081c575f5ffd5b5061038d61082b3660046148c8565b611341565b34801561083b575f5ffd5b506103e761084a366004614b55565b611352565b34801561085a575f5ffd5b506103e7610869366004614bab565b6113a2565b348015610879575f5ffd5b506103e7610888366004614c6b565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b3480156108ba575f5ffd5b506108c36114a4565b6040516103be9796959493929190614cc0565b3480156108e1575f5ffd5b506103e76108f0366004614d56565b611502565b348015610900575f5ffd5b50610594611580565b348015610914575f5ffd5b506103e7610923366004614da4565b611589565b348015610933575f5ffd5b5061038d610942366004614c6b565b61159f565b348015610952575f5ffd5b5061038d610961366004614c6b565b6115b0565b348015610971575f5ffd5b506103e7610980366004614832565b6115c1565b348015610990575f5ffd5b506103b261099f366004614517565b6115ce565b3480156109af575f5ffd5b506103e76109be366004614517565b5f9081526004602052604090206001015465ffffffffffff1690565b3480156109e5575f5ffd5b506103e76115d6565b3480156109f9575f5ffd5b5061038d6115e0565b348015610a0d575f5ffd5b5061049b610a1c366004614df9565b61165e565b348015610a2c575f5ffd5b506103e7610a3b366004614517565b6116e0565b348015610a4b575f5ffd5b5061038d610a5a366004614517565b6116ea565b61038d610a6d366004614e93565b6116fb565b348015610a7d575f5ffd5b506103e7610a8c366004614832565b611784565b348015610a9c575f5ffd5b50600a5473ffffffffffffffffffffffffffffffffffffffff16610457565b348015610ac6575f5ffd5b506104096117db565b348015610ada575f5ffd5b506103e77ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b348015610b0d575f5ffd5b5061038d610b1c366004614ed3565b6117fb565b348015610b2c575f5ffd5b506103e7610b3b366004614ef6565b61180c565b348015610b4b575f5ffd5b5061038d610b5a366004614517565b61182b565b348015610b6a575f5ffd5b5061049b610b79366004614f20565b61183c565b348015610b89575f5ffd5b506103e7610b98366004614517565b6118be565b348015610ba8575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610457565b348015610bda575f5ffd5b50600e5473ffffffffffffffffffffffffffffffffffffffff16610457565b5f610c19600a5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fcdbdfcee000000000000000000000000000000000000000000000000000000001480610cb057507fffffffff0000000000000000000000000000000000000000000000000000000082167f65455a8600000000000000000000000000000000000000000000000000000000145b80610cfc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b80610d4857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060038054610d5d90614f78565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8990614f78565b8015610dd45780601f10610dab57610100808354040283529160200191610dd4565b820191905f5260205f20905b815481529060010190602001808311610db757829003601f168201915b5050505050905090565b5f30610de8610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614610e35576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b5f5f610e6d868686866115c1565b9050610e8281610e7d6004611903565b611925565b505f610e91828888888861197b565b905065ffffffffffff811615610f21575f8281526004602090815260409182902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff85169081179091558251858152918201527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1610f53565b6040517f90884a4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5095945050505050565b5f5f610f6b868686866115c1565b9050610f8b81610f7b6005611903565b610f856004611903565b17611925565b505f81815260046020526040902080547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0100000000000000000000000000000000000000000000000000000000000017905530610fe9610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614611099575f5b8651811015611097573073ffffffffffffffffffffffffffffffffffffffff1687828151811061103857611038614fc9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361108f5761108f85828151811061107057611070614fc9565b602002602001015180519060200120600561198990919063ffffffff16565b600101611006565b505b6110a681878787876119aa565b306110af610bf9565b73ffffffffffffffffffffffffffffffffffffffff16141580156110fe57506005546fffffffffffffffffffffffffffffffff8082167001000000000000000000000000000000009092041614155b15611108575f6005555b6040518181527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906020015b60405180910390a195945050505050565b61114d6119be565b61115681611a6a565b50565b5f610d4882611ae9565b5f5f611171868686866115c1565b90503361117e8282611bda565b6111d8576040517f8fe5d8a90000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff821660248201526044015b60405180910390fd5b6111e487878787611be5565b979650505050505050565b5f8033905061120e84828560405180602001604052805f815250611bf2565b949350505050565b5f61125c88888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a9250899150611c139050565b6112aa576040517f94ab6c0700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016111cf565b6112ed88878988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a9250611cfa915050565b98975050505050505050565b5f803390506111e487828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a9250611cfa915050565b6113496119be565b61115681611e17565b5f8033905061139886828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611bf292505050565b9695505050505050565b5f336113ae8184611e96565b6113fc576040517fd9b3955700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016111cf565b5f6114056115d6565b90508015611497575f61143383600161141c611580565b6114269190615023565b65ffffffffffff1661180c565b905081811015611495576040517fc242ee1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064016111cf565b505b6111e48787878786611f7d565b5f6060805f5f5f60606114b5612262565b6114bd61228e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b5f61150f858585856122bb565b61155d576040517f94ab6c0700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016111cf565b61157785848660405180602001604052805f815250611bf2565b95945050505050565b5f610c1961235e565b5f611595848484612368565b90505b9392505050565b6115a76119be565b61115681612437565b6115b86119be565b611156816124d2565b5f61157785858585611784565b5f6001610d48565b5f610c19600b5490565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611646575f5ffd5b505af1158015611658573d5f5f3e3d5ffd5b50505050565b5f30611668610bf9565b73ffffffffffffffffffffffffffffffffffffffff16146116b5576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b5f610d488261256d565b6116f26119be565b61115681612595565b6117036119be565b5f5f8573ffffffffffffffffffffffffffffffffffffffff1685858560405161172d929190615041565b5f6040518083038185875af1925050503d805f8114611767576040519150601f19603f3d011682016040523d82523d5f602084013e61176c565b606091505b509150915061177b82826125ff565b50505050505050565b5f8484848460405160200161179c949392919061510e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012095945050505050565b60606040518060600160405280603d815260200161562a603d9139905090565b6118036119be565b61115681612655565b5f611598838361182660408051602081019091525f815290565b612368565b6118336119be565b61115681612725565b5f30611846610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614611893576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b5f6118e16118cb83612766565b63ffffffff16600d6127b390919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff1692915050565b5f816007811115611916576119166148ed565b600160ff919091161b92915050565b5f5f61193084611159565b90505f8361193d83611903565b1603611598578381846040517f31b75e4d0000000000000000000000000000000000000000000000000000000081526004016111cf93929190615158565b5f6113988686868686612878565b5f6119948383612b40565b9050806119a5576119a56041612bd1565b505050565b6119b78585858585612be2565b5050505050565b336119c7610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614611a16576040517f47096e470000000000000000000000000000000000000000000000000000000081523360048201526024016111cf565b30611a1f610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614611a68575f8036604051611a4b929190615041565b604051809103902090505b80611a616005612d61565b03611a5657505b565b6008546040805165ffffffffffff928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a1600880547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff92909216919091179055565b5f5f611af483612d80565b90506005816007811115611b0a57611b0a6148ed565b148015611bc75750600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba0919061517a565b5f8481526004602052604090206001015465ffffffffffff16611bc39190615191565b4210155b611bd15780611598565b60069392505050565b5f6115988383612f25565b5f61157785858585612fd6565b5f61157785858585611c0e60408051602081019091525f815290565b611cfa565b5f6111e485611cf47f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118a8a8a611c728c73ffffffffffffffffffffffffffffffffffffffff165f90815260026020526040902080546001810190915590565b8b516020808e01919091208c518d830120604051611cd998979695949301968752602087019590955260ff93909316604086015273ffffffffffffffffffffffffffffffffffffffff919091166060850152608084015260a083015260c082015260e00190565b604051602081830303815290604052805190602001206130e7565b8461312e565b5f611d0986610e7d6001611903565b505f86815260046020526040812054611d4490879074010000000000000000000000000000000000000000900465ffffffffffff1685612368565b90505f611d5488888885886131c5565b905083515f03611db7578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051611daa94939291906151a4565b60405180910390a2611e0e565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051611e059594939291906151cb565b60405180910390a25b6111e48861354d565b600c546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff92909216919091179055565b80515f906034811015611ead576001915050610d48565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec81840101517fffffffffffffffffffff0000000000000000000000000000000000000000000081167f2370726f706f7365723d0000000000000000000000000000000000000000000014611f2757600192505050610d48565b5f5f611f3786602a860386613556565b915091508115806111e457508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614979650505050505050565b5f611f9186868686805190602001206115c1565b905084518651141580611fa657508351865114155b80611fb057508551155b15611ffe578551845186516040517f447b05d00000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016111cf565b5f8181526004602052604090205474010000000000000000000000000000000000000000900465ffffffffffff1615612071578061203b82611159565b6040517f31b75e4d0000000000000000000000000000000000000000000000000000000081526111cf9291905f90600401615158565b5f612083600c5465ffffffffffff1690565b61208b611580565b65ffffffffffff1661209d9190615191565b90505f6120ba600c5463ffffffff66010000000000009091041690565b5f84815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617815590915061211183613636565b815465ffffffffffff9190911674010000000000000000000000000000000000000000027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff90911617815561216582612766565b815463ffffffff919091167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff90911617815588517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e090859087908c908c9067ffffffffffffffff8111156121f8576121f861454f565b60405190808252806020026020018201604052801561222b57816020015b60608152602001906001900390816122165790505b508c896122388a82615191565b8e60405161224e99989796959493929190615204565b60405180910390a150505095945050505050565b6060610c197f00000000000000000000000000000000000000000000000000000000000000005f613681565b6060610c197f00000000000000000000000000000000000000000000000000000000000000006001613681565b5f61157783611cf47ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d788888861231a8a73ffffffffffffffffffffffffffffffffffffffff165f90815260026020526040902080546001810190915590565b60408051602081019690965285019390935260ff909116606084015273ffffffffffffffffffffffffffffffffffffffff16608083015260a082015260c001611cd9565b5f610c1943613636565b6040517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063782d6fe190604401602060405180830381865afa1580156123fd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124219190615309565b6bffffffffffffffffffffffff16949350505050565b600e546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527feabe7d6d9720bd3fde29f0fbd6af94debeea74c6d5508c31ee6b07631e06e69b910160405180910390a1600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f610d4861257a8361372a565b5f8481526009602052604090205465ffffffffffff16613794565b5f61259e611580565b90507f6784e9bcb845caaa98267d7b0918f97d3d17f7cb35a05b52010f7eb587a0acb06125d28265ffffffffffff166118be565b60408051918252602082018590520160405180910390a1611658816125f6846137a3565b600d9190613802565b6060821561260e575080610d48565b8151156126235761261e8261381b565b610d48565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8063ffffffff165f03612696576040517ff1cfbf050000000000000000000000000000000000000000000000000000000081525f60048201526024016111cf565b600c546040805163ffffffff66010000000000009093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600c805463ffffffff9092166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff909216919091179055565b600b5460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600b55565b5f63ffffffff8211156127af576040517f6dfcc65000000000000000000000000000000000000000000000000000000000815260206004820152602481018390526044016111cf565b5090565b81545f908181600581111561280f575f6127cc84613823565b6127d69085615334565b5f8881526020902090915081015465ffffffffffff90811690871610156127ff5780915061280d565b61280a816001615191565b92505b505b5f61281c87878585613988565b9050801561286c5761284087612833600184615334565b5f91825260209091200190565b546601000000000000900479ffffffffffffffffffffffffffffffffffffffffffffffffffff166111e4565b505f9695505050505050565b5f5f61291a600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290b919061517a565b6129159042615191565b613636565b90505f5b8651811015612b3557600a54875173ffffffffffffffffffffffffffffffffffffffff9091169063f2b065379089908490811061295d5761295d614fc9565b602002602001015188848151811061297757612977614fc9565b602002602001015188858151811061299157612991614fc9565b6020026020010151866040516020016129ad9493929190615347565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016129e191815260200190565b602060405180830381865afa1580156129fc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a2091906153a1565b15612a5a576040517ff20e7d37000000000000000000000000000000000000000000000000000000008152600481018990526024016111cf565b600a54875173ffffffffffffffffffffffffffffffffffffffff90911690633a66f90190899084908110612a9057612a90614fc9565b6020026020010151888481518110612aaa57612aaa614fc9565b6020026020010151888581518110612ac457612ac4614fc9565b6020026020010151866040518563ffffffff1660e01b8152600401612aec9493929190615347565b6020604051808303815f875af1158015612b08573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2c919061517a565b5060010161291e565b509695505050505050565b81545f906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169181166001830190911603612b83575f915050610d48565b6fffffffffffffffffffffffffffffffff8181165f90815260018681016020526040909120949094558454918401811670010000000000000000000000000000000002911617909255919050565b634e487b715f52806020526024601cfd5b5f8581526004602052604081206001015465ffffffffffff1690819003612c38576040517fd5ddb825000000000000000000000000000000000000000000000000000000008152600481018790526024016111cf565b600a54612c5b9073ffffffffffffffffffffffffffffffffffffffff16346139de565b5f5b855181101561177b57600a54865173ffffffffffffffffffffffffffffffffffffffff90911690630825f38f90889084908110612c9c57612c9c614fc9565b6020026020010151878481518110612cb657612cb6614fc9565b6020026020010151878581518110612cd057612cd0614fc9565b6020026020010151866040518563ffffffff1660e01b8152600401612cf894939291906153c0565b5f604051808303815f875af1158015612d13573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612d589190810190615412565b50600101612c5d565b5f5f5f612d6d84613a55565b9150915081611598576115986031612bd1565b5f818152600460205260408120805460ff7e0100000000000000000000000000000000000000000000000000000000000082048116917f01000000000000000000000000000000000000000000000000000000000000009004168115612deb57506007949350505050565b8015612dfc57506002949350505050565b5f8581526004602052604081205474010000000000000000000000000000000000000000900465ffffffffffff169050805f03612e68576040517f6ad06075000000000000000000000000000000000000000000000000000000008152600481018790526024016111cf565b5f612e71611580565b65ffffffffffff169050808210612e8e57505f9695505050505050565b5f612e98886116e0565b9050818110612eaf57506001979650505050505050565b612eb888613af7565b1580612ed757505f888152600760205260409020805460019091015411155b15612eea57506003979650505050505050565b5f8881526004602052604090206001015465ffffffffffff165f03612f1757506004979650505050505050565b506005979650505050505050565b5f5f612f46600e5473ffffffffffffffffffffffffffffffffffffffff1690565b90508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612fc6575073ffffffffffffffffffffffffffffffffffffffff8116158015612fc657505f8481526004602052604090205473ffffffffffffffffffffffffffffffffffffffff8481169116145b8061120e575061120e8484613b58565b5f5f612fe486868686613baa565b5f8181526004602052604090206001015490915065ffffffffffff168015610f53575f5b87518110156130db57600a54885173ffffffffffffffffffffffffffffffffffffffff9091169063591fcdfe908a908490811061304757613047614fc9565b602002602001015189848151811061306157613061614fc9565b602002602001015189858151811061307b5761307b614fc9565b6020026020010151866040518563ffffffff1660e01b81526004016130a394939291906153c0565b5f604051808303815f87803b1580156130ba575f5ffd5b505af11580156130cc573d5f5f3e3d5ffd5b50505050806001019050613008565b50509050949350505050565b5f610d486130f3613c8d565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f8373ffffffffffffffffffffffffffffffffffffffff163b5f036131b3575f5f6131598585613dc3565b5090925090505f816003811115613172576131726148ed565b1480156131aa57508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b92505050611598565b6131be848484613e0c565b9050611598565b5f85815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684526003019091528120548303838111150280820361324f576040517f71c6af4900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016111cf565b5f80808060ff891661329e57865115613294576040517f867db77100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5083925082613499565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8a160161330b57865115613301576040517f867db77100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5083915081613499565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60ff8a16016133785786511561336e576040517f867db77100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5083905080613499565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff8a16016134675786516030146133dd576040517f867db77100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602087015160801c9350603087015160801c9250604087015160801c91508183850101905084811115613462576040517f02a71c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b16600482015260248101829052604481018690526064016111cf565b613499565b6040517f06b337c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8b815260076020526040902084156134c45784815f015f8282546134be9190615191565b90915550505b83156134e35783816001015f8282546134dd9190615191565b90915550505b82156135025782816002015f8282546134fc9190615191565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8b165f90815260038201602052604081208054849290613538908490615191565b90915550919c9b505050505050505050505050565b61115681613e76565b5f5f845183118061356657508284115b1561357557505f90508061362e565b5f613581856001615191565b841180156135dc57507f30780000000000000000000000000000000000000000000000000000000000006135b88787016020015190565b7fffff00000000000000000000000000000000000000000000000000000000000016145b90505f6135ec8215156002615487565b6135f7906028615191565b9050806136048787615334565b03613625575f5f613616898989613f63565b909650945061362e9350505050565b5f5f9350935050505b935093915050565b5f65ffffffffffff8211156127af576040517f6dfcc65000000000000000000000000000000000000000000000000000000000815260306004820152602481018390526044016111cf565b606060ff831461369b5761369483614057565b9050610d48565b8180546136a790614f78565b80601f01602080910402602001604051908101604052809291908181526020018280546136d390614f78565b801561371e5780601f106136f55761010080835404028352916020019161371e565b820191905f5260205f20905b81548152906001019060200180831161370157829003601f168201915b50505050509050610d48565b5f81815260046020526040812054613786907a010000000000000000000000000000000000000000000000000000810463ffffffff169074010000000000000000000000000000000000000000900465ffffffffffff1661549e565b65ffffffffffff1692915050565b5f828218828411028218611598565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff8211156127af576040517f6dfcc65000000000000000000000000000000000000000000000000000000000815260d06004820152602481018390526044016111cf565b5f8061380f858585614094565b91509150935093915050565b805160208201fd5b5f60018211613830575090565b81600170010000000000000000000000000000000082106138565760809190911c9060401b5b6801000000000000000082106138715760409190911c9060201b5b64010000000082106138885760209190911c9060101b5b62010000821061389d5760109190911c9060081b5b61010082106138b15760089190911c9060041b5b601082106138c45760049190911c9060021b5b600482106138d05760011b5b600302600190811c908185816138e8576138e86154bc565b048201901c90506001818581613900576139006154bc565b048201901c90506001818581613918576139186154bc565b048201901c90506001818581613930576139306154bc565b048201901c90506001818581613948576139486154bc565b048201901c90506001818581613960576139606154bc565b048201901c905061397f818581613979576139796154bc565b04821190565b90039392505050565b5f5b818310156139d6575f85815260209020838316600285851804019081015465ffffffffffff868116911611156139c2578092506139d0565b6139cd816001615191565b93505b5061398a565b509392505050565b80471015613a21576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016111cf565b613a3a828260405180602001604052805f815250614255565b15613a43575050565b3d1561262357613a5161426a565b5050565b80545f9081906fffffffffffffffffffffffffffffffff808216917001000000000000000000000000000000009004168103613a9657505f93849350915050565b6fffffffffffffffffffffffffffffffff8181165f908152600186810160205260408220805492905586547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016938101909216929092179094559293915050565b5f81815260076020526040812060028101546001820154613b189190615191565b5f84815260046020526040902054613b4f9074010000000000000000000000000000000000000000900465ffffffffffff166118be565b11159392505050565b5f80613b6384611159565b6007811115613b7457613b746148ed565b1480156115985750505f918252600460205260409091205473ffffffffffffffffffffffffffffffffffffffff91821691161490565b5f5f613bb8868686866115c1565b9050613c0681613bc86007611903565b613bd26006611903565b613bdc6002611903565b6001613be96007826154e9565b613bf490600261561b565b613bfe9190615334565b181818611925565b505f818152600460205260409081902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0100000000000000000000000000000000000000000000000000000000000000179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906111349083815260200190565b5f3073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015613cf257507f000000000000000000000000000000000000000000000000000000000000000046145b15613d1c57507f000000000000000000000000000000000000000000000000000000000000000090565b610c19604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f8351604103613dfa576020840151604085015160608601515f1a613dec88828585614275565b955095509550505050613e05565b505081515f91506002905b9250925092565b8051604080517f1626ba7e000000000000000000000000000000000000000000000000000000008082526004820186905260248201929092525f92906020820185604483015e60205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f8181526009602052604090205465ffffffffffff16158015613e9d5750613e9d81613af7565b15611156575f613eb460085465ffffffffffff1690565b613ebc611580565b613ec6919061549e565b9050613ed1826116e0565b8165ffffffffffff161115613f1e5760405165ffffffffffff8216815282907f541f725fb9f7c98a30cc9c0ff32fbb14358cd7159c847a3aa20a2bdc442ba5119060200160405180910390a25b5f9182526009602052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff92909216919091179055565b5f808481613f72866001615191565b85118015613fcd57507f3078000000000000000000000000000000000000000000000000000000000000613fa98388016020015190565b7fffff00000000000000000000000000000000000000000000000000000000000016145b90505f613fdd8215156002615487565b90505f80613feb838a615191565b90505b87811015614046575f61400c6140078784016020015190565b614368565b9050600f8160ff16111561402b575f5f9750975050505050505061362e565b614036601084615487565b60ff909116019150600101613fee565b506001999098509650505050505050565b60605f6140638361443a565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b82545f90819080156141e5575f6140b087612833600185615334565b805490915065ffffffffffff808216916601000000000000900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16908816821115614122576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff160361417157825465ffffffffffff16660100000000000079ffffffffffffffffffffffffffffffffffffffffffffffffffff8916021783556141d7565b6040805180820190915265ffffffffffff808a16825279ffffffffffffffffffffffffffffffffffffffffffffffffffff808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b945085935061362e92505050565b50506040805180820190915265ffffffffffff808516825279ffffffffffffffffffffffffffffffffffffffffffffffffffff80851660208085019182528854600181018a555f8a815291822095519251909316660100000000000002919093161792019190915590508161362e565b5f5f5f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156142ae57505f9150600390508261435e565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156142ff573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661435557505f92506001915082905061435e565b92505f91508190505b9450945094915050565b5f60f882901c602f811180156143815750603a8160ff16105b156143ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd001610d48565b60608160ff161180156143c3575060678160ff16105b156143ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa901610d48565b60408160ff16118015614405575060478160ff16105b15614431577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc901610d48565b5060ff92915050565b5f60ff8216601f811115610d48576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6020828403121561448a575f5ffd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611598575f5ffd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61159860208301846144b9565b5f60208284031215614527575f5ffd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611156575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156145c3576145c361454f565b604052919050565b5f67ffffffffffffffff8211156145e4576145e461454f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f61462261461d846145cb565b61457c565b9050828152838383011115614635575f5ffd5b828260208301375f602084830101529392505050565b5f82601f83011261465a575f5ffd5b61159883833560208501614610565b5f5f5f5f6080858703121561467c575f5ffd5b84356146878161452e565b935060208501356146978161452e565b925060408501359150606085013567ffffffffffffffff8111156146b9575f5ffd5b6146c58782880161464b565b91505092959194509250565b5f67ffffffffffffffff8211156146ea576146ea61454f565b5060051b60200190565b5f82601f830112614703575f5ffd5b813561471161461d826146d1565b8082825260208201915060208360051b860101925085831115614732575f5ffd5b602085015b83811015610f5357803561474a8161452e565b835260209283019201614737565b5f82601f830112614767575f5ffd5b813561477561461d826146d1565b8082825260208201915060208360051b860101925085831115614796575f5ffd5b602085015b83811015610f5357803583526020928301920161479b565b5f82601f8301126147c2575f5ffd5b81356147d061461d826146d1565b8082825260208201915060208360051b8601019250858311156147f1575f5ffd5b602085015b83811015610f5357803567ffffffffffffffff811115614814575f5ffd5b614823886020838a010161464b565b845250602092830192016147f6565b5f5f5f5f60808587031215614845575f5ffd5b843567ffffffffffffffff81111561485b575f5ffd5b614867878288016146f4565b945050602085013567ffffffffffffffff811115614883575f5ffd5b61488f87828801614758565b935050604085013567ffffffffffffffff8111156148ab575f5ffd5b6148b7878288016147b3565b949793965093946060013593505050565b5f602082840312156148d8575f5ffd5b813565ffffffffffff81168114611598575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6008811061494f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610d48828461491a565b5f5f60408385031215614972575f5ffd5b8235915060208301356149848161452e565b809150509250929050565b803560ff8116811461499f575f5ffd5b919050565b5f5f604083850312156149b5575f5ffd5b823591506149c56020840161498f565b90509250929050565b5f5f83601f8401126149de575f5ffd5b50813567ffffffffffffffff8111156149f5575f5ffd5b602083019150836020828501011115614a0c575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a031215614a29575f5ffd5b87359650614a396020890161498f565b95506040880135614a498161452e565b9450606088013567ffffffffffffffff811115614a64575f5ffd5b614a708a828b016149ce565b909550935050608088013567ffffffffffffffff811115614a8f575f5ffd5b614a9b8a828b0161464b565b92505060a088013567ffffffffffffffff811115614ab7575f5ffd5b614ac38a828b0161464b565b91505092959891949750929550565b5f5f5f5f5f60808688031215614ae6575f5ffd5b85359450614af66020870161498f565b9350604086013567ffffffffffffffff811115614b11575f5ffd5b614b1d888289016149ce565b909450925050606086013567ffffffffffffffff811115614b3c575f5ffd5b614b488882890161464b565b9150509295509295909350565b5f5f5f5f60608587031215614b68575f5ffd5b84359350614b786020860161498f565b9250604085013567ffffffffffffffff811115614b93575f5ffd5b614b9f878288016149ce565b95989497509550505050565b5f5f5f5f60808587031215614bbe575f5ffd5b843567ffffffffffffffff811115614bd4575f5ffd5b614be0878288016146f4565b945050602085013567ffffffffffffffff811115614bfc575f5ffd5b614c0887828801614758565b935050604085013567ffffffffffffffff811115614c24575f5ffd5b614c30878288016147b3565b925050606085013567ffffffffffffffff811115614c4c575f5ffd5b8501601f81018713614c5c575f5ffd5b6146c587823560208401614610565b5f60208284031215614c7b575f5ffd5b81356115988161452e565b5f8151808452602084019350602083015f5b82811015614cb6578151865260209586019590910190600101614c98565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f614cfa60e08301896144b9565b8281036040840152614d0c81896144b9565b905086606084015273ffffffffffffffffffffffffffffffffffffffff861660808401528460a084015282810360c0840152614d488185614c86565b9a9950505050505050505050565b5f5f5f5f60808587031215614d69575f5ffd5b84359350614d796020860161498f565b92506040850135614d898161452e565b9150606085013567ffffffffffffffff8111156146b9575f5ffd5b5f5f5f60608486031215614db6575f5ffd5b8335614dc18161452e565b925060208401359150604084013567ffffffffffffffff811115614de3575f5ffd5b614def8682870161464b565b9150509250925092565b5f5f5f5f5f60a08688031215614e0d575f5ffd5b8535614e188161452e565b94506020860135614e288161452e565b9350604086013567ffffffffffffffff811115614e43575f5ffd5b614e4f88828901614758565b935050606086013567ffffffffffffffff811115614e6b575f5ffd5b614e7788828901614758565b925050608086013567ffffffffffffffff811115614b3c575f5ffd5b5f5f5f5f60608587031215614ea6575f5ffd5b8435614eb18161452e565b935060208501359250604085013567ffffffffffffffff811115614b93575f5ffd5b5f60208284031215614ee3575f5ffd5b813563ffffffff81168114611598575f5ffd5b5f5f60408385031215614f07575f5ffd5b8235614f128161452e565b946020939093013593505050565b5f5f5f5f5f60a08688031215614f34575f5ffd5b8535614f3f8161452e565b94506020860135614f4f8161452e565b93506040860135925060608601359150608086013567ffffffffffffffff811115614b3c575f5ffd5b600181811c90821680614f8c57607f821691505b602082108103614fc3577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b65ffffffffffff8281168282160390811115610d4857610d48614ff6565b818382375f9101908152919050565b5f8151808452602084019350602083015f5b82811015614cb657815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101615062565b5f82825180855260208501945060208160051b830101602085015f5b83811015615102577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030188526150ec8383516144b9565b60209889019890935091909101906001016150b2565b50909695505050505050565b608081525f6151206080830187615050565b82810360208401526151328187614c86565b905082810360408401526151468186615096565b91505082606083015295945050505050565b8381526060810161516c602083018561491a565b826040830152949350505050565b5f6020828403121561518a575f5ffd5b5051919050565b80820180821115610d4857610d48614ff6565b84815260ff84166020820152826040820152608060608201525f61139860808301846144b9565b85815260ff8516602082015283604082015260a060608201525f6151f260a08301856144b9565b82810360808401526112ed81856144b9565b89815273ffffffffffffffffffffffffffffffffffffffff8916602082015261012060408201525f61523a61012083018a615050565b828103606084015261524c818a614c86565b9050828103608084015280885180835260208301915060208160051b84010160208b015f5b838110156152c1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526152ab8383516144b9565b6020958601959093509190910190600101615271565b505085810360a08701526152d5818b615096565b93505050508560c08401528460e08401528281036101008401526152f981856144b9565b9c9b505050505050505050505050565b5f60208284031215615319575f5ffd5b81516bffffffffffffffffffffffff81168114611598575f5ffd5b81810381811115610d4857610d48614ff6565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260a060408201525f60a082015260c060608201525f61538860c08301856144b9565b905065ffffffffffff8316608083015295945050505050565b5f602082840312156153b1575f5ffd5b81518015158114611598575f5ffd5b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260a060408201525f60a082015260c060608201525f61540160c08301856144b9565b905082608083015295945050505050565b5f60208284031215615422575f5ffd5b815167ffffffffffffffff811115615438575f5ffd5b8201601f81018413615448575f5ffd5b805161545661461d826145cb565b81815285602083850101111561546a575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b8082028115828204841417610d4857610d48614ff6565b65ffffffffffff8181168382160190811115610d4857610d48614ff6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b60ff8181168382160190811115610d4857610d48614ff6565b6001815b600184111561362e5780850481111561552157615521614ff6565b600184161561552f57908102905b60019390931c928002615506565b5f8261554b57506001610d48565b8161555757505f610d48565b816001811461556d576002811461557757615593565b6001915050610d48565b60ff84111561558857615588614ff6565b50506001821b610d48565b5060208310610133831016604e8410600b84101617156155b6575081810a610d48565b6155e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615502565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561561357615613614ff6565b029392505050565b5f61159860ff84168361553d56fe737570706f72743d627261766f2c6672616374696f6e616c2671756f72756d3d666f722c6162737461696e26706172616d733d6672616374696f6e616ca26469706673582212206932de27756d862fa4bbe5852c6a414688e2aaeb223d050011b96ec4361054b664736f6c634300082300330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000013da329b63364718000000000000000000000000000000000000000000000000000000000000000001c2000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000009d80000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000de30da39c46104798bb5aa3fe8b9e0e1f348163f00000000000000000000000057a8865cfb1ecef7253c27da6b4bc3daee5be5180000000000000000000000005743e35477363241300fcedc2f5eb0195f3008170000000000000000000000000000000000000000000000000000000000000018476974636f696e20476f7665726e6f7220436861726c69650000000000000000", + "nonce": "0x0", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "type": "0x2", + "status": "0x1", + "cumulativeGasUsed": "0xe9c232", + "logs": [ + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0x7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c20", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x71", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057a8865cfb1ecef7253c27da6b4bc3daee5be518", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x72", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003840", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x73", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d80", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x74", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fc3842bd1f071c00000", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x75", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0x6784e9bcb845caaa98267d7b0918f97d3d17f7cb35a05b52010f7eb587a0acb0" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013da329b6336471800000", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x76", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0xeabe7d6d9720bd3fde29f0fbd6af94debeea74c6d5508c31ee6b07631e06e69b" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005743e35477363241300fcedc2f5eb0195f300817", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x77", + "removed": false + } + ], + "logsBloom": "0x0000000000000000000000000000000000000000000000000000000000000a000000000020000000000000000010000000000020000000000000000000000100000000000000000000000000000000000000000000000000000010000100000000000000000000080002000000000000000000000000000000000000000000001000002000000000000002000000000000000000000000000000000000000202200000000000000000000000000000000000000000000000000000002000000000000000000000000000020000000000200000101000000000000000800000000000000800000000000000000000000000000000000000000000000000002000", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "gasUsed": "0x4d4772", + "effectiveGasPrice": "0x5f88104", + "from": "0xba41c0652c89dda91041fb6ad58576784c9f28f6", + "to": null, + "contractAddress": "0xef41cbd211076e8b1901e214bf751d404cf06638" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1786993090380, + "chain": 1, + "commit": "1acd0b0" +} \ No newline at end of file diff --git a/broadcast/DeployGitcoinGovernorWithGuardianMainnet.s.sol/1/run-latest.json b/broadcast/DeployGitcoinGovernorWithGuardianMainnet.s.sol/1/run-latest.json new file mode 100644 index 0000000..0ba8e2d --- /dev/null +++ b/broadcast/DeployGitcoinGovernorWithGuardianMainnet.s.sol/1/run-latest.json @@ -0,0 +1,156 @@ +{ + "transactions": [ + { + "hash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionType": "CREATE", + "contractName": "GitcoinGovernorWithGuardian", + "contractAddress": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "function": null, + "arguments": [ + "Gitcoin Governor Charlie", + "1500000000000000000000000", + "7200", + "14400", + "40320", + "150000000000000000000000", + "0xDe30da39c46104798bB5aA3fe8B9e0e1F348163F", + "0x57a8865cfB1eCEf7253c27da6B4BC3dAEE5Be518", + "0x5743E35477363241300FcEdc2F5eB0195F300817" + ], + "transaction": { + "from": "0xba41c0652c89dda91041fb6ad58576784c9f28f6", + "to": null, + "gas": "0x64767a", + "value": "0x0", + "input": "0x610180604052348015610010575f5ffd5b506040516163f83803806163f883398101604081905261002f916109e3565b87868686858b888f806100566040805180820190915260018152603160f81b602082015290565b610060825f610178565b6101205261006f816001610178565b61014052815160208084019190912060e052815190820120610100524660a0526100fb60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c05260036101108282610b96565b50506001600160a01b031661016052610128816101aa565b5061013281610210565b5061013c83610279565b610145826102df565b61014e81610383565b505050610160816103c460201b60201c565b5061016a81610434565b505050505050505050610cfa565b5f6020835110156101935761018c8361049d565b90506101a4565b8161019e8482610b96565b5060ff90505b92915050565b6008546040805165ffffffffffff928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a16008805465ffffffffffff191665ffffffffffff92909216919091179055565b600a54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600c805465ffffffffffff191665ffffffffffff92909216919091179055565b8063ffffffff165f0361030c5760405163f1cfbf0560e01b81525f60048201526024015b60405180910390fd5b600c546040805163ffffffff66010000000000009093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600c805463ffffffff90921666010000000000000263ffffffff60301b19909216919091179055565b600b5460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600b55565b5f6103cd6104da565b90507f6784e9bcb845caaa98267d7b0918f97d3d17f7cb35a05b52010f7eb587a0acb061040165ffffffffffff83166104e8565b60408051918252602082018590520160405180910390a161042e8161042584610512565b600d9190610549565b50505050565b600e54604080516001600160a01b03928316815291831660208301527feabe7d6d9720bd3fde29f0fbd6af94debeea74c6d5508c31ee6b07631e06e69b910160405180910390a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f829050601f815111156104c7578260405163305a27a960e01b81526004016103039190610c54565b80516104d282610c89565b179392505050565b5f6104e3610563565b905090565b5f6105036104f58361056d565b600d9063ffffffff1661059d565b6001600160d01b031692915050565b5f6001600160d01b03821115610545576040516306dfcc6560e41b815260d0600482015260248101839052604401610303565b5090565b5f80610556858585610650565b915091505b935093915050565b5f6104e3436107ac565b5f63ffffffff821115610545576040516306dfcc6560e41b81526020600482015260248101839052604401610303565b81545f90818160058111156105f9575f6105b6846107de565b6105c09085610cc0565b5f8881526020902090915081015465ffffffffffff90811690871610156105e9578091506105f7565b6105f4816001610cd3565b92505b505b5f61060687878585610936565b905080156106435761062a8761061d600184610cc0565b5f91825260209091200190565b54660100000000000090046001600160d01b0316610645565b5f5b979650505050505050565b82545f908190801561074f575f61066c8761061d600185610cc0565b805490915065ffffffffffff80821691660100000000000090046001600160d01b03169088168211156106b257604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff16036106ee57825465ffffffffffff1666010000000000006001600160d01b03891602178355610741565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b945085935061055b92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316660100000000000002919093161792019190915590508161055b565b5f65ffffffffffff821115610545576040516306dfcc6560e41b81526030600482015260248101839052604401610303565b5f600182116107eb575090565b816001600160801b82106108045760809190911c9060401b5b68010000000000000000821061081f5760409190911c9060201b5b64010000000082106108365760209190911c9060101b5b62010000821061084b5760109190911c9060081b5b610100821061085f5760089190911c9060041b5b601082106108725760049190911c9060021b5b6004821061087e5760011b5b600302600190811c9081858161089657610896610ce6565b048201901c905060018185816108ae576108ae610ce6565b048201901c905060018185816108c6576108c6610ce6565b048201901c905060018185816108de576108de610ce6565b048201901c905060018185816108f6576108f6610ce6565b048201901c9050600181858161090e5761090e610ce6565b048201901c905061092d81858161092757610927610ce6565b04821190565b90039392505050565b5f5b81831015610984575f85815260209020838316600285851804019081015465ffffffffffff868116911611156109705780925061097e565b61097b816001610cd3565b93505b50610938565b509392505050565b634e487b7160e01b5f52604160045260245ffd5b805165ffffffffffff811681146109b5575f5ffd5b919050565b805163ffffffff811681146109b5575f5ffd5b80516001600160a01b03811681146109b5575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c0312156109fc575f5ffd5b89516001600160401b03811115610a11575f5ffd5b8a01601f81018c13610a21575f5ffd5b80516001600160401b03811115610a3a57610a3a61098c565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610a6857610a6861098c565b6040528181528282016020018e1015610a7f575f5ffd5b8160208401602083015e5f6020928201830152908c0151909a509850610aa9905060408b016109a0565b9650610ab760608b016109a0565b9550610ac560808b016109ba565b60a08b01519095509350610adb60c08b016109cd565b9250610ae960e08b016109cd565b9150610af86101008b016109cd565b90509295985092959850929598565b600181811c90821680610b1b57607f821691505b602082108103610b3957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610b915782821115610b9157805f5260205f20601f840160051c6020851015610b6a57505f5b90810190601f840160051c035f5b81811015610b8d575f83820155600101610b78565b5050505b505050565b81516001600160401b03811115610baf57610baf61098c565b610bc381610bbd8454610b07565b84610b3f565b6020601f821160018114610bf5575f8315610bde5750848201515b5f19600385901b1c1916600184901b178455610c4d565b5f84815260208120601f198516915b82811015610c245787850151825560209485019460019092019101610c04565b5084821015610c4157868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610b39575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156101a4576101a4610cac565b808201808211156101a4576101a4610cac565b634e487b7160e01b5f52601260045260245ffd5b60805160a05160c05160e0516101005161012051610140516101605161569c610d5c5f395f8181610bab01526123b601525f61229501525f61226901525f613d7301525f613d4b01525f613ca601525f613cd001525f613cfa015261569c5ff3fe608060405260043610610332575f3560e01c806384b0196e116101a7578063c1ba4e59116100e7578063e540d01d11610092578063f23a6e611161006d578063f23a6e6114610b5f578063f8ce560a14610b7e578063fc0c546a14610b9d578063fc47361614610bcf575f5ffd5b8063e540d01d14610b02578063eb9019d414610b21578063ece40cc114610b40575f5ffd5b8063d33219b4116100c2578063d33219b414610a91578063dd4e2ba514610abb578063deaaa7cc14610acf575f5ffd5b8063c1ba4e5914610a40578063c28bc2fa14610a5f578063c59057e414610a72575f5ffd5b8063a8f8a66811610152578063b58131b01161012d578063b58131b0146109da578063b9a61961146109ee578063bc197c8114610a02578063c01f9e3714610a21575f5ffd5b8063a8f8a66814610966578063a9a9529414610985578063ab58fb8e146109a4575f5ffd5b80639a802a6d116101825780639a802a6d14610909578063a660aca514610928578063a890c91014610947575f5ffd5b806384b0196e146108af5780638ff262e3146108d657806391ddadf4146108f5575f5ffd5b806343859632116102725780635b8d0e0d1161021d57806379051887116101f857806379051887146108115780637b3c71d3146108305780637d5e81e21461084f5780637ecebe001461086e575f5ffd5b80635b8d0e0d146107815780635f398a14146107a05780636136cadf146107bf575f5ffd5b8063544ffc9c1161024d578063544ffc9c146106ca57806354fd4d501461071d5780635678138814610762575f5ffd5b80634385963214610612578063452115d6146106665780634bf5d7e914610685575f5ffd5b80632656227d116102dd57806332b8113e116102b857806332b8113e1461057c578063330df7ff146105ab5780633932abb1146105ca5780633e4f49e6146105e6575f5ffd5b80632656227d146104eb5780632d63f693146104fe5780632fe3e26114610549575f5ffd5b8063143489d01161030d578063143489d014610416578063150b7a021461047c578063160cbed7146104cc575f5ffd5b806301ffc9a71461039357806302a251a3146103c757806306fdde03146103f5575f5ffd5b3661038f5730610340610bf9565b73ffffffffffffffffffffffffffffffffffffffff161461038d576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f5ffd5b34801561039e575f5ffd5b506103b26103ad36600461447a565b610c1e565b60405190151581526020015b60405180910390f35b3480156103d2575f5ffd5b50600c546601000000000000900463ffffffff165b6040519081526020016103be565b348015610400575f5ffd5b50610409610d4e565b6040516103be9190614505565b348015610421575f5ffd5b50610457610430366004614517565b5f9081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103be565b348015610487575f5ffd5b5061049b610496366004614669565b610dde565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016103be565b3480156104d7575f5ffd5b506103e76104e6366004614832565b610e5f565b6103e76104f9366004614832565b610f5d565b348015610509575f5ffd5b506103e7610518366004614517565b5f9081526004602052604090205474010000000000000000000000000000000000000000900465ffffffffffff1690565b348015610554575f5ffd5b506103e77f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b348015610587575f5ffd5b5060085465ffffffffffff165b60405165ffffffffffff90911681526020016103be565b3480156105b6575f5ffd5b5061038d6105c53660046148c8565b611145565b3480156105d5575f5ffd5b50600c5465ffffffffffff166103e7565b3480156105f1575f5ffd5b50610605610600366004614517565b611159565b6040516103be9190614953565b34801561061d575f5ffd5b506103b261062c366004614961565b5f91825260076020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260039092019052902054151590565b348015610671575f5ffd5b506103e7610680366004614832565b611163565b348015610690575f5ffd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c740000006020820152610409565b3480156106d5575f5ffd5b506107026106e4366004614517565b5f908152600760205260409020805460018201546002909201549092565b604080519384526020840192909252908201526060016103be565b348015610728575f5ffd5b5060408051808201909152600181527f31000000000000000000000000000000000000000000000000000000000000006020820152610409565b34801561076d575f5ffd5b506103e761077c3660046149a4565b6111ef565b34801561078c575f5ffd5b506103e761079b366004614a13565b611216565b3480156107ab575f5ffd5b506103e76107ba366004614ad2565b6112f9565b3480156107ca575f5ffd5b506103e76107d9366004614961565b5f82815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845260030190915290205492915050565b34801561081c575f5ffd5b5061038d61082b3660046148c8565b611341565b34801561083b575f5ffd5b506103e761084a366004614b55565b611352565b34801561085a575f5ffd5b506103e7610869366004614bab565b6113a2565b348015610879575f5ffd5b506103e7610888366004614c6b565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b3480156108ba575f5ffd5b506108c36114a4565b6040516103be9796959493929190614cc0565b3480156108e1575f5ffd5b506103e76108f0366004614d56565b611502565b348015610900575f5ffd5b50610594611580565b348015610914575f5ffd5b506103e7610923366004614da4565b611589565b348015610933575f5ffd5b5061038d610942366004614c6b565b61159f565b348015610952575f5ffd5b5061038d610961366004614c6b565b6115b0565b348015610971575f5ffd5b506103e7610980366004614832565b6115c1565b348015610990575f5ffd5b506103b261099f366004614517565b6115ce565b3480156109af575f5ffd5b506103e76109be366004614517565b5f9081526004602052604090206001015465ffffffffffff1690565b3480156109e5575f5ffd5b506103e76115d6565b3480156109f9575f5ffd5b5061038d6115e0565b348015610a0d575f5ffd5b5061049b610a1c366004614df9565b61165e565b348015610a2c575f5ffd5b506103e7610a3b366004614517565b6116e0565b348015610a4b575f5ffd5b5061038d610a5a366004614517565b6116ea565b61038d610a6d366004614e93565b6116fb565b348015610a7d575f5ffd5b506103e7610a8c366004614832565b611784565b348015610a9c575f5ffd5b50600a5473ffffffffffffffffffffffffffffffffffffffff16610457565b348015610ac6575f5ffd5b506104096117db565b348015610ada575f5ffd5b506103e77ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b348015610b0d575f5ffd5b5061038d610b1c366004614ed3565b6117fb565b348015610b2c575f5ffd5b506103e7610b3b366004614ef6565b61180c565b348015610b4b575f5ffd5b5061038d610b5a366004614517565b61182b565b348015610b6a575f5ffd5b5061049b610b79366004614f20565b61183c565b348015610b89575f5ffd5b506103e7610b98366004614517565b6118be565b348015610ba8575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610457565b348015610bda575f5ffd5b50600e5473ffffffffffffffffffffffffffffffffffffffff16610457565b5f610c19600a5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fcdbdfcee000000000000000000000000000000000000000000000000000000001480610cb057507fffffffff0000000000000000000000000000000000000000000000000000000082167f65455a8600000000000000000000000000000000000000000000000000000000145b80610cfc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b80610d4857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060038054610d5d90614f78565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8990614f78565b8015610dd45780601f10610dab57610100808354040283529160200191610dd4565b820191905f5260205f20905b815481529060010190602001808311610db757829003601f168201915b5050505050905090565b5f30610de8610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614610e35576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b5f5f610e6d868686866115c1565b9050610e8281610e7d6004611903565b611925565b505f610e91828888888861197b565b905065ffffffffffff811615610f21575f8281526004602090815260409182902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff85169081179091558251858152918201527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1610f53565b6040517f90884a4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5095945050505050565b5f5f610f6b868686866115c1565b9050610f8b81610f7b6005611903565b610f856004611903565b17611925565b505f81815260046020526040902080547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0100000000000000000000000000000000000000000000000000000000000017905530610fe9610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614611099575f5b8651811015611097573073ffffffffffffffffffffffffffffffffffffffff1687828151811061103857611038614fc9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361108f5761108f85828151811061107057611070614fc9565b602002602001015180519060200120600561198990919063ffffffff16565b600101611006565b505b6110a681878787876119aa565b306110af610bf9565b73ffffffffffffffffffffffffffffffffffffffff16141580156110fe57506005546fffffffffffffffffffffffffffffffff8082167001000000000000000000000000000000009092041614155b15611108575f6005555b6040518181527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906020015b60405180910390a195945050505050565b61114d6119be565b61115681611a6a565b50565b5f610d4882611ae9565b5f5f611171868686866115c1565b90503361117e8282611bda565b6111d8576040517f8fe5d8a90000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff821660248201526044015b60405180910390fd5b6111e487878787611be5565b979650505050505050565b5f8033905061120e84828560405180602001604052805f815250611bf2565b949350505050565b5f61125c88888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a9250899150611c139050565b6112aa576040517f94ab6c0700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016111cf565b6112ed88878988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a9250611cfa915050565b98975050505050505050565b5f803390506111e487828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a9250611cfa915050565b6113496119be565b61115681611e17565b5f8033905061139886828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611bf292505050565b9695505050505050565b5f336113ae8184611e96565b6113fc576040517fd9b3955700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016111cf565b5f6114056115d6565b90508015611497575f61143383600161141c611580565b6114269190615023565b65ffffffffffff1661180c565b905081811015611495576040517fc242ee1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064016111cf565b505b6111e48787878786611f7d565b5f6060805f5f5f60606114b5612262565b6114bd61228e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b5f61150f858585856122bb565b61155d576040517f94ab6c0700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016111cf565b61157785848660405180602001604052805f815250611bf2565b95945050505050565b5f610c1961235e565b5f611595848484612368565b90505b9392505050565b6115a76119be565b61115681612437565b6115b86119be565b611156816124d2565b5f61157785858585611784565b5f6001610d48565b5f610c19600b5490565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611646575f5ffd5b505af1158015611658573d5f5f3e3d5ffd5b50505050565b5f30611668610bf9565b73ffffffffffffffffffffffffffffffffffffffff16146116b5576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b5f610d488261256d565b6116f26119be565b61115681612595565b6117036119be565b5f5f8573ffffffffffffffffffffffffffffffffffffffff1685858560405161172d929190615041565b5f6040518083038185875af1925050503d805f8114611767576040519150601f19603f3d011682016040523d82523d5f602084013e61176c565b606091505b509150915061177b82826125ff565b50505050505050565b5f8484848460405160200161179c949392919061510e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012095945050505050565b60606040518060600160405280603d815260200161562a603d9139905090565b6118036119be565b61115681612655565b5f611598838361182660408051602081019091525f815290565b612368565b6118336119be565b61115681612725565b5f30611846610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614611893576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b5f6118e16118cb83612766565b63ffffffff16600d6127b390919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff1692915050565b5f816007811115611916576119166148ed565b600160ff919091161b92915050565b5f5f61193084611159565b90505f8361193d83611903565b1603611598578381846040517f31b75e4d0000000000000000000000000000000000000000000000000000000081526004016111cf93929190615158565b5f6113988686868686612878565b5f6119948383612b40565b9050806119a5576119a56041612bd1565b505050565b6119b78585858585612be2565b5050505050565b336119c7610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614611a16576040517f47096e470000000000000000000000000000000000000000000000000000000081523360048201526024016111cf565b30611a1f610bf9565b73ffffffffffffffffffffffffffffffffffffffff1614611a68575f8036604051611a4b929190615041565b604051809103902090505b80611a616005612d61565b03611a5657505b565b6008546040805165ffffffffffff928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a1600880547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff92909216919091179055565b5f5f611af483612d80565b90506005816007811115611b0a57611b0a6148ed565b148015611bc75750600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba0919061517a565b5f8481526004602052604090206001015465ffffffffffff16611bc39190615191565b4210155b611bd15780611598565b60069392505050565b5f6115988383612f25565b5f61157785858585612fd6565b5f61157785858585611c0e60408051602081019091525f815290565b611cfa565b5f6111e485611cf47f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118a8a8a611c728c73ffffffffffffffffffffffffffffffffffffffff165f90815260026020526040902080546001810190915590565b8b516020808e01919091208c518d830120604051611cd998979695949301968752602087019590955260ff93909316604086015273ffffffffffffffffffffffffffffffffffffffff919091166060850152608084015260a083015260c082015260e00190565b604051602081830303815290604052805190602001206130e7565b8461312e565b5f611d0986610e7d6001611903565b505f86815260046020526040812054611d4490879074010000000000000000000000000000000000000000900465ffffffffffff1685612368565b90505f611d5488888885886131c5565b905083515f03611db7578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051611daa94939291906151a4565b60405180910390a2611e0e565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051611e059594939291906151cb565b60405180910390a25b6111e48861354d565b600c546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff92909216919091179055565b80515f906034811015611ead576001915050610d48565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec81840101517fffffffffffffffffffff0000000000000000000000000000000000000000000081167f2370726f706f7365723d0000000000000000000000000000000000000000000014611f2757600192505050610d48565b5f5f611f3786602a860386613556565b915091508115806111e457508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614979650505050505050565b5f611f9186868686805190602001206115c1565b905084518651141580611fa657508351865114155b80611fb057508551155b15611ffe578551845186516040517f447b05d00000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016111cf565b5f8181526004602052604090205474010000000000000000000000000000000000000000900465ffffffffffff1615612071578061203b82611159565b6040517f31b75e4d0000000000000000000000000000000000000000000000000000000081526111cf9291905f90600401615158565b5f612083600c5465ffffffffffff1690565b61208b611580565b65ffffffffffff1661209d9190615191565b90505f6120ba600c5463ffffffff66010000000000009091041690565b5f84815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617815590915061211183613636565b815465ffffffffffff9190911674010000000000000000000000000000000000000000027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff90911617815561216582612766565b815463ffffffff919091167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff90911617815588517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e090859087908c908c9067ffffffffffffffff8111156121f8576121f861454f565b60405190808252806020026020018201604052801561222b57816020015b60608152602001906001900390816122165790505b508c896122388a82615191565b8e60405161224e99989796959493929190615204565b60405180910390a150505095945050505050565b6060610c197f00000000000000000000000000000000000000000000000000000000000000005f613681565b6060610c197f00000000000000000000000000000000000000000000000000000000000000006001613681565b5f61157783611cf47ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d788888861231a8a73ffffffffffffffffffffffffffffffffffffffff165f90815260026020526040902080546001810190915590565b60408051602081019690965285019390935260ff909116606084015273ffffffffffffffffffffffffffffffffffffffff16608083015260a082015260c001611cd9565b5f610c1943613636565b6040517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063782d6fe190604401602060405180830381865afa1580156123fd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124219190615309565b6bffffffffffffffffffffffff16949350505050565b600e546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527feabe7d6d9720bd3fde29f0fbd6af94debeea74c6d5508c31ee6b07631e06e69b910160405180910390a1600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f610d4861257a8361372a565b5f8481526009602052604090205465ffffffffffff16613794565b5f61259e611580565b90507f6784e9bcb845caaa98267d7b0918f97d3d17f7cb35a05b52010f7eb587a0acb06125d28265ffffffffffff166118be565b60408051918252602082018590520160405180910390a1611658816125f6846137a3565b600d9190613802565b6060821561260e575080610d48565b8151156126235761261e8261381b565b610d48565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8063ffffffff165f03612696576040517ff1cfbf050000000000000000000000000000000000000000000000000000000081525f60048201526024016111cf565b600c546040805163ffffffff66010000000000009093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600c805463ffffffff9092166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff909216919091179055565b600b5460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600b55565b5f63ffffffff8211156127af576040517f6dfcc65000000000000000000000000000000000000000000000000000000000815260206004820152602481018390526044016111cf565b5090565b81545f908181600581111561280f575f6127cc84613823565b6127d69085615334565b5f8881526020902090915081015465ffffffffffff90811690871610156127ff5780915061280d565b61280a816001615191565b92505b505b5f61281c87878585613988565b9050801561286c5761284087612833600184615334565b5f91825260209091200190565b546601000000000000900479ffffffffffffffffffffffffffffffffffffffffffffffffffff166111e4565b505f9695505050505050565b5f5f61291a600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290b919061517a565b6129159042615191565b613636565b90505f5b8651811015612b3557600a54875173ffffffffffffffffffffffffffffffffffffffff9091169063f2b065379089908490811061295d5761295d614fc9565b602002602001015188848151811061297757612977614fc9565b602002602001015188858151811061299157612991614fc9565b6020026020010151866040516020016129ad9493929190615347565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016129e191815260200190565b602060405180830381865afa1580156129fc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a2091906153a1565b15612a5a576040517ff20e7d37000000000000000000000000000000000000000000000000000000008152600481018990526024016111cf565b600a54875173ffffffffffffffffffffffffffffffffffffffff90911690633a66f90190899084908110612a9057612a90614fc9565b6020026020010151888481518110612aaa57612aaa614fc9565b6020026020010151888581518110612ac457612ac4614fc9565b6020026020010151866040518563ffffffff1660e01b8152600401612aec9493929190615347565b6020604051808303815f875af1158015612b08573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2c919061517a565b5060010161291e565b509695505050505050565b81545f906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169181166001830190911603612b83575f915050610d48565b6fffffffffffffffffffffffffffffffff8181165f90815260018681016020526040909120949094558454918401811670010000000000000000000000000000000002911617909255919050565b634e487b715f52806020526024601cfd5b5f8581526004602052604081206001015465ffffffffffff1690819003612c38576040517fd5ddb825000000000000000000000000000000000000000000000000000000008152600481018790526024016111cf565b600a54612c5b9073ffffffffffffffffffffffffffffffffffffffff16346139de565b5f5b855181101561177b57600a54865173ffffffffffffffffffffffffffffffffffffffff90911690630825f38f90889084908110612c9c57612c9c614fc9565b6020026020010151878481518110612cb657612cb6614fc9565b6020026020010151878581518110612cd057612cd0614fc9565b6020026020010151866040518563ffffffff1660e01b8152600401612cf894939291906153c0565b5f604051808303815f875af1158015612d13573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612d589190810190615412565b50600101612c5d565b5f5f5f612d6d84613a55565b9150915081611598576115986031612bd1565b5f818152600460205260408120805460ff7e0100000000000000000000000000000000000000000000000000000000000082048116917f01000000000000000000000000000000000000000000000000000000000000009004168115612deb57506007949350505050565b8015612dfc57506002949350505050565b5f8581526004602052604081205474010000000000000000000000000000000000000000900465ffffffffffff169050805f03612e68576040517f6ad06075000000000000000000000000000000000000000000000000000000008152600481018790526024016111cf565b5f612e71611580565b65ffffffffffff169050808210612e8e57505f9695505050505050565b5f612e98886116e0565b9050818110612eaf57506001979650505050505050565b612eb888613af7565b1580612ed757505f888152600760205260409020805460019091015411155b15612eea57506003979650505050505050565b5f8881526004602052604090206001015465ffffffffffff165f03612f1757506004979650505050505050565b506005979650505050505050565b5f5f612f46600e5473ffffffffffffffffffffffffffffffffffffffff1690565b90508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612fc6575073ffffffffffffffffffffffffffffffffffffffff8116158015612fc657505f8481526004602052604090205473ffffffffffffffffffffffffffffffffffffffff8481169116145b8061120e575061120e8484613b58565b5f5f612fe486868686613baa565b5f8181526004602052604090206001015490915065ffffffffffff168015610f53575f5b87518110156130db57600a54885173ffffffffffffffffffffffffffffffffffffffff9091169063591fcdfe908a908490811061304757613047614fc9565b602002602001015189848151811061306157613061614fc9565b602002602001015189858151811061307b5761307b614fc9565b6020026020010151866040518563ffffffff1660e01b81526004016130a394939291906153c0565b5f604051808303815f87803b1580156130ba575f5ffd5b505af11580156130cc573d5f5f3e3d5ffd5b50505050806001019050613008565b50509050949350505050565b5f610d486130f3613c8d565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f8373ffffffffffffffffffffffffffffffffffffffff163b5f036131b3575f5f6131598585613dc3565b5090925090505f816003811115613172576131726148ed565b1480156131aa57508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b92505050611598565b6131be848484613e0c565b9050611598565b5f85815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684526003019091528120548303838111150280820361324f576040517f71c6af4900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016111cf565b5f80808060ff891661329e57865115613294576040517f867db77100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5083925082613499565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8a160161330b57865115613301576040517f867db77100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5083915081613499565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60ff8a16016133785786511561336e576040517f867db77100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5083905080613499565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff8a16016134675786516030146133dd576040517f867db77100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602087015160801c9350603087015160801c9250604087015160801c91508183850101905084811115613462576040517f02a71c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b16600482015260248101829052604481018690526064016111cf565b613499565b6040517f06b337c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8b815260076020526040902084156134c45784815f015f8282546134be9190615191565b90915550505b83156134e35783816001015f8282546134dd9190615191565b90915550505b82156135025782816002015f8282546134fc9190615191565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8b165f90815260038201602052604081208054849290613538908490615191565b90915550919c9b505050505050505050505050565b61115681613e76565b5f5f845183118061356657508284115b1561357557505f90508061362e565b5f613581856001615191565b841180156135dc57507f30780000000000000000000000000000000000000000000000000000000000006135b88787016020015190565b7fffff00000000000000000000000000000000000000000000000000000000000016145b90505f6135ec8215156002615487565b6135f7906028615191565b9050806136048787615334565b03613625575f5f613616898989613f63565b909650945061362e9350505050565b5f5f9350935050505b935093915050565b5f65ffffffffffff8211156127af576040517f6dfcc65000000000000000000000000000000000000000000000000000000000815260306004820152602481018390526044016111cf565b606060ff831461369b5761369483614057565b9050610d48565b8180546136a790614f78565b80601f01602080910402602001604051908101604052809291908181526020018280546136d390614f78565b801561371e5780601f106136f55761010080835404028352916020019161371e565b820191905f5260205f20905b81548152906001019060200180831161370157829003601f168201915b50505050509050610d48565b5f81815260046020526040812054613786907a010000000000000000000000000000000000000000000000000000810463ffffffff169074010000000000000000000000000000000000000000900465ffffffffffff1661549e565b65ffffffffffff1692915050565b5f828218828411028218611598565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff8211156127af576040517f6dfcc65000000000000000000000000000000000000000000000000000000000815260d06004820152602481018390526044016111cf565b5f8061380f858585614094565b91509150935093915050565b805160208201fd5b5f60018211613830575090565b81600170010000000000000000000000000000000082106138565760809190911c9060401b5b6801000000000000000082106138715760409190911c9060201b5b64010000000082106138885760209190911c9060101b5b62010000821061389d5760109190911c9060081b5b61010082106138b15760089190911c9060041b5b601082106138c45760049190911c9060021b5b600482106138d05760011b5b600302600190811c908185816138e8576138e86154bc565b048201901c90506001818581613900576139006154bc565b048201901c90506001818581613918576139186154bc565b048201901c90506001818581613930576139306154bc565b048201901c90506001818581613948576139486154bc565b048201901c90506001818581613960576139606154bc565b048201901c905061397f818581613979576139796154bc565b04821190565b90039392505050565b5f5b818310156139d6575f85815260209020838316600285851804019081015465ffffffffffff868116911611156139c2578092506139d0565b6139cd816001615191565b93505b5061398a565b509392505050565b80471015613a21576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016111cf565b613a3a828260405180602001604052805f815250614255565b15613a43575050565b3d1561262357613a5161426a565b5050565b80545f9081906fffffffffffffffffffffffffffffffff808216917001000000000000000000000000000000009004168103613a9657505f93849350915050565b6fffffffffffffffffffffffffffffffff8181165f908152600186810160205260408220805492905586547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016938101909216929092179094559293915050565b5f81815260076020526040812060028101546001820154613b189190615191565b5f84815260046020526040902054613b4f9074010000000000000000000000000000000000000000900465ffffffffffff166118be565b11159392505050565b5f80613b6384611159565b6007811115613b7457613b746148ed565b1480156115985750505f918252600460205260409091205473ffffffffffffffffffffffffffffffffffffffff91821691161490565b5f5f613bb8868686866115c1565b9050613c0681613bc86007611903565b613bd26006611903565b613bdc6002611903565b6001613be96007826154e9565b613bf490600261561b565b613bfe9190615334565b181818611925565b505f818152600460205260409081902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0100000000000000000000000000000000000000000000000000000000000000179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906111349083815260200190565b5f3073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015613cf257507f000000000000000000000000000000000000000000000000000000000000000046145b15613d1c57507f000000000000000000000000000000000000000000000000000000000000000090565b610c19604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f8351604103613dfa576020840151604085015160608601515f1a613dec88828585614275565b955095509550505050613e05565b505081515f91506002905b9250925092565b8051604080517f1626ba7e000000000000000000000000000000000000000000000000000000008082526004820186905260248201929092525f92906020820185604483015e60205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f8181526009602052604090205465ffffffffffff16158015613e9d5750613e9d81613af7565b15611156575f613eb460085465ffffffffffff1690565b613ebc611580565b613ec6919061549e565b9050613ed1826116e0565b8165ffffffffffff161115613f1e5760405165ffffffffffff8216815282907f541f725fb9f7c98a30cc9c0ff32fbb14358cd7159c847a3aa20a2bdc442ba5119060200160405180910390a25b5f9182526009602052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff92909216919091179055565b5f808481613f72866001615191565b85118015613fcd57507f3078000000000000000000000000000000000000000000000000000000000000613fa98388016020015190565b7fffff00000000000000000000000000000000000000000000000000000000000016145b90505f613fdd8215156002615487565b90505f80613feb838a615191565b90505b87811015614046575f61400c6140078784016020015190565b614368565b9050600f8160ff16111561402b575f5f9750975050505050505061362e565b614036601084615487565b60ff909116019150600101613fee565b506001999098509650505050505050565b60605f6140638361443a565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b82545f90819080156141e5575f6140b087612833600185615334565b805490915065ffffffffffff808216916601000000000000900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16908816821115614122576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff160361417157825465ffffffffffff16660100000000000079ffffffffffffffffffffffffffffffffffffffffffffffffffff8916021783556141d7565b6040805180820190915265ffffffffffff808a16825279ffffffffffffffffffffffffffffffffffffffffffffffffffff808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b945085935061362e92505050565b50506040805180820190915265ffffffffffff808516825279ffffffffffffffffffffffffffffffffffffffffffffffffffff80851660208085019182528854600181018a555f8a815291822095519251909316660100000000000002919093161792019190915590508161362e565b5f5f5f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156142ae57505f9150600390508261435e565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156142ff573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661435557505f92506001915082905061435e565b92505f91508190505b9450945094915050565b5f60f882901c602f811180156143815750603a8160ff16105b156143ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd001610d48565b60608160ff161180156143c3575060678160ff16105b156143ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa901610d48565b60408160ff16118015614405575060478160ff16105b15614431577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc901610d48565b5060ff92915050565b5f60ff8216601f811115610d48576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6020828403121561448a575f5ffd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611598575f5ffd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61159860208301846144b9565b5f60208284031215614527575f5ffd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611156575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156145c3576145c361454f565b604052919050565b5f67ffffffffffffffff8211156145e4576145e461454f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f61462261461d846145cb565b61457c565b9050828152838383011115614635575f5ffd5b828260208301375f602084830101529392505050565b5f82601f83011261465a575f5ffd5b61159883833560208501614610565b5f5f5f5f6080858703121561467c575f5ffd5b84356146878161452e565b935060208501356146978161452e565b925060408501359150606085013567ffffffffffffffff8111156146b9575f5ffd5b6146c58782880161464b565b91505092959194509250565b5f67ffffffffffffffff8211156146ea576146ea61454f565b5060051b60200190565b5f82601f830112614703575f5ffd5b813561471161461d826146d1565b8082825260208201915060208360051b860101925085831115614732575f5ffd5b602085015b83811015610f5357803561474a8161452e565b835260209283019201614737565b5f82601f830112614767575f5ffd5b813561477561461d826146d1565b8082825260208201915060208360051b860101925085831115614796575f5ffd5b602085015b83811015610f5357803583526020928301920161479b565b5f82601f8301126147c2575f5ffd5b81356147d061461d826146d1565b8082825260208201915060208360051b8601019250858311156147f1575f5ffd5b602085015b83811015610f5357803567ffffffffffffffff811115614814575f5ffd5b614823886020838a010161464b565b845250602092830192016147f6565b5f5f5f5f60808587031215614845575f5ffd5b843567ffffffffffffffff81111561485b575f5ffd5b614867878288016146f4565b945050602085013567ffffffffffffffff811115614883575f5ffd5b61488f87828801614758565b935050604085013567ffffffffffffffff8111156148ab575f5ffd5b6148b7878288016147b3565b949793965093946060013593505050565b5f602082840312156148d8575f5ffd5b813565ffffffffffff81168114611598575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6008811061494f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610d48828461491a565b5f5f60408385031215614972575f5ffd5b8235915060208301356149848161452e565b809150509250929050565b803560ff8116811461499f575f5ffd5b919050565b5f5f604083850312156149b5575f5ffd5b823591506149c56020840161498f565b90509250929050565b5f5f83601f8401126149de575f5ffd5b50813567ffffffffffffffff8111156149f5575f5ffd5b602083019150836020828501011115614a0c575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a031215614a29575f5ffd5b87359650614a396020890161498f565b95506040880135614a498161452e565b9450606088013567ffffffffffffffff811115614a64575f5ffd5b614a708a828b016149ce565b909550935050608088013567ffffffffffffffff811115614a8f575f5ffd5b614a9b8a828b0161464b565b92505060a088013567ffffffffffffffff811115614ab7575f5ffd5b614ac38a828b0161464b565b91505092959891949750929550565b5f5f5f5f5f60808688031215614ae6575f5ffd5b85359450614af66020870161498f565b9350604086013567ffffffffffffffff811115614b11575f5ffd5b614b1d888289016149ce565b909450925050606086013567ffffffffffffffff811115614b3c575f5ffd5b614b488882890161464b565b9150509295509295909350565b5f5f5f5f60608587031215614b68575f5ffd5b84359350614b786020860161498f565b9250604085013567ffffffffffffffff811115614b93575f5ffd5b614b9f878288016149ce565b95989497509550505050565b5f5f5f5f60808587031215614bbe575f5ffd5b843567ffffffffffffffff811115614bd4575f5ffd5b614be0878288016146f4565b945050602085013567ffffffffffffffff811115614bfc575f5ffd5b614c0887828801614758565b935050604085013567ffffffffffffffff811115614c24575f5ffd5b614c30878288016147b3565b925050606085013567ffffffffffffffff811115614c4c575f5ffd5b8501601f81018713614c5c575f5ffd5b6146c587823560208401614610565b5f60208284031215614c7b575f5ffd5b81356115988161452e565b5f8151808452602084019350602083015f5b82811015614cb6578151865260209586019590910190600101614c98565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f614cfa60e08301896144b9565b8281036040840152614d0c81896144b9565b905086606084015273ffffffffffffffffffffffffffffffffffffffff861660808401528460a084015282810360c0840152614d488185614c86565b9a9950505050505050505050565b5f5f5f5f60808587031215614d69575f5ffd5b84359350614d796020860161498f565b92506040850135614d898161452e565b9150606085013567ffffffffffffffff8111156146b9575f5ffd5b5f5f5f60608486031215614db6575f5ffd5b8335614dc18161452e565b925060208401359150604084013567ffffffffffffffff811115614de3575f5ffd5b614def8682870161464b565b9150509250925092565b5f5f5f5f5f60a08688031215614e0d575f5ffd5b8535614e188161452e565b94506020860135614e288161452e565b9350604086013567ffffffffffffffff811115614e43575f5ffd5b614e4f88828901614758565b935050606086013567ffffffffffffffff811115614e6b575f5ffd5b614e7788828901614758565b925050608086013567ffffffffffffffff811115614b3c575f5ffd5b5f5f5f5f60608587031215614ea6575f5ffd5b8435614eb18161452e565b935060208501359250604085013567ffffffffffffffff811115614b93575f5ffd5b5f60208284031215614ee3575f5ffd5b813563ffffffff81168114611598575f5ffd5b5f5f60408385031215614f07575f5ffd5b8235614f128161452e565b946020939093013593505050565b5f5f5f5f5f60a08688031215614f34575f5ffd5b8535614f3f8161452e565b94506020860135614f4f8161452e565b93506040860135925060608601359150608086013567ffffffffffffffff811115614b3c575f5ffd5b600181811c90821680614f8c57607f821691505b602082108103614fc3577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b65ffffffffffff8281168282160390811115610d4857610d48614ff6565b818382375f9101908152919050565b5f8151808452602084019350602083015f5b82811015614cb657815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101615062565b5f82825180855260208501945060208160051b830101602085015f5b83811015615102577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030188526150ec8383516144b9565b60209889019890935091909101906001016150b2565b50909695505050505050565b608081525f6151206080830187615050565b82810360208401526151328187614c86565b905082810360408401526151468186615096565b91505082606083015295945050505050565b8381526060810161516c602083018561491a565b826040830152949350505050565b5f6020828403121561518a575f5ffd5b5051919050565b80820180821115610d4857610d48614ff6565b84815260ff84166020820152826040820152608060608201525f61139860808301846144b9565b85815260ff8516602082015283604082015260a060608201525f6151f260a08301856144b9565b82810360808401526112ed81856144b9565b89815273ffffffffffffffffffffffffffffffffffffffff8916602082015261012060408201525f61523a61012083018a615050565b828103606084015261524c818a614c86565b9050828103608084015280885180835260208301915060208160051b84010160208b015f5b838110156152c1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526152ab8383516144b9565b6020958601959093509190910190600101615271565b505085810360a08701526152d5818b615096565b93505050508560c08401528460e08401528281036101008401526152f981856144b9565b9c9b505050505050505050505050565b5f60208284031215615319575f5ffd5b81516bffffffffffffffffffffffff81168114611598575f5ffd5b81810381811115610d4857610d48614ff6565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260a060408201525f60a082015260c060608201525f61538860c08301856144b9565b905065ffffffffffff8316608083015295945050505050565b5f602082840312156153b1575f5ffd5b81518015158114611598575f5ffd5b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260a060408201525f60a082015260c060608201525f61540160c08301856144b9565b905082608083015295945050505050565b5f60208284031215615422575f5ffd5b815167ffffffffffffffff811115615438575f5ffd5b8201601f81018413615448575f5ffd5b805161545661461d826145cb565b81815285602083850101111561546a575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b8082028115828204841417610d4857610d48614ff6565b65ffffffffffff8181168382160190811115610d4857610d48614ff6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b60ff8181168382160190811115610d4857610d48614ff6565b6001815b600184111561362e5780850481111561552157615521614ff6565b600184161561552f57908102905b60019390931c928002615506565b5f8261554b57506001610d48565b8161555757505f610d48565b816001811461556d576002811461557757615593565b6001915050610d48565b60ff84111561558857615588614ff6565b50506001821b610d48565b5060208310610133831016604e8410600b84101617156155b6575081810a610d48565b6155e17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615502565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561561357615613614ff6565b029392505050565b5f61159860ff84168361553d56fe737570706f72743d627261766f2c6672616374696f6e616c2671756f72756d3d666f722c6162737461696e26706172616d733d6672616374696f6e616ca26469706673582212206932de27756d862fa4bbe5852c6a414688e2aaeb223d050011b96ec4361054b664736f6c634300082300330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000013da329b63364718000000000000000000000000000000000000000000000000000000000000000001c2000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000009d80000000000000000000000000000000000000000000001fc3842bd1f071c00000000000000000000000000000de30da39c46104798bb5aa3fe8b9e0e1f348163f00000000000000000000000057a8865cfb1ecef7253c27da6b4bc3daee5be5180000000000000000000000005743e35477363241300fcedc2f5eb0195f3008170000000000000000000000000000000000000000000000000000000000000018476974636f696e20476f7665726e6f7220436861726c69650000000000000000", + "nonce": "0x0", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "type": "0x2", + "status": "0x1", + "cumulativeGasUsed": "0xe9c232", + "logs": [ + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0x7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c20", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x71", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057a8865cfb1ecef7253c27da6b4bc3daee5be518", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x72", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003840", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x73", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d80", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x74", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fc3842bd1f071c00000", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x75", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0x6784e9bcb845caaa98267d7b0918f97d3d17f7cb35a05b52010f7eb587a0acb0" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013da329b6336471800000", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x76", + "removed": false + }, + { + "address": "0xef41cbd211076e8b1901e214bf751d404cf06638", + "topics": [ + "0xeabe7d6d9720bd3fde29f0fbd6af94debeea74c6d5508c31ee6b07631e06e69b" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005743e35477363241300fcedc2f5eb0195f300817", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "blockTimestamp": "0x6a83599f", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "logIndex": "0x77", + "removed": false + } + ], + "logsBloom": "0x0000000000000000000000000000000000000000000000000000000000000a000000000020000000000000000010000000000020000000000000000000000100000000000000000000000000000000000000000000000000000010000100000000000000000000080002000000000000000000000000000000000000000000001000002000000000000002000000000000000000000000000000000000000202200000000000000000000000000000000000000000000000000000002000000000000000000000000000020000000000200000101000000000000000800000000000000800000000000000000000000000000000000000000000000000002000", + "transactionHash": "0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb", + "transactionIndex": "0x64", + "blockHash": "0xf3a8f22a19353f65544df091cb82c3c7976c0a4967555d5dc5584cf54127f1f3", + "blockNumber": "0x1895266", + "gasUsed": "0x4d4772", + "effectiveGasPrice": "0x5f88104", + "from": "0xba41c0652c89dda91041fb6ad58576784c9f28f6", + "to": null, + "contractAddress": "0xef41cbd211076e8b1901e214bf751d404cf06638" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1786993090380, + "chain": 1, + "commit": "1acd0b0" +} \ No newline at end of file From 7f2d9d7d0ba8d6726de0cb82491fd560a237de51 Mon Sep 17 00:00:00 2001 From: Ben DiFrancesco Date: Mon, 17 Aug 2026 15:13:22 -0400 Subject: [PATCH 3/3] Update test suite to execute with the actual Governor Charlie deployment --- AGENTS.md | 33 ++++++++------ README.md | 38 ++++++++++------ script/ProposeGovernorUpgradeMainnet.s.sol | 6 +-- .../GovernorUpgradeProposal.integration.t.sol | 12 +++++- ...radeFranchiserDelegation.integration.t.sol | 2 +- test/PostUpgradeGovernance.integration.t.sol | 10 +++++ ...tUpgradeProposalGuardian.integration.t.sol | 10 +++++ ...ostUpgradeQuorumBehavior.integration.t.sol | 10 +++++ .../GitcoinGovernorUpgradeTestBase.sol | 43 ++++++++++++++----- 9 files changed, 121 insertions(+), 43 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 392046d..7e54ffe 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -242,23 +242,28 @@ secret). CI supplies it via the `MAINNET_RPC_URL` repository secret. ## Current status - `GitcoinGovernorWithGuardian` and its two custom extensions are written. +- **Gitcoin Governor Charlie is deployed and verified on mainnet** at + `0xef41CbD211076E8b1901e214Bf751d404cf06638` (block `25_776_742`, transaction + `0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb`). Its configuration is 1.5 + million GTC quorum, 14,400-block voting delay, 40,320-block voting period, 150,000 GTC proposal + threshold, 7,200-block vote extension, and Proposal Guardian + `0x5743E35477363241300FcEdc2F5eB0195F300817`. - The Governor **deploy script** (`DeployGitcoinGovernorWithGuardian[Mainnet].s.sol`) and the - **upgrade proposal script** (`ProposeGovernorUpgrade[Mainnet].s.sol`) are in place. The deploy - configuration is finalized: "Gitcoin Governor Charlie," 1.5 million GTC quorum, 14,400-block - voting delay, unchanged 40,320-block voting period and 150,000 GTC proposal threshold, 7,200-block - vote extension, and Proposal Guardian `0x5743E35477363241300FcEdc2F5eB0195F300817`. The proposal - script still carries `TODO`s for the new Governor address, proposer, and proposal text. + **upgrade proposal script** (`ProposeGovernorUpgrade[Mainnet].s.sol`) are in place. The proposal + concrete now points at the deployed Governor and still carries `TODO`s for the proposer and final + proposal text. - The **mainnet fork integration suite** (`test/*.integration.t.sol`) is in place: it deploys the new Governor with the real deploy script, submits the upgrade proposal with the real proposal script, and exercises the upgrade lifecycle, post-upgrade governance, quorum behavior (settable + late-quorum), and the Proposal Guardian. Shared helpers live in `test/helpers/`; - each suite has a `…MainnetScript` provenance concrete, with room for a `…MainnetDeployed` - concrete after the real deployment. Proposals are voted through by an electorate of **real - delegates** whose live weights are read from the fork in `setUp`. The suite pins `FORK_BLOCK` - in `test/helpers/GitcoinGovernorUpgradeTestBase.sol` — when bumping it, re-verify the - `PROPOSER` delegate still clears the proposal threshold and the electorate still clears quorum - (`setUp` asserts both weights loudly, and quorum-boundary tests assert their own weight - preconditions). + the four Governor suites have both `…MainnetScript` and `…MainnetDeployed` provenance concretes. + The former fork from before deployment and run the production deploy script; the latter fork from + the first block after deployment and bind to the production bytecode. Proposals are voted through + by an electorate of **real delegates** whose live weights are read from the fork in `setUp`. The + suite pins both `GOVERNOR_PRE_DEPLOYMENT_BLOCK` and `GOVERNOR_POST_DEPLOYMENT_BLOCK` in + `test/helpers/GitcoinGovernorUpgradeTestBase.sol`; when bumping either, re-verify the `PROPOSER` + delegate still clears the proposal threshold and the electorate still clears quorum (`setUp` + asserts both weights loudly, and quorum-boundary tests assert their own weight preconditions). - The Franchiser contracts are in place as the `lib/franchiser-expiry` submodule (ScopeLift fork, `repo-updates` branch), and all four **Franchiser script pairs** are written: `DeployFranchiser[Mainnet]`, `ProposeFranchiserDelegation[Mainnet]`, @@ -275,8 +280,8 @@ secret). CI supplies it via the `MAINNET_RPC_URL` repository secret. proposals already snapshotted), expiry sweeps (permissionless, candidate filtering, weight persists until swept), and the scripts' validation reverts. Shared helpers live in `test/helpers/PostUpgradeFranchiserTestBase.sol`. -- Up next: confirm the outstanding `TODO`s with Gitcoin stakeholders, deploy the new Governor, - and run the upgrade proposal (see [Deliverables](#deliverables)). +- Up next: confirm the upgrade proposal's proposer and final text with Gitcoin stakeholders, then + run the upgrade proposal (see [Deliverables](#deliverables)). - CI runs `forge build`, `forge test`, and `scopelint check`. Coverage and Slither jobs are scaffolded but commented out in `.github/workflows/ci.yml`. diff --git a/README.md b/README.md index 791308e..319a0dd 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,15 @@ block voting delay (approximately 48 hours), the existing 40,320-block voting pe proposal threshold, and a 7,200-block late-quorum voting window (approximately 24 hours). Proposal Guardian authority is initially assigned to `0x5743E35477363241300FcEdc2F5eB0195F300817`. +Gitcoin Governor Charlie was deployed and verified on Ethereum mainnet on August 17, 2026: + +| Item | Value | +| --- | --- | +| Governor | [`0xef41CbD211076E8b1901e214Bf751d404cf06638`](https://etherscan.io/address/0xef41CbD211076E8b1901e214Bf751d404cf06638#code) | +| Deployment transaction | [`0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb`](https://etherscan.io/tx/0xaa524bf06153ec3fde533f207d0f843fea26661774db6fe7113a67423b9caafb) | +| Deployment block | `25,776,742` | +| Deployer | `0xba41C0652c89dDa91041Fb6ad58576784c9f28F6` | + Dry-run first to simulate the deployment and print the transaction it would send, and review that before broadcasting: @@ -91,9 +100,8 @@ Governor as its pending admin (`setPendingAdmin`), and the new Governor claims t same Timelock, that the old Governor is the Timelock's current admin, and that the proposer's voting weight meets the proposal threshold. -The new Governor's address, the proposer, and the final proposal text carry `TODO`s. The script -reverts until the first two are set — the proposal cannot be submitted before the new Governor is -deployed and a proposer is confirmed. +The deployed Governor address is fixed in the concrete. The proposer and final proposal text still +carry `TODO`s, and the script reverts until a proposer is confirmed. Dry-run first to simulate the proposal and review the transaction it would send: @@ -212,11 +220,12 @@ forge script script/RecallExpiredFranchisersMainnet.s.sol:RecallExpiredFranchise ## Testing -The integration tests (`test/*.integration.t.sol`) run against a fork of Ethereum mainnet pinned -to a fixed block, and simulate the entire upgrade the way it will actually happen: the real deploy -script deploys the new Governor onto the fork, the real proposal script submits the upgrade -proposal to the currently active Governor, and delegates vote it through to execution — after -which the suites exercise the upgraded Governor in place: +The integration tests (`test/*.integration.t.sol`) run against forks of Ethereum mainnet pinned to +fixed blocks. The `…MainnetScript` provenance forks from before the real deployment and runs the +production deploy script. The `…MainnetDeployed` provenance forks from the first block after the +deployment and binds to Gitcoin Governor Charlie's live mainnet bytecode. Both provenances then +submit the upgrade proposal to the currently active Governor and vote it through to execution before +exercising the upgraded Governor in place: - `GovernorUpgradeProposal` — the upgrade proposal's lifecycle on the active Governor: passing it hands the Timelock to the new Governor; defeating it leaves the current Governor in control. @@ -246,10 +255,15 @@ the real deploy script and drive the operations scripts end-to-end: guard protecting live positions. Each suite is written against an abstract base that leaves *how the system comes into being* to a -small concrete contract at the bottom of the file. Today each file has a `…MainnetScript` concrete -that deploys via the real deploy scripts; once the new Governor and the Franchiser system are live -on mainnet, `…MainnetDeployed` concretes pointing at the deployed addresses can rerun the same -suites as a post-deployment acceptance check. +small concrete contract at the bottom of the file. The four Governor suites have both +`…MainnetScript` and `…MainnetDeployed` concretes. Run the deployed-bytecode acceptance suites with: + +```sh +forge test --match-contract '.*MainnetDeployed' +``` + +The Franchiser suites currently retain their `…MainnetScript` provenance; deployed concretes will +be added once the Franchiser system is live on mainnet. ## License diff --git a/script/ProposeGovernorUpgradeMainnet.s.sol b/script/ProposeGovernorUpgradeMainnet.s.sol index 5da0626..4d82b4b 100644 --- a/script/ProposeGovernorUpgradeMainnet.s.sol +++ b/script/ProposeGovernorUpgradeMainnet.s.sol @@ -10,11 +10,9 @@ import {ProposeGovernorUpgrade} from "script/ProposeGovernorUpgrade.s.sol"; contract ProposeGovernorUpgradeMainnet is ProposeGovernorUpgrade { IGovernorBravo constant OLD_GOVERNOR = IGovernorBravo(0x9D4C63565D5618310271bF3F3c01b2954C1D1639); - // TODO: Set to the GitcoinGovernorWithGuardian address once it is deployed to mainnet. The zero - // address makes this script revert until then, so the proposal cannot be submitted before the - // new Governor exists. + // Gitcoin Governor Charlie, deployed to mainnet on August 17, 2026. GitcoinGovernorWithGuardian constant NEW_GOVERNOR = - GitcoinGovernorWithGuardian(payable(address(0))); + GitcoinGovernorWithGuardian(payable(0xef41CbD211076E8b1901e214Bf751d404cf06638)); // TODO: Set to the delegate who will submit the proposal. They must hold or be delegated voting // weight of at least the old Governor's proposal threshold. The zero address makes this script diff --git a/test/GovernorUpgradeProposal.integration.t.sol b/test/GovernorUpgradeProposal.integration.t.sol index 25a36b1..5b7e9b7 100644 --- a/test/GovernorUpgradeProposal.integration.t.sol +++ b/test/GovernorUpgradeProposal.integration.t.sol @@ -9,7 +9,7 @@ import {GitcoinGovernorUpgradeTestBase} from "test/helpers/GitcoinGovernorUpgrad // upgrade proposal — submitted to the old Governor by the real proposal script — is walked // through passing, failing, and post-upgrade outcomes for control of the Timelock. abstract contract GovernorUpgradeProposalTest is GitcoinGovernorUpgradeTestBase { - function test_DeploysTheNewGovernorWithTheMainnetConfiguration() external view { + function test_NewGovernorHasTheMainnetConfiguration() external view { assertEq(governor.name(), "Gitcoin Governor Charlie"); assertEq(address(governor.token()), address(GTC_TOKEN)); assertEq(governor.timelock(), address(TIMELOCK)); @@ -155,3 +155,13 @@ contract GovernorUpgradeProposalMainnetScript is GovernorUpgradeProposalTest { return _deployGovernorWithMainnetScript(); } } + +contract GovernorUpgradeProposalMainnetDeployed is GovernorUpgradeProposalTest { + function _setUpNetwork() internal override { + _createMainnetGovernorPostDeploymentFork(); + } + + function _fetchOrDeploySystem() internal view override returns (GitcoinGovernorWithGuardian) { + return _fetchDeployedGovernor(); + } +} diff --git a/test/PostUpgradeFranchiserDelegation.integration.t.sol b/test/PostUpgradeFranchiserDelegation.integration.t.sol index 6a83f7e..fa8f840 100644 --- a/test/PostUpgradeFranchiserDelegation.integration.t.sol +++ b/test/PostUpgradeFranchiserDelegation.integration.t.sol @@ -84,7 +84,7 @@ abstract contract PostUpgradeFranchiserDelegationTest is PostUpgradeFranchiserTe uint256 _initialWeight = GTC_TOKEN.getCurrentVotes(LEFTERIS); if (_initialWeight == 0) { revert( - "Test scaffolding: lefteris.eth has no delegated weight at FORK_BLOCK; pick a delegate " + "Test scaffolding: lefteris.eth has no delegated weight at the pinned fork block; pick a delegate " "with existing weight for the stacking scenario" ); } diff --git a/test/PostUpgradeGovernance.integration.t.sol b/test/PostUpgradeGovernance.integration.t.sol index 3c3e63f..af45004 100644 --- a/test/PostUpgradeGovernance.integration.t.sol +++ b/test/PostUpgradeGovernance.integration.t.sol @@ -299,3 +299,13 @@ contract PostUpgradeGovernanceMainnetScript is PostUpgradeGovernanceTest { return _deployGovernorWithMainnetScript(); } } + +contract PostUpgradeGovernanceMainnetDeployed is PostUpgradeGovernanceTest { + function _setUpNetwork() internal override { + _createMainnetGovernorPostDeploymentFork(); + } + + function _fetchOrDeploySystem() internal view override returns (GitcoinGovernorWithGuardian) { + return _fetchDeployedGovernor(); + } +} diff --git a/test/PostUpgradeProposalGuardian.integration.t.sol b/test/PostUpgradeProposalGuardian.integration.t.sol index 8a541b4..ece5b1a 100644 --- a/test/PostUpgradeProposalGuardian.integration.t.sol +++ b/test/PostUpgradeProposalGuardian.integration.t.sol @@ -223,3 +223,13 @@ contract PostUpgradeProposalGuardianMainnetScript is PostUpgradeProposalGuardian return _deployGovernorWithMainnetScript(); } } + +contract PostUpgradeProposalGuardianMainnetDeployed is PostUpgradeProposalGuardianTest { + function _setUpNetwork() internal override { + _createMainnetGovernorPostDeploymentFork(); + } + + function _fetchOrDeploySystem() internal view override returns (GitcoinGovernorWithGuardian) { + return _fetchDeployedGovernor(); + } +} diff --git a/test/PostUpgradeQuorumBehavior.integration.t.sol b/test/PostUpgradeQuorumBehavior.integration.t.sol index 99bd396..038a3e9 100644 --- a/test/PostUpgradeQuorumBehavior.integration.t.sol +++ b/test/PostUpgradeQuorumBehavior.integration.t.sol @@ -246,3 +246,13 @@ contract PostUpgradeQuorumBehaviorMainnetScript is PostUpgradeQuorumBehaviorTest return _deployGovernorWithMainnetScript(); } } + +contract PostUpgradeQuorumBehaviorMainnetDeployed is PostUpgradeQuorumBehaviorTest { + function _setUpNetwork() internal override { + _createMainnetGovernorPostDeploymentFork(); + } + + function _fetchOrDeploySystem() internal view override returns (GitcoinGovernorWithGuardian) { + return _fetchDeployedGovernor(); + } +} diff --git a/test/helpers/GitcoinGovernorUpgradeTestBase.sol b/test/helpers/GitcoinGovernorUpgradeTestBase.sol index f9c0bfc..19e7978 100644 --- a/test/helpers/GitcoinGovernorUpgradeTestBase.sol +++ b/test/helpers/GitcoinGovernorUpgradeTestBase.sol @@ -23,20 +23,24 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { // The support value GovernorCountingFractional reserves for fractional votes. uint8 constant VOTE_TYPE_FRACTIONAL = 255; - uint256 constant FORK_BLOCK = 25_453_000; + uint256 constant GOVERNOR_PRE_DEPLOYMENT_BLOCK = 25_453_000; + uint256 constant GOVERNOR_POST_DEPLOYMENT_BLOCK = 25_776_743; IGovernorBravo constant OLD_GOVERNOR = IGovernorBravo(0x9D4C63565D5618310271bF3F3c01b2954C1D1639); + GitcoinGovernorWithGuardian constant DEPLOYED_GOVERNOR = + GitcoinGovernorWithGuardian(payable(0xef41CbD211076E8b1901e214Bf751d404cf06638)); IGtc constant GTC_TOKEN = IGtc(0xDe30da39c46104798bB5aA3fe8B9e0e1F348163F); ICompoundTimelock constant TIMELOCK = ICompoundTimelock(payable(0x57a8865cfB1eCEf7253c27da6B4BC3dAEE5Be518)); address constant PROPOSAL_GUARDIAN = 0x5743E35477363241300FcEdc2F5eB0195F300817; - // kbw.eth — a real delegate whose voting weight (~485k GTC at FORK_BLOCK) clears the 150k + // kbw.eth — a real delegate whose voting weight (~485k GTC at the pre-deployment block) clears + // the 150k // proposal threshold on both governors (guarded in setUp). address constant PROPOSER = 0xc2E2B715d9e302947Ec7e312fd2384b5a1296099; // Real Gitcoin delegates who, together with the PROPOSER, form the test electorate. Approximate - // voting weights at FORK_BLOCK are noted; live weights are fetched in setUp. + // voting weights at the pre-deployment block are noted; live weights are fetched in setUp. address constant KEV = 0x00De4B13153673BCAE2616b67bf822500d325Fc3; // kev.eth, ~1.56M GTC address constant ANON_GNOSIS_SAFE = 0x93F80a67FdFDF9DaF1aee5276Db95c8761cc8561; // ~500k GTC // eventhorizoncommunity.eth, ~152k GTC @@ -50,7 +54,8 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { // Floors on the Timelock's real treasury holdings, guarded in setUp: the send tests draw on // the Timelock's genuine balances rather than manufactured ones, and need enough behind them - // to stay representative. At FORK_BLOCK the Timelock holds ~12.5M GTC and ~139 ETH. + // to stay representative. At the pre-deployment block the Timelock holds ~12.5M GTC and ~139 + // ETH. uint256 constant MIN_TIMELOCK_GTC_BALANCE = 1_000_000e18; uint256 constant MIN_TIMELOCK_ETH_BALANCE = 10 ether; @@ -97,14 +102,14 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { // Guards on the assumptions the suites make about the forked state. These revert rather // than assert: a failure here means the test setup no longer holds — not that a behavior - // under test regressed. Each message is aimed at a future developer bumping FORK_BLOCK. + // under test regressed. Each message is aimed at a future developer bumping a fork block. for (uint256 _index = 0; _index < delegates.length; _index += 1) { if (delegateWeights[delegates[_index]] == 0) { revert( string.concat( "Delegate ", vm.toString(delegates[_index]), - " has no voting weight at FORK_BLOCK; replace them in the electorate" + " has no voting weight at the pinned fork block; replace them in the electorate" ) ); } @@ -133,12 +138,12 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { } if (GTC_TOKEN.balanceOf(address(TIMELOCK)) < MIN_TIMELOCK_GTC_BALANCE) { revert( - "The Timelock holds too little GTC for representative treasury tests; revisit FORK_BLOCK" + "The Timelock holds too little GTC for representative treasury tests; revisit the fork block" ); } if (address(TIMELOCK).balance < MIN_TIMELOCK_ETH_BALANCE) { revert( - "The Timelock holds too little ETH for representative treasury tests; revisit FORK_BLOCK" + "The Timelock holds too little ETH for representative treasury tests; revisit the fork block" ); } } @@ -152,7 +157,11 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { // one-line delegations to these helpers. function _createMainnetFork() internal { - vm.createSelectFork("mainnet", FORK_BLOCK); + vm.createSelectFork("mainnet", GOVERNOR_PRE_DEPLOYMENT_BLOCK); + } + + function _createMainnetGovernorPostDeploymentFork() internal { + vm.createSelectFork("mainnet", GOVERNOR_POST_DEPLOYMENT_BLOCK); } // Deploys the new Governor onto the fork by running the real mainnet deploy script, exactly as @@ -165,10 +174,22 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { return _deployScript.governor(); } + // Binds the system under test to the Governor deployed on mainnet, exercising its actual + // production bytecode rather than a fresh deployment of the same source. + function _fetchDeployedGovernor() internal view returns (GitcoinGovernorWithGuardian) { + if (address(DEPLOYED_GOVERNOR).code.length == 0) { + revert( + "The deployed Governor has no code at GOVERNOR_POST_DEPLOYMENT_BLOCK; " + "repair its address or pinned deployment block" + ); + } + return DEPLOYED_GOVERNOR; + } + //---------------------------------- Scaffolding guards ----------------------------------// // Guards on the state the step helpers expect as they drive proposals through their // lifecycle. Like the setUp guards, these revert rather than assert: a failure means a test - // scaffolding assumption broke — most often a FORK_BLOCK bump reshaping the electorate — not + // scaffolding assumption broke — most often a fork-block bump reshaping the electorate — not // that a behavior under test regressed. Assertions are reserved for the claims test bodies // make about the system under test. @@ -188,7 +209,7 @@ abstract contract GitcoinGovernorUpgradeTestBase is Test { _proposalStateName(_actual), " (", _context, - "); a scaffolding assumption broke; check the setUp guards and FORK_BLOCK before " + "); a scaffolding assumption broke; check the setUp guards and pinned fork block before " "suspecting the behavior under test" ) );